From e0b0a0ab70447e6047b26d0c0a507bd019bb70cc Mon Sep 17 00:00:00 2001 From: Yinyin Liu Date: Tue, 28 May 2024 11:20:02 +0200 Subject: [PATCH 01/25] add Node Red folder --- NodeRed/dbus-csv-files/config.py | 51 + NodeRed/dbus-csv-files/convert.py | 119 + NodeRed/dbus-csv-files/data.py | 63 + NodeRed/dbus-csv-files/dbus-csv-files.py | 731 +++ NodeRed/dbus-csv-files/start.sh | 7 + NodeRed/dbus-fzsonick-48tl/config.py | 51 + NodeRed/dbus-fzsonick-48tl/convert.py | 119 + NodeRed/dbus-fzsonick-48tl/data.py | 97 + .../dbus-fzsonick-48tl/dbus-fzsonick-48tl.py | 980 +++ .../ext/velib_python/ve_utils.py | 276 + .../ext/velib_python/vedbus.py | 614 ++ NodeRed/dbus-fzsonick-48tl/start.sh | 7 + NodeRed/dvcc.py | 1287 ++++ NodeRed/flows.json | 5660 +++++++++++++++++ NodeRed/rc.local | 26 + NodeRed/settings-user.js | 31 + csharp/InnovEnergy.sln.DotSettings | 2 + 17 files changed, 10121 insertions(+) create mode 100644 NodeRed/dbus-csv-files/config.py create mode 100644 NodeRed/dbus-csv-files/convert.py create mode 100644 NodeRed/dbus-csv-files/data.py create mode 100755 NodeRed/dbus-csv-files/dbus-csv-files.py create mode 100755 NodeRed/dbus-csv-files/start.sh create mode 100644 NodeRed/dbus-fzsonick-48tl/config.py create mode 100644 NodeRed/dbus-fzsonick-48tl/convert.py create mode 100644 NodeRed/dbus-fzsonick-48tl/data.py create mode 100755 NodeRed/dbus-fzsonick-48tl/dbus-fzsonick-48tl.py create mode 100644 NodeRed/dbus-fzsonick-48tl/ext/velib_python/ve_utils.py create mode 100644 NodeRed/dbus-fzsonick-48tl/ext/velib_python/vedbus.py create mode 100755 NodeRed/dbus-fzsonick-48tl/start.sh create mode 100644 NodeRed/dvcc.py create mode 100644 NodeRed/flows.json create mode 100755 NodeRed/rc.local create mode 100644 NodeRed/settings-user.js diff --git a/NodeRed/dbus-csv-files/config.py b/NodeRed/dbus-csv-files/config.py new file mode 100644 index 000000000..59ce1b65b --- /dev/null +++ b/NodeRed/dbus-csv-files/config.py @@ -0,0 +1,51 @@ +import serial +import logging + +# dbus configuration + +FIRMWARE_VERSION = 1 # value returned by getValue (getText returns string value reported by battery) +HARDWARE_VERSION = 1 # value returned by getValue (getText returns string value reported by battery) + +CONNECTION = 'Modbus RTU' +PRODUCT_NAME = 'FZS 48TL200' +PRODUCT_ID = 0xB012 # assigned by victron +DEVICE_INSTANCE = 1 +SERVICE_NAME_PREFIX = 'com.victronenergy.battery.' + + +# driver configuration + +SOFTWARE_VERSION = '3.0.3' +UPDATE_INTERVAL = 2000 # milliseconds +#LOG_LEVEL = logging.INFO +LOG_LEVEL = logging.DEBUG + +# modbus configuration + +BASE_ADDRESS = 999 +#NO_OF_REGISTERS = 63 +NO_OF_REGISTERS = 64 +MAX_SLAVE_ADDRESS = 10 + + +# RS 485 configuration + +PARITY = serial.PARITY_ODD +TIMEOUT = 0.1 # seconds +BAUD_RATE = 115200 +BYTE_SIZE = 8 +STOP_BITS = 1 +MODE = 'rtu' + + +# battery configuration + +MAX_CHARGE_VOLTAGE = 58 +I_MAX_PER_STRING = 15 +NUM_OF_STRING_PER_BATTERY = 5 +AH_PER_STRING = 40 +V_MAX = 54.2 +R_STRING_MIN = 0.125 +R_STRING_MAX = 0.250 + + diff --git a/NodeRed/dbus-csv-files/convert.py b/NodeRed/dbus-csv-files/convert.py new file mode 100644 index 000000000..2696f1664 --- /dev/null +++ b/NodeRed/dbus-csv-files/convert.py @@ -0,0 +1,119 @@ +from collections import Iterable +from decimal import * + +import config as cfg +from data import LedState, BatteryStatus + +# trick the pycharm type-checker into thinking Callable is in scope, not used at runtime +# noinspection PyUnreachableCode +if False: + from typing import Callable + + +def read_bool(register, bit): + # type: (int, int) -> Callable[[BatteryStatus], bool] + + def get_value(status): + # type: (BatteryStatus) -> bool + value = status.modbus_data[register - cfg.BASE_ADDRESS] + return value & (1 << bit) > 0 + + return get_value + + +def read_float(register, scale_factor=1.0, offset=0.0, places=2): + # type: (int, float, float) -> Callable[[BatteryStatus], float] + + def get_value(status): + # type: (BatteryStatus) -> float + value = status.modbus_data[register - cfg.BASE_ADDRESS] + + if value >= 0x8000: # convert to signed int16 + value -= 0x10000 # fiamm stores their integers signed AND with sign-offset @#%^&! + + result = (value+offset)*scale_factor + return round(result,places) + + return get_value + + +def read_hex_string(register, count): + # type: (int, int) -> Callable[[BatteryStatus], str] + """ + reads count consecutive modbus registers from start_address, + and returns a hex representation of it: + e.g. for count=4: DEAD BEEF DEAD BEEF. + """ + start = register - cfg.BASE_ADDRESS + end = start + count + + def get_value(status): + # type: (BatteryStatus) -> str + return ' '.join(['{0:0>4X}'.format(x) for x in status.modbus_data[start:end]]) + + return get_value + + +def read_led_state(register, led): + # type: (int, int) -> Callable[[BatteryStatus], int] + + read_lo = read_bool(register, led * 2) + read_hi = read_bool(register, led * 2 + 1) + + def get_value(status): + # type: (BatteryStatus) -> int + + lo = read_lo(status) + hi = read_hi(status) + + if hi: + if lo: + return LedState.blinking_fast + else: + return LedState.blinking_slow + else: + if lo: + return LedState.on + else: + return LedState.off + + return get_value + + +def read_bitmap(register): + # type: (int) -> Callable[[BatteryStatus], bitmap] + + def get_value(status): + # type: (BatteryStatus) -> bitmap + value = status.modbus_data[register - cfg.BASE_ADDRESS] + return value + + return get_value + + +def append_unit(unit): + # type: (unicode) -> Callable[[unicode], unicode] + + def get_text(v): + # type: (unicode) -> unicode + return "{0}{1}".format(str(v), unit) + + return get_text + + +def mean(numbers): + # type: (Iterable[float] | Iterable[int]) -> float + return float("{:.2f}".format(float(sum(numbers)) / len(numbers))) + +def ssum(numbers): + # type: (Iterable[float] | Iterable[int]) -> float + return float("{:.2f}".format(float(sum(numbers)))) + + +def first(ts): + return next(t for t in ts) + +def return_in_list(ts): + return ts + + diff --git a/NodeRed/dbus-csv-files/data.py b/NodeRed/dbus-csv-files/data.py new file mode 100644 index 000000000..6aed587d1 --- /dev/null +++ b/NodeRed/dbus-csv-files/data.py @@ -0,0 +1,63 @@ +import config as cfg +from collections import Iterable + +# trick the pycharm type-checker into thinking Callable is in scope, not used at runtime +# noinspection PyUnreachableCode +if False: + from typing import Callable + + +class LedState(object): + """ + from page 6 of the '48TLxxx ModBus Protocol doc' + """ + off = 0 + on = 1 + blinking_slow = 2 + blinking_fast = 3 + + +class LedColor(object): + green = 0 + amber = 1 + blue = 2 + red = 3 + + + +class CsvSignal(object): + def __init__(self, name, get_value, get_text = None): + self.name = name + self.get_value = get_value if callable(get_value) else lambda _: get_value + self.get_text = get_text + + if get_text is None: + self.get_text = "" + +class Battery(object): + + """ Data record to hold hardware and firmware specs of the battery """ + + def __init__(self, slave_address, hardware_version, firmware_version, bms_version, ampere_hours): + # type: (int, str, str, str, int) -> None + self.slave_address = slave_address + self.hardware_version = hardware_version + self.firmware_version = firmware_version + self.bms_version = bms_version + self.ampere_hours = ampere_hours + + + def __str__(self): + return 'slave address = {0}\nhardware version = {1}\nfirmware version = {2}\nbms version = {3}\nampere hours = {4}'.format( + self.slave_address, self.hardware_version, self.firmware_version, self.bms_version, str(self.ampere_hours)) + + +class BatteryStatus(object): + """ + record holding the current status of a battery + """ + def __init__(self, battery, modbus_data): + # type: (Battery, list[int]) -> None + + self.battery = battery + self.modbus_data = modbus_data diff --git a/NodeRed/dbus-csv-files/dbus-csv-files.py b/NodeRed/dbus-csv-files/dbus-csv-files.py new file mode 100755 index 000000000..c1d4bd86f --- /dev/null +++ b/NodeRed/dbus-csv-files/dbus-csv-files.py @@ -0,0 +1,731 @@ +#! /usr/bin/python3 -u +import re +import sys +import logging +from gi.repository import GLib + +import config as cfg +import convert as c + +from pymodbus.register_read_message import ReadInputRegistersResponse +from pymodbus.client.sync import ModbusSerialClient as Modbus +from pymodbus.other_message import ReportSlaveIdRequest +from pymodbus.exceptions import ModbusException +from pymodbus.pdu import ExceptionResponse + +from dbus.mainloop.glib import DBusGMainLoop +from data import BatteryStatus, Battery, LedColor, CsvSignal, LedState + +from collections import Iterable +from os import path + +app_dir = path.dirname(path.realpath(__file__)) +sys.path.insert(1, path.join(app_dir, 'ext', 'velib_python')) + +#from vedbus import VeDbusService as DBus + +import time +import os +import csv + + +import requests +import hmac +import hashlib +import base64 +from datetime import datetime +import io + +class S3config: + def __init__(self): + self.bucket = "1-c0436b6a-d276-4cd8-9c44-1eae86cf5d0e" + self.region = "sos-ch-dk-2" + self.provider = "exo.io" + self.key = "EXOcc0e47a4c4d492888ff5a7f2" + self.secret = "79QG4unMh7MeVacMnXr5xGxEyAlWZDIdM-dg_nXFFr4" + self.content_type = "text/plain; charset=utf-8" + + @property + def host(self): + return f"{self.bucket}.{self.region}.{self.provider}" + + @property + def url(self): + return f"https://{self.host}" + + def create_put_request(self, s3_path, data): + headers = self._create_request("PUT", s3_path) + url = f"{self.url}/{s3_path}" + response = requests.put(url, headers=headers, data=data) + return response + + def _create_request(self, method, s3_path): + date = datetime.utcnow().strftime('%a, %d %b %Y %H:%M:%S GMT') + auth = self._create_authorization(method, self.bucket, s3_path, date, self.key, self.secret, self.content_type) + headers = { + "Host": self.host, + "Date": date, + "Authorization": auth, + "Content-Type": self.content_type + } + return headers + + @staticmethod + def _create_authorization(method, bucket, s3_path, date, s3_key, s3_secret, content_type="", md5_hash=""): + payload = f"{method}\n{md5_hash}\n{content_type}\n{date}\n/{bucket.strip('/')}/{s3_path.strip('/')}" + signature = base64.b64encode( + hmac.new(s3_secret.encode(), payload.encode(), hashlib.sha1).digest() + ).decode() + return f"AWS {s3_key}:{signature}" + +def read_csv_as_string(file_path): + """ + Reads a CSV file from the given path and returns its content as a single string. + """ + try: + with open(file_path, 'r', encoding='utf-8') as file: + return file.read() + except FileNotFoundError: + print(f"Error: The file {file_path} does not exist.") + return None + except IOError as e: + print(f"IO error occurred: {str(e)}") + return None + +CSV_DIR = "/data/csv_files_service/" +#CSV_DIR = "csv_files/" + +# Define the path to the file containing the installation name +INSTALLATION_NAME_FILE = '/data/innovenergy/openvpn/installation-name' + +# trick the pycharm type-checker into thinking Callable is in scope, not used at runtime +# noinspection PyUnreachableCode +if False: + from typing import Callable + +def interpret_limb_bitmap(bitmap_value): + # The bit for string 1 also monitors all 5 strings: 0000 0000 means All 5 strings activated. 0000 0001 means string 1 disabled. + string1_disabled = int((bitmap_value & 0b00001) != 0) + string2_disabled = int((bitmap_value & 0b00010) != 0) + string3_disabled = int((bitmap_value & 0b00100) != 0) + string4_disabled = int((bitmap_value & 0b01000) != 0) + string5_disabled = int((bitmap_value & 0b10000) != 0) + n_limb_strings = string1_disabled+string2_disabled+string3_disabled+string4_disabled+string5_disabled + return n_limb_strings + +def create_csv_signals(firmware_version): + def read_power(status): + return int(read_current(status) * read_voltage(status)) + + read_voltage = c.read_float(register=999, scale_factor=0.01, offset=0, places=2) + read_current = c.read_float(register=1000, scale_factor=0.01, offset=-10000, places=2) + + read_limb_bitmap = c.read_bitmap(1059) + + def string1_disabled(status): + bitmap_value = read_limb_bitmap(status) + return int((bitmap_value & 0b00001) != 0) + + def string2_disabled(status): + bitmap_value = read_limb_bitmap(status) + return int((bitmap_value & 0b00010) != 0) + + def string3_disabled(status): + bitmap_value = read_limb_bitmap(status) + return int((bitmap_value & 0b00100) != 0) + + def string4_disabled(status): + bitmap_value = read_limb_bitmap(status) + return int((bitmap_value & 0b01000) != 0) + + def string5_disabled(status): + bitmap_value = read_limb_bitmap(status) + return int((bitmap_value & 0b10000) != 0) + + + def limp_strings_value(status): + return interpret_limb_bitmap(read_limb_bitmap(status)) + + def calc_power_limit_imposed_by_voltage_limit(v, i, v_limit, r_int): + # type: (float, float, float, float) -> float + + dv = v_limit - v + di = dv / r_int + p_limit = v_limit * (i + di) + + return p_limit + + def calc_power_limit_imposed_by_current_limit(v, i, i_limit, r_int): + # type: (float, float, float, float) -> float + + di = i_limit - i + dv = di * r_int + p_limit = i_limit * (v + dv) + + return p_limit + + def calc_max_charge_power(status): + # type: (BatteryStatus) -> int + n_strings = cfg.NUM_OF_STRING_PER_BATTERY-limp_strings_value(status) + i_max = n_strings * cfg.I_MAX_PER_STRING + v_max = cfg.V_MAX + r_int_min = cfg.R_STRING_MIN / n_strings + r_int_max = cfg.R_STRING_MAX / n_strings + + v = read_voltage(status) + i = read_current(status) + + p_limits = [ + calc_power_limit_imposed_by_voltage_limit(v, i, v_max,r_int_min), + calc_power_limit_imposed_by_voltage_limit(v, i, v_max, r_int_max), + calc_power_limit_imposed_by_current_limit(v, i, i_max, r_int_min), + calc_power_limit_imposed_by_current_limit(v, i, i_max, r_int_max), + ] + + p_limit = min(p_limits) # p_limit is normally positive here (signed) + p_limit = max(p_limit, 0) # charge power must not become negative + + return int(p_limit) + + def calc_max_discharge_power(status): + n_strings = cfg.NUM_OF_STRING_PER_BATTERY-limp_strings_value(status) + max_discharge_current = n_strings*cfg.I_MAX_PER_STRING + return int(max_discharge_current*read_voltage(status)) + + def return_led_state_blue(status): + led_state = c.read_led_state(register=1004, led=LedColor.blue)(status) + if led_state == LedState.blinking_fast or led_state == LedState.blinking_slow: + return "Blinking" + elif led_state == LedState.on: + return "On" + elif led_state == LedState.off: + return "Off" + + return "Unknown" + + def return_led_state_red(status): + led_state = c.read_led_state(register=1004, led=LedColor.red)(status) + if led_state == LedState.blinking_fast or led_state == LedState.blinking_slow: + return "Blinking" + elif led_state == LedState.on: + return "On" + elif led_state == LedState.off: + return "Off" + + return "Unknown" + + def return_led_state_green(status): + led_state = c.read_led_state(register=1004, led=LedColor.green)(status) + if led_state == LedState.blinking_fast or led_state == LedState.blinking_slow: + return "Blinking" + elif led_state == LedState.on: + return "On" + elif led_state == LedState.off: + return "Off" + + return "Unknown" + + def return_led_state_amber(status): + led_state = c.read_led_state(register=1004, led=LedColor.amber)(status) + if led_state == LedState.blinking_fast or led_state == LedState.blinking_slow: + return "Blinking" + elif led_state == LedState.on: + return "On" + elif led_state == LedState.off: + return "Off" + + return "Unknown" + + total_current = c.read_float(register=1062, scale_factor=0.01, offset=-10000, places=1) + + def read_total_current(status): + return total_current(status) + + def read_heating_current(status): + return total_current(status) - read_current(status) + + def read_heating_power(status): + return read_voltage(status) * read_heating_current(status) + + soc_ah = c.read_float(register=1002, scale_factor=0.1, offset=-10000, places=1) + + def read_soc_ah(status): + return soc_ah(status) + + def hex_string_to_ascii(hex_string): + # Ensure the hex_string is correctly formatted without spaces + hex_string = hex_string.replace(" ", "") + # Convert every two characters (a byte) in the hex string to ASCII + ascii_string = ''.join([chr(int(hex_string[i:i+2], 16)) for i in range(0, len(hex_string), 2)]) + return ascii_string + + battery_status_reader = c.read_hex_string(1060,2) + + def read_eoc_reached(status): + battery_status_string = battery_status_reader(status) + #if hex_string_to_ascii(battery_status_string) == "EOC_": + #return True + #return False + return hex_string_to_ascii(battery_status_string) == "EOC_" + + def read_serial_number(status): + + serial_regs = [1055, 1056, 1057, 1058] + serial_parts = [] + + for reg in serial_regs: + # reading each register as a single hex value + hex_value_fun = c.read_hex_string(reg, 1) + hex_value = hex_value_fun(status) + + # append without spaces and leading zeros stripped if any + serial_parts.append(hex_value.replace(' ', '')) + + # concatenate all parts to form the full serial number + serial_number = ''.join(serial_parts).rstrip('0') + + return serial_number + + return [ + + CsvSignal('/Battery/Devices/FwVersion', firmware_version), + CsvSignal('/Battery/Devices/Dc/Power', read_power, 'W'), + CsvSignal('/Battery/Devices/Dc/Voltage', read_voltage, 'V'), + CsvSignal('/Battery/Devices/Soc', c.read_float(register=1053, scale_factor=0.1, offset=0, places=1), '%'), + CsvSignal('/Battery/Devices/Temperatures/Cells/Average', c.read_float(register=1003, scale_factor=0.1, offset=-400, places=1), 'C'), + + CsvSignal('/Battery/Devices/Dc/Current', read_current, 'A'), + CsvSignal('/Battery/Devices/BusCurrent', read_total_current, 'A'), + CsvSignal('/Battery/Devices/CellsCurrent', read_current, 'A'), + CsvSignal('/Battery/Devices/HeatingCurrent', read_heating_current, 'A'), + CsvSignal('/Battery/Devices/HeatingPower', read_heating_power, 'W'), + CsvSignal('/Battery/Devices/SOCAh', read_soc_ah), + + CsvSignal('/Battery/Devices/Leds/Blue', return_led_state_blue), + CsvSignal('/Battery/Devices/Leds/Red', return_led_state_red), + CsvSignal('/Battery/Devices/Leds/Green', return_led_state_green), + CsvSignal('/Battery/Devices/Leds/Amber', return_led_state_amber), + + CsvSignal('/Battery/Devices/BatteryStrings/String1Active', string1_disabled), + CsvSignal('/Battery/Devices/BatteryStrings/String2Active', string2_disabled), + CsvSignal('/Battery/Devices/BatteryStrings/String3Active', string3_disabled), + CsvSignal('/Battery/Devices/BatteryStrings/String4Active', string4_disabled), + CsvSignal('/Battery/Devices/BatteryStrings/String5Active', string5_disabled), + + CsvSignal('/Battery/Devices/IoStatus/ConnectedToDcBus', c.read_bool(register=1013, bit=0)), + CsvSignal('/Battery/Devices/IoStatus/AlarmOutActive', c.read_bool(register=1013, bit=1)), + CsvSignal('/Battery/Devices/IoStatus/InternalFanActive', c.read_bool(register=1013, bit=2)), + CsvSignal('/Battery/Devices/IoStatus/VoltMeasurementAllowed', c.read_bool(register=1013, bit=3)), + CsvSignal('/Battery/Devices/IoStatus/AuxRelayBus', c.read_bool(register=1013, bit=4)), + CsvSignal('/Battery/Devices/IoStatus/RemoteStateActive', c.read_bool(register=1013, bit=5)), + CsvSignal('/Battery/Devices/IoStatus/RiscActive', c.read_bool(register=1013, bit=6)), + + + CsvSignal('/Battery/Devices/Eoc', read_eoc_reached), + CsvSignal('/Battery/Devices/SerialNumber', read_serial_number), + CsvSignal('/Battery/Devices/TimeSinceTOC', c.read_float(register=1052)), + CsvSignal('/Battery/Devices/MaxChargePower', calc_max_charge_power), + CsvSignal('/Battery/Devices/MaxDischargePower', calc_max_discharge_power), + + # Warnings + CsvSignal('/Battery/Devices/WarningFlags/TaM1', c.read_bool(register=1005, bit=1)), + CsvSignal('/Battery/Devices/WarningFlags/TbM1', c.read_bool(register=1005, bit=4)), + CsvSignal('/Battery/Devices/WarningFlags/VBm1', c.read_bool(register=1005, bit=6)), + CsvSignal('/Battery/Devices/WarningFlags/VBM1', c.read_bool(register=1005, bit=8)), + CsvSignal('/Battery/Devices/WarningFlags/IDM1', c.read_bool(register=1005, bit=10)), + CsvSignal('/Battery/Devices/WarningFlags/vsm1', c.read_bool(register=1005, bit=22)), + CsvSignal('/Battery/Devices/WarningFlags/vsM1', c.read_bool(register=1005, bit=24)), + CsvSignal('/Battery/Devices/WarningFlags/iCM1', c.read_bool(register=1005, bit=26)), + CsvSignal('/Battery/Devices/WarningFlags/iDM1', c.read_bool(register=1005, bit=28)), + CsvSignal('/Battery/Devices/WarningFlags/MID1', c.read_bool(register=1005, bit=30)), + CsvSignal('/Battery/Devices/WarningFlags/BLPW', c.read_bool(register=1005, bit=32)), + CsvSignal('/Battery/Devices/WarningFlags/CCBF', c.read_bool(register=1005, bit=33)), + CsvSignal('/Battery/Devices/WarningFlags/Ah_W', c.read_bool(register=1005, bit=35)), + CsvSignal('/Battery/Devices/WarningFlags/MPMM', c.read_bool(register=1005, bit=38)), + CsvSignal('/Battery/Devices/WarningFlags/TCdi', c.read_bool(register=1005, bit=40)), + CsvSignal('/Battery/Devices/WarningFlags/LMPW', c.read_bool(register=1005, bit=44)), + CsvSignal('/Battery/Devices/WarningFlags/TOCW', c.read_bool(register=1005, bit=47)), + CsvSignal('/Battery/Devices/WarningFlags/BUSL', c.read_bool(register=1005, bit=49)), + + # Alarms + CsvSignal('/Battery/Devices/AlarmFlags/Tam', c.read_bool(register=1005, bit=0)), + CsvSignal('/Battery/Devices/AlarmFlags/TaM2', c.read_bool(register=1005, bit=2)), + CsvSignal('/Battery/Devices/AlarmFlags/Tbm', c.read_bool(register=1005, bit=3)), + CsvSignal('/Battery/Devices/AlarmFlags/TbM2', c.read_bool(register=1005, bit=5)), + CsvSignal('/Battery/Devices/AlarmFlags/VBm2', c.read_bool(register=1005, bit=7)), + CsvSignal('/Battery/Devices/AlarmFlags/VBM2', c.read_bool(register=1005, bit=9)), + CsvSignal('/Battery/Devices/AlarmFlags/IDM2', c.read_bool(register=1005, bit=11)), + CsvSignal('/Battery/Devices/AlarmFlags/ISOB', c.read_bool(register=1005, bit=12)), + CsvSignal('/Battery/Devices/AlarmFlags/MSWE', c.read_bool(register=1005, bit=13)), + CsvSignal('/Battery/Devices/AlarmFlags/FUSE', c.read_bool(register=1005, bit=14)), + CsvSignal('/Battery/Devices/AlarmFlags/HTRE', c.read_bool(register=1005, bit=15)), + CsvSignal('/Battery/Devices/AlarmFlags/TCPE', c.read_bool(register=1005, bit=16)), + CsvSignal('/Battery/Devices/AlarmFlags/STRE', c.read_bool(register=1005, bit=17)), + CsvSignal('/Battery/Devices/AlarmFlags/CME', c.read_bool(register=1005, bit=18)), + CsvSignal('/Battery/Devices/AlarmFlags/HWFL', c.read_bool(register=1005, bit=19)), + CsvSignal('/Battery/Devices/AlarmFlags/HWEM', c.read_bool(register=1005, bit=20)), + CsvSignal('/Battery/Devices/AlarmFlags/ThM', c.read_bool(register=1005, bit=21)), + CsvSignal('/Battery/Devices/AlarmFlags/vsm2', c.read_bool(register=1005, bit=23)), + CsvSignal('/Battery/Devices/AlarmFlags/vsM2', c.read_bool(register=1005, bit=25)), + CsvSignal('/Battery/Devices/AlarmFlags/iCM2', c.read_bool(register=1005, bit=27)), + CsvSignal('/Battery/Devices/AlarmFlags/iDM2', c.read_bool(register=1005, bit=29)), + CsvSignal('/Battery/Devices/AlarmFlags/MID2', c.read_bool(register=1005, bit=31)), + CsvSignal('/Battery/Devices/AlarmFlags/HTFS', c.read_bool(register=1005, bit=42)), + CsvSignal('/Battery/Devices/AlarmFlags/DATA', c.read_bool(register=1005, bit=43)), + CsvSignal('/Battery/Devices/AlarmFlags/LMPA', c.read_bool(register=1005, bit=45)), + CsvSignal('/Battery/Devices/AlarmFlags/HEBT', c.read_bool(register=1005, bit=46)), + CsvSignal('/Battery/Devices/AlarmFlags/CURM', c.read_bool(register=1005, bit=48)), + + ] + +def init_modbus(tty): + # type: (str) -> Modbus + + logging.debug('initializing Modbus') + + return Modbus( + port='/dev/' + tty, + method=cfg.MODE, + baudrate=cfg.BAUD_RATE, + stopbits=cfg.STOP_BITS, + bytesize=cfg.BYTE_SIZE, + timeout=cfg.TIMEOUT, + parity=cfg.PARITY) + +def read_modbus_registers(modbus, slave_address, base_address=cfg.BASE_ADDRESS, count=cfg.NO_OF_REGISTERS): + # type: (Modbus, int) -> ReadInputRegistersResponse + + logging.debug('requesting modbus registers {0}-{1}'.format(base_address, base_address + count)) + + return modbus.read_input_registers( + address=base_address, + count=count, + unit=slave_address) + +def read_firmware_version(modbus, slave_address): + # type: (Modbus, int) -> str + + logging.debug('reading firmware version') + + try: + modbus.connect() + + response = read_modbus_registers(modbus, slave_address, base_address=1054, count=1) + register = response.registers[0] + + return '{0:0>4X}'.format(register) + + finally: + modbus.close() # close in any case + +def init_main_loop(): + # type: () -> DBusGMainLoop + logging.debug('initializing DBusGMainLoop Loop') + DBusGMainLoop(set_as_default=True) + return GLib.MainLoop() + +def report_slave_id(modbus, slave_address): + # type: (Modbus, int) -> str + + slave = str(slave_address) + + logging.debug('requesting slave id from node ' + slave) + + try: + + modbus.connect() + + request = ReportSlaveIdRequest(unit=slave_address) + response = modbus.execute(request) + + if response is ExceptionResponse or issubclass(type(response), ModbusException): + raise Exception('failed to get slave id from ' + slave + ' : ' + str(response)) + + return response.identifier + + finally: + modbus.close() + +def parse_slave_id(modbus, slave_address): + # type: (Modbus, int) -> (str, str, int) + + slave_id = report_slave_id(modbus, slave_address) + + sid = re.sub(b'[^\x20-\x7E]', b'', slave_id) # remove weird special chars + + match = re.match('(?P48TL(?P\d+)) *(?P.*)', sid.decode('ascii')) + + if match is None: + raise Exception('no known battery found') + + return match.group('hw'), match.group('bms'), int(match.group('ah')) + + +def identify_battery(modbus, slave_address): + # type: (Modbus, int) -> Battery + + logging.info('identifying battery...') + + hardware_version, bms_version, ampere_hours = parse_slave_id(modbus, slave_address) + firmware_version = read_firmware_version(modbus, slave_address) + + specs = Battery( + slave_address=slave_address, + hardware_version=hardware_version, + firmware_version=firmware_version, + bms_version=bms_version, + ampere_hours=ampere_hours) + + logging.info('battery identified:\n{0}'.format(str(specs))) + + return specs + +def identify_batteries(modbus): + # type: (Modbus) -> list[Battery] + + def _identify_batteries(): + address_range = range(1, cfg.MAX_SLAVE_ADDRESS + 1) + + for slave_address in address_range: + try: + yield identify_battery(modbus, slave_address) + except Exception as e: + logging.info('failed to identify battery at {0} : {1}'.format(str(slave_address), str(e))) + + return list(_identify_batteries()) # force that lazy iterable! + +def read_modbus_registers(modbus, slave_address, base_address=cfg.BASE_ADDRESS, count=cfg.NO_OF_REGISTERS): + # type: (Modbus, int) -> ReadInputRegistersResponse + + logging.debug('requesting modbus registers {0}-{1}'.format(base_address, base_address + count)) + + return modbus.read_input_registers( + address=base_address, + count=count, + unit=slave_address) + +def read_battery_status(modbus, battery): + # type: (Modbus, Battery) -> BatteryStatus + """ + Read the modbus registers containing the battery's status info. + """ + + logging.debug('reading battery status') + + try: + modbus.connect() + data = read_modbus_registers(modbus, battery.slave_address) + return BatteryStatus(battery, data.registers) + + finally: + modbus.close() # close in any case + +def get_installation_name(file_path): + with open(file_path, 'r') as file: + return file.read().strip() + +def manage_csv_files(directory_path, max_files=20): + csv_files = [f for f in os.listdir(directory_path)] + 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: + file_to_delete = os.path.join(directory_path, csv_files.pop(0)) + os.remove(file_to_delete) + +def serialize_for_csv(value): + if isinstance(value, (dict, list, tuple)): + return json.dumps(value, ensure_ascii=False) + return str(value) + +def insert_id(path, id_number): + parts = path.split("/") + + insert_position = parts.index("Devices") + 1 + + parts.insert(insert_position, str(id_number)) + + return "/".join(parts) + +def create_csv_files(signals, statuses, node_numbers): + timestamp = int(time.time()) + if timestamp % 2 != 0: + timestamp -= 1 + # Create CSV directory if it doesn't exist + if not os.path.exists(CSV_DIR): + os.makedirs(CSV_DIR) + + #installation_name = get_installation_name(INSTALLATION_NAME_FILE) + csv_filename = f"{timestamp}.csv" + csv_path = os.path.join(CSV_DIR, csv_filename) + + # Append values to the CSV file + with open(csv_path, 'a', newline='') as csvfile: + csv_writer = csv.writer(csvfile, delimiter=';') + + # Add a special row for the nodes configuration + nodes_config_path = "/Config/Devices/BatteryNodes" + nodes_list = ",".join(str(node) for node in node_numbers) + config_row = [nodes_config_path, nodes_list, ""] + csv_writer.writerow(config_row) + + # Iterate over each node and signal to create rows in the new format + for i, node in enumerate(node_numbers): + for s in signals: + signal_name = insert_id(s.name, i+1) + #value = serialize_for_csv(s.get_value(statuses[i])) + value = s.get_value(statuses[i]) + row_values = [signal_name, value, s.get_text] + csv_writer.writerow(row_values) + + # Manage CSV files, keep a limited number of files + + # Create the CSV as a string + csv_data = read_csv_as_string(csv_path) + + + # Create an S3config instance + s3_config = S3config() + response = s3_config.create_put_request(csv_filename, csv_data) + + if response.status_code == 200: + os.remove(csv_path) + print("Success") + else: + failed_dir = os.path.join(CSV_DIR, "failed") + if not os.path.exists(failed_dir): + os.makedirs(failed_dir) + failed_path = os.path.join(failed_dir, csv_filename) + os.rename(csv_path, failed_path) + print("Uploading failed") + manage_csv_files(failed_dir, 10) + + + manage_csv_files(CSV_DIR) + +def update(modbus, batteries, csv_signals): + # type: (Modbus, Iterable[Battery], DBus, Iterable[Signal]) -> bool + + """ + Main update function + + 1. requests status record each battery via modbus, + 2. parses the data using Signal.get_value + 3. aggregates the data from all batteries into one datum using Signal.aggregate + 4. publishes the data on the dbus + """ + + logging.debug('starting update cycle') + + statuses = [read_battery_status(modbus, battery) for battery in batteries] + node_numbers = [battery.slave_address for battery in batteries] + + create_csv_files(csv_signals, statuses, node_numbers) + + logging.debug('finished update cycle\n') + return True + +def print_usage(): + print ('Usage: ' + __file__ + ' ') + print ('Example: ' + __file__ + ' ttyUSB0') + + +def parse_cmdline_args(argv): + # type: (list[str]) -> str + + if len(argv) == 0: + logging.info('missing command line argument for tty device') + print_usage() + sys.exit(1) + + return argv[0] + + +alive = True # global alive flag, watchdog_task clears it, update_task sets it + +def create_update_task(modbus, batteries, csv_signals, main_loop): + # type: (Modbus, DBus, Iterable[Battery], Iterable[Signal], DBusGMainLoop) -> Callable[[],bool] + """ + Creates an update task which runs the main update function + and resets the alive flag + """ + + def update_task(): + # type: () -> bool + + global alive + + alive = update(modbus, batteries, csv_signals) + + if not alive: + logging.info('update_task: quitting main loop because of error') + main_loop.quit() + + return alive + + return update_task + +def create_watchdog_task(main_loop): + # type: (DBusGMainLoop) -> Callable[[],bool] + """ + Creates a Watchdog task that monitors the alive flag. + The watchdog kills the main loop if the alive flag is not periodically reset by the update task. + Who watches the watchdog? + """ + def watchdog_task(): + # type: () -> bool + + global alive + + if alive: + logging.debug('watchdog_task: update_task is alive') + alive = False + return True + else: + logging.info('watchdog_task: killing main loop because update_task is no longer alive') + main_loop.quit() + return False + + return watchdog_task + + +def main(argv): + # type: (list[str]) -> () + print("PAME") + logging.basicConfig(level=cfg.LOG_LEVEL) + logging.info('starting ' + __file__) + + tty = parse_cmdline_args(argv) + modbus = init_modbus(tty) + + batteries = identify_batteries(modbus) + + n = len(batteries) + + logging.info('found ' + str(n) + (' battery' if n == 1 else ' batteries')) + + if n <= 0: + sys.exit(2) + + bat = c.first(batteries) # report hw and fw version of first battery found + + csv_signals = create_csv_signals(bat.firmware_version) + + main_loop = init_main_loop() # must run before init_dbus because gobject does some global magic + + # we do not use dbus this time. we only want modbus + update_task = create_update_task(modbus, batteries, csv_signals, main_loop) + watchdog_task = create_watchdog_task(main_loop) + + GLib.timeout_add(cfg.UPDATE_INTERVAL * 2, watchdog_task) # add watchdog first + GLib.timeout_add(cfg.UPDATE_INTERVAL, update_task) # call update once every update_interval + + logging.info('starting GLib.MainLoop') + main_loop.run() + logging.info('GLib.MainLoop was shut down') + + sys.exit(0xFF) # reaches this only on error + + +if __name__ == "__main__": + main(sys.argv[1:]) diff --git a/NodeRed/dbus-csv-files/start.sh b/NodeRed/dbus-csv-files/start.sh new file mode 100755 index 000000000..14a3b0390 --- /dev/null +++ b/NodeRed/dbus-csv-files/start.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +. /opt/victronenergy/serial-starter/run-service.sh + +app=/opt/victronenergy/dbus-csv-files/dbus-csv-files.py +args="$tty" +start $args diff --git a/NodeRed/dbus-fzsonick-48tl/config.py b/NodeRed/dbus-fzsonick-48tl/config.py new file mode 100644 index 000000000..59ce1b65b --- /dev/null +++ b/NodeRed/dbus-fzsonick-48tl/config.py @@ -0,0 +1,51 @@ +import serial +import logging + +# dbus configuration + +FIRMWARE_VERSION = 1 # value returned by getValue (getText returns string value reported by battery) +HARDWARE_VERSION = 1 # value returned by getValue (getText returns string value reported by battery) + +CONNECTION = 'Modbus RTU' +PRODUCT_NAME = 'FZS 48TL200' +PRODUCT_ID = 0xB012 # assigned by victron +DEVICE_INSTANCE = 1 +SERVICE_NAME_PREFIX = 'com.victronenergy.battery.' + + +# driver configuration + +SOFTWARE_VERSION = '3.0.3' +UPDATE_INTERVAL = 2000 # milliseconds +#LOG_LEVEL = logging.INFO +LOG_LEVEL = logging.DEBUG + +# modbus configuration + +BASE_ADDRESS = 999 +#NO_OF_REGISTERS = 63 +NO_OF_REGISTERS = 64 +MAX_SLAVE_ADDRESS = 10 + + +# RS 485 configuration + +PARITY = serial.PARITY_ODD +TIMEOUT = 0.1 # seconds +BAUD_RATE = 115200 +BYTE_SIZE = 8 +STOP_BITS = 1 +MODE = 'rtu' + + +# battery configuration + +MAX_CHARGE_VOLTAGE = 58 +I_MAX_PER_STRING = 15 +NUM_OF_STRING_PER_BATTERY = 5 +AH_PER_STRING = 40 +V_MAX = 54.2 +R_STRING_MIN = 0.125 +R_STRING_MAX = 0.250 + + diff --git a/NodeRed/dbus-fzsonick-48tl/convert.py b/NodeRed/dbus-fzsonick-48tl/convert.py new file mode 100644 index 000000000..2696f1664 --- /dev/null +++ b/NodeRed/dbus-fzsonick-48tl/convert.py @@ -0,0 +1,119 @@ +from collections import Iterable +from decimal import * + +import config as cfg +from data import LedState, BatteryStatus + +# trick the pycharm type-checker into thinking Callable is in scope, not used at runtime +# noinspection PyUnreachableCode +if False: + from typing import Callable + + +def read_bool(register, bit): + # type: (int, int) -> Callable[[BatteryStatus], bool] + + def get_value(status): + # type: (BatteryStatus) -> bool + value = status.modbus_data[register - cfg.BASE_ADDRESS] + return value & (1 << bit) > 0 + + return get_value + + +def read_float(register, scale_factor=1.0, offset=0.0, places=2): + # type: (int, float, float) -> Callable[[BatteryStatus], float] + + def get_value(status): + # type: (BatteryStatus) -> float + value = status.modbus_data[register - cfg.BASE_ADDRESS] + + if value >= 0x8000: # convert to signed int16 + value -= 0x10000 # fiamm stores their integers signed AND with sign-offset @#%^&! + + result = (value+offset)*scale_factor + return round(result,places) + + return get_value + + +def read_hex_string(register, count): + # type: (int, int) -> Callable[[BatteryStatus], str] + """ + reads count consecutive modbus registers from start_address, + and returns a hex representation of it: + e.g. for count=4: DEAD BEEF DEAD BEEF. + """ + start = register - cfg.BASE_ADDRESS + end = start + count + + def get_value(status): + # type: (BatteryStatus) -> str + return ' '.join(['{0:0>4X}'.format(x) for x in status.modbus_data[start:end]]) + + return get_value + + +def read_led_state(register, led): + # type: (int, int) -> Callable[[BatteryStatus], int] + + read_lo = read_bool(register, led * 2) + read_hi = read_bool(register, led * 2 + 1) + + def get_value(status): + # type: (BatteryStatus) -> int + + lo = read_lo(status) + hi = read_hi(status) + + if hi: + if lo: + return LedState.blinking_fast + else: + return LedState.blinking_slow + else: + if lo: + return LedState.on + else: + return LedState.off + + return get_value + + +def read_bitmap(register): + # type: (int) -> Callable[[BatteryStatus], bitmap] + + def get_value(status): + # type: (BatteryStatus) -> bitmap + value = status.modbus_data[register - cfg.BASE_ADDRESS] + return value + + return get_value + + +def append_unit(unit): + # type: (unicode) -> Callable[[unicode], unicode] + + def get_text(v): + # type: (unicode) -> unicode + return "{0}{1}".format(str(v), unit) + + return get_text + + +def mean(numbers): + # type: (Iterable[float] | Iterable[int]) -> float + return float("{:.2f}".format(float(sum(numbers)) / len(numbers))) + +def ssum(numbers): + # type: (Iterable[float] | Iterable[int]) -> float + return float("{:.2f}".format(float(sum(numbers)))) + + +def first(ts): + return next(t for t in ts) + +def return_in_list(ts): + return ts + + diff --git a/NodeRed/dbus-fzsonick-48tl/data.py b/NodeRed/dbus-fzsonick-48tl/data.py new file mode 100644 index 000000000..05cdd1aa7 --- /dev/null +++ b/NodeRed/dbus-fzsonick-48tl/data.py @@ -0,0 +1,97 @@ +import config as cfg +from collections import Iterable + +# trick the pycharm type-checker into thinking Callable is in scope, not used at runtime +# noinspection PyUnreachableCode +if False: + from typing import Callable + + +class LedState(object): + """ + from page 6 of the '48TLxxx ModBus Protocol doc' + """ + off = 0 + on = 1 + blinking_slow = 2 + blinking_fast = 3 + + +class LedColor(object): + green = 0 + amber = 1 + blue = 2 + red = 3 + + + +class CsvSignal(object): + def __init__(self, name, get_value, get_text = None): + self.name = name + self.get_value = get_value if callable(get_value) else lambda _: get_value + self.get_text = get_text + + if get_text is None: + self.get_text = "" + +class Signal(object): + + def __init__(self, dbus_path, aggregate, get_value, get_text=None): + # type: (str, Callable[[Iterable[object]],object], Callable[[BatteryStatus],object] | object, Callable[[object],unicode] | object)->None + """ + A Signal holds all information necessary for the handling of a + certain datum (e.g. voltage) published by the battery. + + :param dbus_path: str + object_path on DBus where the datum needs to be published + + :param aggregate: Iterable[object] -> object + function that combines the values of multiple batteries into one. + e.g. sum for currents, or mean for voltages + + :param get_value: (BatteryStatus) -> object + function to extract the datum from the modbus record, + alternatively: a constant + + :param get_text: (object) -> unicode [optional] + function to render datum to text, needed by DBus + alternatively: a constant + """ + + self.dbus_path = dbus_path + self.aggregate = aggregate + self.get_value = get_value if callable(get_value) else lambda _: get_value + self.get_text = get_text if callable(get_text) else lambda _: str(get_text) + + # if no 'get_text' provided use 'default_text' if available, otherwise str() + if get_text is None: + self.get_text = str + + +class Battery(object): + + """ Data record to hold hardware and firmware specs of the battery """ + + def __init__(self, slave_address, hardware_version, firmware_version, bms_version, ampere_hours): + # type: (int, str, str, str, int) -> None + self.slave_address = slave_address + self.hardware_version = hardware_version + self.firmware_version = firmware_version + self.bms_version = bms_version + self.ampere_hours = ampere_hours + + + def __str__(self): + return 'slave address = {0}\nhardware version = {1}\nfirmware version = {2}\nbms version = {3}\nampere hours = {4}'.format( + self.slave_address, self.hardware_version, self.firmware_version, self.bms_version, str(self.ampere_hours)) + + +class BatteryStatus(object): + """ + record holding the current status of a battery + """ + def __init__(self, battery, modbus_data): + # type: (Battery, list[int]) -> None + + self.battery = battery + self.modbus_data = modbus_data diff --git a/NodeRed/dbus-fzsonick-48tl/dbus-fzsonick-48tl.py b/NodeRed/dbus-fzsonick-48tl/dbus-fzsonick-48tl.py new file mode 100755 index 000000000..99c01de4c --- /dev/null +++ b/NodeRed/dbus-fzsonick-48tl/dbus-fzsonick-48tl.py @@ -0,0 +1,980 @@ +#!/usr/bin/python3 -u +# coding=utf-8 + +import re +import sys +import logging +from gi.repository import GLib + +import config as cfg +import convert as c + +from pymodbus.register_read_message import ReadInputRegistersResponse +from pymodbus.client.sync import ModbusSerialClient as Modbus +from pymodbus.other_message import ReportSlaveIdRequest +from pymodbus.exceptions import ModbusException +from pymodbus.pdu import ExceptionResponse + +from dbus.mainloop.glib import DBusGMainLoop +from data import BatteryStatus, Signal, Battery, LedColor, CsvSignal, LedState + +from collections import Iterable +from os import path + +app_dir = path.dirname(path.realpath(__file__)) +sys.path.insert(1, path.join(app_dir, 'ext', 'velib_python')) + +from vedbus import VeDbusService as DBus + +import time +import os +import csv + + +import requests +import hmac +import hashlib +import base64 +from datetime import datetime +import io + +class S3config: + def __init__(self): + self.bucket = "1-c0436b6a-d276-4cd8-9c44-1eae86cf5d0e" + self.region = "sos-ch-dk-2" + self.provider = "exo.io" + self.key = "EXOcc0e47a4c4d492888ff5a7f2" + self.secret = "79QG4unMh7MeVacMnXr5xGxEyAlWZDIdM-dg_nXFFr4" + self.content_type = "text/plain; charset=utf-8" + + @property + def host(self): + return f"{self.bucket}.{self.region}.{self.provider}" + + @property + def url(self): + return f"https://{self.host}" + + def create_put_request(self, s3_path, data): + headers = self._create_request("PUT", s3_path) + url = f"{self.url}/{s3_path}" + response = requests.put(url, headers=headers, data=data) + return response + + def _create_request(self, method, s3_path): + date = datetime.utcnow().strftime('%a, %d %b %Y %H:%M:%S GMT') + auth = self._create_authorization(method, self.bucket, s3_path, date, self.key, self.secret, self.content_type) + headers = { + "Host": self.host, + "Date": date, + "Authorization": auth, + "Content-Type": self.content_type + } + return headers + + @staticmethod + def _create_authorization(method, bucket, s3_path, date, s3_key, s3_secret, content_type="", md5_hash=""): + payload = f"{method}\n{md5_hash}\n{content_type}\n{date}\n/{bucket.strip('/')}/{s3_path.strip('/')}" + signature = base64.b64encode( + hmac.new(s3_secret.encode(), payload.encode(), hashlib.sha1).digest() + ).decode() + return f"AWS {s3_key}:{signature}" + +def read_csv_as_string(file_path): + """ + Reads a CSV file from the given path and returns its content as a single string. + """ + try: + with open(file_path, 'r', encoding='utf-8') as file: + return file.read() + except FileNotFoundError: + print(f"Error: The file {file_path} does not exist.") + return None + except IOError as e: + print(f"IO error occurred: {str(e)}") + return None + +CSV_DIR = "/data/csv_files/" +#CSV_DIR = "csv_files/" + +# Define the path to the file containing the installation name +INSTALLATION_NAME_FILE = '/data/innovenergy/openvpn/installation-name' + + +# trick the pycharm type-checker into thinking Callable is in scope, not used at runtime +# noinspection PyUnreachableCode +if False: + from typing import Callable + +def interpret_limb_bitmap(bitmap_value): + # The bit for string 1 also monitors all 5 strings: 0000 0000 means All 5 strings activated. 0000 0001 means string 1 disabled. + string1_disabled = int((bitmap_value & 0b00001) != 0) + string2_disabled = int((bitmap_value & 0b00010) != 0) + string3_disabled = int((bitmap_value & 0b00100) != 0) + string4_disabled = int((bitmap_value & 0b01000) != 0) + string5_disabled = int((bitmap_value & 0b10000) != 0) + n_limb_strings = string1_disabled+string2_disabled+string3_disabled+string4_disabled+string5_disabled + return n_limb_strings + +def create_csv_signals(firmware_version): + def read_power(status): + return int(read_current(status) * read_voltage(status)) + + read_voltage = c.read_float(register=999, scale_factor=0.01, offset=0, places=2) + read_current = c.read_float(register=1000, scale_factor=0.01, offset=-10000, places=2) + + read_limb_bitmap = c.read_bitmap(1059) + + def string1_disabled(status): + bitmap_value = read_limb_bitmap(status) + return int((bitmap_value & 0b00001) != 0) + + def string2_disabled(status): + bitmap_value = read_limb_bitmap(status) + return int((bitmap_value & 0b00010) != 0) + + def string3_disabled(status): + bitmap_value = read_limb_bitmap(status) + return int((bitmap_value & 0b00100) != 0) + + def string4_disabled(status): + bitmap_value = read_limb_bitmap(status) + return int((bitmap_value & 0b01000) != 0) + + def string5_disabled(status): + bitmap_value = read_limb_bitmap(status) + return int((bitmap_value & 0b10000) != 0) + + + def limp_strings_value(status): + return interpret_limb_bitmap(read_limb_bitmap(status)) + + def calc_power_limit_imposed_by_voltage_limit(v, i, v_limit, r_int): + # type: (float, float, float, float) -> float + + dv = v_limit - v + di = dv / r_int + p_limit = v_limit * (i + di) + + return p_limit + + def calc_power_limit_imposed_by_current_limit(v, i, i_limit, r_int): + # type: (float, float, float, float) -> float + + di = i_limit - i + dv = di * r_int + p_limit = i_limit * (v + dv) + + return p_limit + + def calc_max_charge_power(status): + # type: (BatteryStatus) -> int + n_strings = cfg.NUM_OF_STRING_PER_BATTERY-limp_strings_value(status) + i_max = n_strings * cfg.I_MAX_PER_STRING + v_max = cfg.V_MAX + r_int_min = cfg.R_STRING_MIN / n_strings + r_int_max = cfg.R_STRING_MAX / n_strings + + v = read_voltage(status) + i = read_current(status) + + p_limits = [ + calc_power_limit_imposed_by_voltage_limit(v, i, v_max,r_int_min), + calc_power_limit_imposed_by_voltage_limit(v, i, v_max, r_int_max), + calc_power_limit_imposed_by_current_limit(v, i, i_max, r_int_min), + calc_power_limit_imposed_by_current_limit(v, i, i_max, r_int_max), + ] + + p_limit = min(p_limits) # p_limit is normally positive here (signed) + p_limit = max(p_limit, 0) # charge power must not become negative + + return int(p_limit) + + def calc_max_discharge_power(status): + n_strings = cfg.NUM_OF_STRING_PER_BATTERY-limp_strings_value(status) + max_discharge_current = n_strings*cfg.I_MAX_PER_STRING + return int(max_discharge_current*read_voltage(status)) + + def return_led_state_blue(status): + led_state = c.read_led_state(register=1004, led=LedColor.blue)(status) + if led_state == LedState.blinking_fast or led_state == LedState.blinking_slow: + return "Blinking" + elif led_state == LedState.on: + return "On" + elif led_state == LedState.off: + return "Off" + + return "Unknown" + + def return_led_state_red(status): + led_state = c.read_led_state(register=1004, led=LedColor.red)(status) + if led_state == LedState.blinking_fast or led_state == LedState.blinking_slow: + return "Blinking" + elif led_state == LedState.on: + return "On" + elif led_state == LedState.off: + return "Off" + + return "Unknown" + + def return_led_state_green(status): + led_state = c.read_led_state(register=1004, led=LedColor.green)(status) + if led_state == LedState.blinking_fast or led_state == LedState.blinking_slow: + return "Blinking" + elif led_state == LedState.on: + return "On" + elif led_state == LedState.off: + return "Off" + + return "Unknown" + + def return_led_state_amber(status): + led_state = c.read_led_state(register=1004, led=LedColor.amber)(status) + if led_state == LedState.blinking_fast or led_state == LedState.blinking_slow: + return "Blinking" + elif led_state == LedState.on: + return "On" + elif led_state == LedState.off: + return "Off" + + return "Unknown" + + total_current = c.read_float(register=1062, scale_factor=0.01, offset=-10000, places=1) + + def read_total_current(status): + return total_current(status) + + def read_heating_current(status): + return total_current(status) - read_current(status) + + def read_heating_power(status): + return read_voltage(status) * read_heating_current(status) + + soc_ah = c.read_float(register=1002, scale_factor=0.1, offset=-10000, places=1) + + def read_soc_ah(status): + return soc_ah(status) + + def hex_string_to_ascii(hex_string): + # Ensure the hex_string is correctly formatted without spaces + hex_string = hex_string.replace(" ", "") + # Convert every two characters (a byte) in the hex string to ASCII + ascii_string = ''.join([chr(int(hex_string[i:i+2], 16)) for i in range(0, len(hex_string), 2)]) + return ascii_string + + battery_status_reader = c.read_hex_string(1060,2) + + def read_eoc_reached(status): + battery_status_string = battery_status_reader(status) + #if hex_string_to_ascii(battery_status_string) == "EOC_": + #return True + #return False + return hex_string_to_ascii(battery_status_string) == "EOC_" + + def read_serial_number(status): + + serial_regs = [1055, 1056, 1057, 1058] + serial_parts = [] + + for reg in serial_regs: + # reading each register as a single hex value + hex_value_fun = c.read_hex_string(reg, 1) + hex_value = hex_value_fun(status) + + # append without spaces and leading zeros stripped if any + serial_parts.append(hex_value.replace(' ', '')) + + # concatenate all parts to form the full serial number + serial_number = ''.join(serial_parts).rstrip('0') + + return serial_number + + return [ + + CsvSignal('/Battery/Devices/FwVersion', firmware_version), + CsvSignal('/Battery/Devices/Dc/Power', read_power, 'W'), + CsvSignal('/Battery/Devices/Dc/Voltage', read_voltage, 'V'), + CsvSignal('/Battery/Devices/Soc', c.read_float(register=1053, scale_factor=0.1, offset=0, places=1), '%'), + CsvSignal('/Battery/Devices/Temperatures/Cells/Average', c.read_float(register=1003, scale_factor=0.1, offset=-400, places=1), 'C'), + + CsvSignal('/Battery/Devices/Dc/Current', read_current, 'A'), + CsvSignal('/Battery/Devices/BusCurrent', read_total_current, 'A'), + CsvSignal('/Battery/Devices/CellsCurrent', read_current, 'A'), + CsvSignal('/Battery/Devices/HeatingCurrent', read_heating_current, 'A'), + CsvSignal('/Battery/Devices/HeatingPower', read_heating_power, 'W'), + CsvSignal('/Battery/Devices/SOCAh', read_soc_ah), + + CsvSignal('/Battery/Devices/Leds/Blue', return_led_state_blue), + CsvSignal('/Battery/Devices/Leds/Red', return_led_state_red), + CsvSignal('/Battery/Devices/Leds/Green', return_led_state_green), + CsvSignal('/Battery/Devices/Leds/Amber', return_led_state_amber), + + CsvSignal('/Battery/Devices/BatteryStrings/String1Active', string1_disabled), + CsvSignal('/Battery/Devices/BatteryStrings/String2Active', string2_disabled), + CsvSignal('/Battery/Devices/BatteryStrings/String3Active', string3_disabled), + CsvSignal('/Battery/Devices/BatteryStrings/String4Active', string4_disabled), + CsvSignal('/Battery/Devices/BatteryStrings/String5Active', string5_disabled), + + CsvSignal('/Battery/Devices/IoStatus/ConnectedToDcBus', c.read_bool(register=1013, bit=0)), + CsvSignal('/Battery/Devices/IoStatus/AlarmOutActive', c.read_bool(register=1013, bit=1)), + CsvSignal('/Battery/Devices/IoStatus/InternalFanActive', c.read_bool(register=1013, bit=2)), + CsvSignal('/Battery/Devices/IoStatus/VoltMeasurementAllowed', c.read_bool(register=1013, bit=3)), + CsvSignal('/Battery/Devices/IoStatus/AuxRelayBus', c.read_bool(register=1013, bit=4)), + CsvSignal('/Battery/Devices/IoStatus/RemoteStateActive', c.read_bool(register=1013, bit=5)), + CsvSignal('/Battery/Devices/IoStatus/RiscActive', c.read_bool(register=1013, bit=6)), + + + CsvSignal('/Battery/Devices/Eoc', read_eoc_reached), + CsvSignal('/Battery/Devices/SerialNumber', read_serial_number), + CsvSignal('/Battery/Devices/TimeSinceTOC', c.read_float(register=1052)), + CsvSignal('/Battery/Devices/MaxChargePower', calc_max_charge_power), + CsvSignal('/Battery/Devices/MaxDischargePower', calc_max_discharge_power), + + # Warnings + CsvSignal('/Battery/Devices/WarningFlags/TaM1', c.read_bool(register=1005, bit=1)), + CsvSignal('/Battery/Devices/WarningFlags/TbM1', c.read_bool(register=1005, bit=4)), + CsvSignal('/Battery/Devices/WarningFlags/VBm1', c.read_bool(register=1005, bit=6)), + CsvSignal('/Battery/Devices/WarningFlags/VBM1', c.read_bool(register=1005, bit=8)), + CsvSignal('/Battery/Devices/WarningFlags/IDM1', c.read_bool(register=1005, bit=10)), + CsvSignal('/Battery/Devices/WarningFlags/vsm1', c.read_bool(register=1005, bit=22)), + CsvSignal('/Battery/Devices/WarningFlags/vsM1', c.read_bool(register=1005, bit=24)), + CsvSignal('/Battery/Devices/WarningFlags/iCM1', c.read_bool(register=1005, bit=26)), + CsvSignal('/Battery/Devices/WarningFlags/iDM1', c.read_bool(register=1005, bit=28)), + CsvSignal('/Battery/Devices/WarningFlags/MID1', c.read_bool(register=1005, bit=30)), + CsvSignal('/Battery/Devices/WarningFlags/BLPW', c.read_bool(register=1005, bit=32)), + CsvSignal('/Battery/Devices/WarningFlags/CCBF', c.read_bool(register=1005, bit=33)), + CsvSignal('/Battery/Devices/WarningFlags/Ah_W', c.read_bool(register=1005, bit=35)), + CsvSignal('/Battery/Devices/WarningFlags/MPMM', c.read_bool(register=1005, bit=38)), + CsvSignal('/Battery/Devices/WarningFlags/TCdi', c.read_bool(register=1005, bit=40)), + CsvSignal('/Battery/Devices/WarningFlags/LMPW', c.read_bool(register=1005, bit=44)), + CsvSignal('/Battery/Devices/WarningFlags/TOCW', c.read_bool(register=1005, bit=47)), + CsvSignal('/Battery/Devices/WarningFlags/BUSL', c.read_bool(register=1005, bit=49)), + + # Alarms + CsvSignal('/Battery/Devices/AlarmFlags/Tam', c.read_bool(register=1005, bit=0)), + CsvSignal('/Battery/Devices/AlarmFlags/TaM2', c.read_bool(register=1005, bit=2)), + CsvSignal('/Battery/Devices/AlarmFlags/Tbm', c.read_bool(register=1005, bit=3)), + CsvSignal('/Battery/Devices/AlarmFlags/TbM2', c.read_bool(register=1005, bit=5)), + CsvSignal('/Battery/Devices/AlarmFlags/VBm2', c.read_bool(register=1005, bit=7)), + CsvSignal('/Battery/Devices/AlarmFlags/VBM2', c.read_bool(register=1005, bit=9)), + CsvSignal('/Battery/Devices/AlarmFlags/IDM2', c.read_bool(register=1005, bit=11)), + CsvSignal('/Battery/Devices/AlarmFlags/ISOB', c.read_bool(register=1005, bit=12)), + CsvSignal('/Battery/Devices/AlarmFlags/MSWE', c.read_bool(register=1005, bit=13)), + CsvSignal('/Battery/Devices/AlarmFlags/FUSE', c.read_bool(register=1005, bit=14)), + CsvSignal('/Battery/Devices/AlarmFlags/HTRE', c.read_bool(register=1005, bit=15)), + CsvSignal('/Battery/Devices/AlarmFlags/TCPE', c.read_bool(register=1005, bit=16)), + CsvSignal('/Battery/Devices/AlarmFlags/STRE', c.read_bool(register=1005, bit=17)), + CsvSignal('/Battery/Devices/AlarmFlags/CME', c.read_bool(register=1005, bit=18)), + CsvSignal('/Battery/Devices/AlarmFlags/HWFL', c.read_bool(register=1005, bit=19)), + CsvSignal('/Battery/Devices/AlarmFlags/HWEM', c.read_bool(register=1005, bit=20)), + CsvSignal('/Battery/Devices/AlarmFlags/ThM', c.read_bool(register=1005, bit=21)), + CsvSignal('/Battery/Devices/AlarmFlags/vsm2', c.read_bool(register=1005, bit=23)), + CsvSignal('/Battery/Devices/AlarmFlags/vsM2', c.read_bool(register=1005, bit=25)), + CsvSignal('/Battery/Devices/AlarmFlags/iCM2', c.read_bool(register=1005, bit=27)), + CsvSignal('/Battery/Devices/AlarmFlags/iDM2', c.read_bool(register=1005, bit=29)), + CsvSignal('/Battery/Devices/AlarmFlags/MID2', c.read_bool(register=1005, bit=31)), + CsvSignal('/Battery/Devices/AlarmFlags/HTFS', c.read_bool(register=1005, bit=42)), + CsvSignal('/Battery/Devices/AlarmFlags/DATA', c.read_bool(register=1005, bit=43)), + CsvSignal('/Battery/Devices/AlarmFlags/LMPA', c.read_bool(register=1005, bit=45)), + CsvSignal('/Battery/Devices/AlarmFlags/HEBT', c.read_bool(register=1005, bit=46)), + CsvSignal('/Battery/Devices/AlarmFlags/CURM', c.read_bool(register=1005, bit=48)), + + ] + + +def init_signals(hardware_version, firmware_version, n_batteries): + # type: (str,str,int) -> Iterable[Signal] + """ + A Signal holds all information necessary for the handling of a + certain datum (e.g. voltage) published by the battery. + + Signal(dbus_path, aggregate, get_value, get_text = str) + + dbus_path: str + object_path on DBus where the datum needs to be published + + aggregate: Iterable[object] -> object + function that combines the values of multiple batteries into one. + e.g. sum for currents, or mean for voltages + + get_value: (BatteryStatus) -> object [optional] + function to extract the datum from the modbus record, + alternatively: a constant + + get_text: (object) -> unicode [optional] + function to render datum to text, needed by DBus + alternatively: a constant + + + The conversion functions use the same parameters (e.g scale_factor, offset) + as described in the document 'T48TLxxx ModBus Protocol Rev.7.1' which can + be found in the /doc folder + """ + + product_id_hex = '0x{0:04x}'.format(cfg.PRODUCT_ID) + + read_voltage = c.read_float(register=999, scale_factor=0.01, offset=0, places=2) + read_current = c.read_float(register=1000, scale_factor=0.01, offset=-10000, places=2) + + def read_power(status): + return int(read_current(status) * read_voltage(status)) + + read_limb_bitmap = c.read_bitmap(1059) + def limp_strings_value(status): + return interpret_limb_bitmap(read_limb_bitmap(status)) + + def max_discharge_current(status): + return (cfg.NUM_OF_STRING_PER_BATTERY-limp_strings_value(status))*cfg.I_MAX_PER_STRING + + def max_charge_current(status): + return status.battery.ampere_hours/2 + + def calc_power_limit_imposed_by_voltage_limit(v, i, v_limit, r_int): + # type: (float, float, float, float) -> float + + dv = v_limit - v + di = dv / r_int + p_limit = v_limit * (i + di) + + return p_limit + + def calc_power_limit_imposed_by_current_limit(v, i, i_limit, r_int): + # type: (float, float, float, float) -> float + + di = i_limit - i + dv = di * r_int + p_limit = i_limit * (v + dv) + + return p_limit + + def calc_max_charge_power(status): + # type: (BatteryStatus) -> int + n_strings = cfg.NUM_OF_STRING_PER_BATTERY-limp_strings_value(status) + i_max = n_strings * cfg.I_MAX_PER_STRING + v_max = cfg.V_MAX + r_int_min = cfg.R_STRING_MIN / n_strings + r_int_max = cfg.R_STRING_MAX / n_strings + + v = read_voltage(status) + i = read_current(status) + + p_limits = [ + calc_power_limit_imposed_by_voltage_limit(v, i, v_max,r_int_min), + calc_power_limit_imposed_by_voltage_limit(v, i, v_max, r_int_max), + calc_power_limit_imposed_by_current_limit(v, i, i_max, r_int_min), + calc_power_limit_imposed_by_current_limit(v, i, i_max, r_int_max), + ] + + p_limit = min(p_limits) # p_limit is normally positive here (signed) + p_limit = max(p_limit, 0) # charge power must not become negative + + return int(p_limit) + + product_name = cfg.PRODUCT_NAME + if n_batteries > 1: + product_name = cfg.PRODUCT_NAME + ' x' + str(n_batteries) + + return [ + # Node Red related dbus paths + Signal('/TimeToTOCRequest', min, c.read_float(register=1052)), + Signal('/NumOfLimbStrings', c.return_in_list, get_value=limp_strings_value), + Signal('/NumOfBatteries', max, get_value=n_batteries), + Signal('/Dc/0/Voltage', c.mean, get_value=read_voltage, get_text=c.append_unit('V')), + Signal('/Dc/0/Current', c.ssum, get_value=read_current, get_text=c.append_unit('A')), + Signal('/Dc/0/Power', c.ssum, get_value=read_power, get_text=c.append_unit('W')), + + Signal('/BussVoltage', c.mean, c.read_float(register=1001, scale_factor=0.01, offset=0, places=2), c.append_unit('V')), + Signal('/Soc', c.mean, c.read_float(register=1053, scale_factor=0.1, offset=0, places=1), c.append_unit('%')), + Signal('/LowestSoc', min, c.read_float(register=1053, scale_factor=0.1, offset=0, places=1), c.append_unit('%')), + Signal('/Dc/0/Temperature', c.mean, c.read_float(register=1003, scale_factor=0.1, offset=-400, places=1), c.append_unit(u'°C')), + Signal('/Dc/0/LowestTemperature', min, c.read_float(register=1003, scale_factor=0.1, offset=-400, places=1), c.append_unit(u'°C')), + + # Charge/Discharge current, voltage and power + Signal('/Info/MaxDischargeCurrent', c.ssum, max_discharge_current,c.append_unit('A')), + Signal('/Info/MaxChargeCurrent', c.ssum, max_charge_current, c.append_unit('A')), + Signal('/Info/MaxChargeVoltage', min, cfg.MAX_CHARGE_VOLTAGE, c.append_unit('V')), + Signal('/Info/MaxChargePower', c.ssum, calc_max_charge_power), + + # Victron mandatory dbus paths + Signal('/Mgmt/ProcessName', c.first, __file__), + Signal('/Mgmt/ProcessVersion', c.first, cfg.SOFTWARE_VERSION), + Signal('/Mgmt/Connection', c.first, cfg.CONNECTION), + Signal('/DeviceInstance', c.first, cfg.DEVICE_INSTANCE), + Signal('/ProductName', c.first, product_name), + Signal('/ProductId', c.first, cfg.PRODUCT_ID, product_id_hex), + Signal('/Connected', c.first, 1), + #Signal('/FirmwareVersion', c.first, cfg.FIRMWARE_VERSION, firmware_version), + Signal('/FirmwareVersion', c.return_in_list, firmware_version), + Signal('/HardwareVersion', c.first, cfg.HARDWARE_VERSION, hardware_version), + + ## Diagnostics + Signal('/Diagnostics/BmsVersion', c.first, lambda s: s.battery.bms_version), + + # Warnings + #Signal('/Diagnostics/WarningFlags', c.first, c.read_hex_string(register=1005, count=4)), + Signal('/WarningFlags/TaM1', c.return_in_list, c.read_bool(register=1005, bit=1)), + Signal('/WarningFlags/TbM1', c.return_in_list, c.read_bool(register=1005, bit=4)), + Signal('/WarningFlags/VBm1', c.return_in_list, c.read_bool(register=1005, bit=6)), + Signal('/WarningFlags/VBM1', c.return_in_list, c.read_bool(register=1005, bit=8)), + Signal('/WarningFlags/IDM1', c.return_in_list, c.read_bool(register=1005, bit=10)), + Signal('/WarningFlags/vsm1', c.return_in_list, c.read_bool(register=1005, bit=22)), + Signal('/WarningFlags/vsM1', c.return_in_list, c.read_bool(register=1005, bit=24)), + Signal('/WarningFlags/iCM1', c.return_in_list, c.read_bool(register=1005, bit=26)), + Signal('/WarningFlags/iDM1', c.return_in_list, c.read_bool(register=1005, bit=28)), + Signal('/WarningFlags/MID1', c.return_in_list, c.read_bool(register=1005, bit=30)), + Signal('/WarningFlags/BLPW', c.return_in_list, c.read_bool(register=1005, bit=32)), + Signal('/WarningFlags/CCBF', c.return_in_list, c.read_bool(register=1005, bit=33)), + Signal('/WarningFlags/Ah_W', c.return_in_list, c.read_bool(register=1005, bit=35)), + Signal('/WarningFlags/MPMM', c.return_in_list, c.read_bool(register=1005, bit=38)), + #Signal('/WarningFlags/TCMM', c.return_in_list, c.read_bool(register=1005, bit=39)), + Signal('/WarningFlags/TCdi', c.return_in_list, c.read_bool(register=1005, bit=40)), + Signal('/WarningFlags/LMPW', c.return_in_list, c.read_bool(register=1005, bit=44)), + Signal('/WarningFlags/TOCW', c.return_in_list, c.read_bool(register=1005, bit=47)), + Signal('/WarningFlags/BUSL', c.return_in_list, c.read_bool(register=1005, bit=49)), + + # Alarms + #Signal('/Diagnostics/AlarmFlags', c.first, c.read_hex_string(register=1009, count=4)), + Signal('/AlarmFlags/Tam', c.return_in_list, c.read_bool(register=1005, bit=0)), + Signal('/AlarmFlags/TaM2', c.return_in_list, c.read_bool(register=1005, bit=2)), + Signal('/AlarmFlags/Tbm', c.return_in_list, c.read_bool(register=1005, bit=3)), + Signal('/AlarmFlags/TbM2', c.return_in_list, c.read_bool(register=1005, bit=5)), + Signal('/AlarmFlags/VBm2', c.return_in_list, c.read_bool(register=1005, bit=7)), + Signal('/AlarmFlags/VBM2', c.return_in_list, c.read_bool(register=1005, bit=9)), + Signal('/AlarmFlags/IDM2', c.return_in_list, c.read_bool(register=1005, bit=11)), + Signal('/AlarmFlags/ISOB', c.return_in_list, c.read_bool(register=1005, bit=12)), + Signal('/AlarmFlags/MSWE', c.return_in_list, c.read_bool(register=1005, bit=13)), + Signal('/AlarmFlags/FUSE', c.return_in_list, c.read_bool(register=1005, bit=14)), + Signal('/AlarmFlags/HTRE', c.return_in_list, c.read_bool(register=1005, bit=15)), + Signal('/AlarmFlags/TCPE', c.return_in_list, c.read_bool(register=1005, bit=16)), + Signal('/AlarmFlags/STRE', c.return_in_list, c.read_bool(register=1005, bit=17)), + Signal('/AlarmFlags/CME', c.return_in_list, c.read_bool(register=1005, bit=18)), + Signal('/AlarmFlags/HWFL', c.return_in_list, c.read_bool(register=1005, bit=19)), + Signal('/AlarmFlags/HWEM', c.return_in_list, c.read_bool(register=1005, bit=20)), + Signal('/AlarmFlags/ThM', c.return_in_list, c.read_bool(register=1005, bit=21)), + Signal('/AlarmFlags/vsm2', c.return_in_list, c.read_bool(register=1005, bit=23)), + Signal('/AlarmFlags/vsM2', c.return_in_list, c.read_bool(register=1005, bit=25)), + Signal('/AlarmFlags/iCM2', c.return_in_list, c.read_bool(register=1005, bit=27)), + Signal('/AlarmFlags/iDM2', c.return_in_list, c.read_bool(register=1005, bit=29)), + Signal('/AlarmFlags/MID2', c.return_in_list, c.read_bool(register=1005, bit=31)), + #Signal('/AlarmFlags/TcBM', c.return_in_list, c.read_bool(register=1005, bit=36)), + #Signal('/AlarmFlags/BRNF', c.return_in_list, c.read_bool(register=1005, bit=37)), + Signal('/AlarmFlags/HTFS', c.return_in_list, c.read_bool(register=1005, bit=42)), + Signal('/AlarmFlags/DATA', c.return_in_list, c.read_bool(register=1005, bit=43)), + Signal('/AlarmFlags/LMPA', c.return_in_list, c.read_bool(register=1005, bit=45)), + Signal('/AlarmFlags/HEBT', c.return_in_list, c.read_bool(register=1005, bit=46)), + Signal('/AlarmFlags/CURM', c.return_in_list, c.read_bool(register=1005, bit=48)), + + # LedStatus + Signal('/Diagnostics/LedStatus/Red', c.first, c.read_led_state(register=1004, led=LedColor.red)), + Signal('/Diagnostics/LedStatus/Blue', c.first, c.read_led_state(register=1004, led=LedColor.blue)), + Signal('/Diagnostics/LedStatus/Green', c.first, c.read_led_state(register=1004, led=LedColor.green)), + Signal('/Diagnostics/LedStatus/Amber', c.first, c.read_led_state(register=1004, led=LedColor.amber)), + + # IO Status + Signal('/Diagnostics/IoStatus/MainSwitchClosed', c.return_in_list, c.read_bool(register=1013, bit=0)), + Signal('/Diagnostics/IoStatus/AlarmOutActive', c.return_in_list, c.read_bool(register=1013, bit=1)), + Signal('/Diagnostics/IoStatus/InternalFanActive', c.return_in_list, c.read_bool(register=1013, bit=2)), + Signal('/Diagnostics/IoStatus/VoltMeasurementAllowed', c.return_in_list, c.read_bool(register=1013, bit=3)), + Signal('/Diagnostics/IoStatus/AuxRelay', c.return_in_list, c.read_bool(register=1013, bit=4)), + Signal('/Diagnostics/IoStatus/RemoteState', c.return_in_list, c.read_bool(register=1013, bit=5)), + Signal('/Diagnostics/IoStatus/RiscOn', c.return_in_list, c.read_bool(register=1013, bit=6)), + ] + + +def init_modbus(tty): + # type: (str) -> Modbus + + logging.debug('initializing Modbus') + + return Modbus( + port='/dev/' + tty, + method=cfg.MODE, + baudrate=cfg.BAUD_RATE, + stopbits=cfg.STOP_BITS, + bytesize=cfg.BYTE_SIZE, + timeout=cfg.TIMEOUT, + parity=cfg.PARITY) + + +def init_dbus(tty, signals): + # type: (str, Iterable[Signal]) -> DBus + + logging.debug('initializing DBus service') + dbus = DBus(servicename=cfg.SERVICE_NAME_PREFIX + tty) + + logging.debug('initializing DBus paths') + for signal in signals: + init_dbus_path(dbus, signal) + + return dbus + + +# noinspection PyBroadException +def try_get_value(sig): + # type: (Signal) -> object + try: + return sig.get_value(None) + except: + return None + + +def init_dbus_path(dbus, sig): + # type: (DBus, Signal) -> () + + dbus.add_path( + sig.dbus_path, + try_get_value(sig), + gettextcallback=lambda _, v: sig.get_text(v)) + + +def init_main_loop(): + # type: () -> DBusGMainLoop + logging.debug('initializing DBusGMainLoop Loop') + DBusGMainLoop(set_as_default=True) + return GLib.MainLoop() + + +def report_slave_id(modbus, slave_address): + # type: (Modbus, int) -> str + + slave = str(slave_address) + + logging.debug('requesting slave id from node ' + slave) + + try: + + modbus.connect() + + request = ReportSlaveIdRequest(unit=slave_address) + response = modbus.execute(request) + + if response is ExceptionResponse or issubclass(type(response), ModbusException): + raise Exception('failed to get slave id from ' + slave + ' : ' + str(response)) + + return response.identifier + + finally: + modbus.close() + + +def identify_battery(modbus, slave_address): + # type: (Modbus, int) -> Battery + + logging.info('identifying battery...') + + hardware_version, bms_version, ampere_hours = parse_slave_id(modbus, slave_address) + firmware_version = read_firmware_version(modbus, slave_address) + + specs = Battery( + slave_address=slave_address, + hardware_version=hardware_version, + firmware_version=firmware_version, + bms_version=bms_version, + ampere_hours=ampere_hours) + + logging.info('battery identified:\n{0}'.format(str(specs))) + + return specs + + +def identify_batteries(modbus): + # type: (Modbus) -> list[Battery] + + def _identify_batteries(): + address_range = range(1, cfg.MAX_SLAVE_ADDRESS + 1) + + for slave_address in address_range: + try: + yield identify_battery(modbus, slave_address) + except Exception as e: + logging.info('failed to identify battery at {0} : {1}'.format(str(slave_address), str(e))) + + return list(_identify_batteries()) # force that lazy iterable! + + +def parse_slave_id(modbus, slave_address): + # type: (Modbus, int) -> (str, str, int) + + slave_id = report_slave_id(modbus, slave_address) + + sid = re.sub(b'[^\x20-\x7E]', b'', slave_id) # remove weird special chars + + match = re.match('(?P48TL(?P\d+)) *(?P.*)', sid.decode('ascii')) + + if match is None: + raise Exception('no known battery found') + + return match.group('hw'), match.group('bms'), int(match.group('ah')) + + +def read_firmware_version(modbus, slave_address): + # type: (Modbus, int) -> str + + logging.debug('reading firmware version') + + try: + modbus.connect() + + response = read_modbus_registers(modbus, slave_address, base_address=1054, count=1) + register = response.registers[0] + + return '{0:0>4X}'.format(register) + + finally: + modbus.close() # close in any case + + +def read_modbus_registers(modbus, slave_address, base_address=cfg.BASE_ADDRESS, count=cfg.NO_OF_REGISTERS): + # type: (Modbus, int) -> ReadInputRegistersResponse + + logging.debug('requesting modbus registers {0}-{1}'.format(base_address, base_address + count)) + + return modbus.read_input_registers( + address=base_address, + count=count, + unit=slave_address) + + +def read_battery_status(modbus, battery): + # type: (Modbus, Battery) -> BatteryStatus + """ + Read the modbus registers containing the battery's status info. + """ + + logging.debug('reading battery status') + + try: + modbus.connect() + data = read_modbus_registers(modbus, battery.slave_address) + return BatteryStatus(battery, data.registers) + + finally: + modbus.close() # close in any case + + +def publish_values(dbus, signals, statuses): + # type: (DBus, Iterable[Signal], Iterable[BatteryStatus]) -> () + + for s in signals: + values = [s.get_value(status) for status in statuses] + with dbus as srv: + srv[s.dbus_path] = s.aggregate(values) + + +def update(modbus, batteries, dbus, signals, csv_signals): + # type: (Modbus, Iterable[Battery], DBus, Iterable[Signal]) -> bool + + """ + Main update function + + 1. requests status record each battery via modbus, + 2. parses the data using Signal.get_value + 3. aggregates the data from all batteries into one datum using Signal.aggregate + 4. publishes the data on the dbus + """ + + logging.debug('starting update cycle') + + statuses = [read_battery_status(modbus, battery) for battery in batteries] + node_numbers = [battery.slave_address for battery in batteries] + + publish_values(dbus, signals, statuses) + create_csv_files(csv_signals, statuses, node_numbers) + + logging.debug('finished update cycle\n') + return True + + +def print_usage(): + print ('Usage: ' + __file__ + ' ') + print ('Example: ' + __file__ + ' ttyUSB0') + + +def parse_cmdline_args(argv): + # type: (list[str]) -> str + + if len(argv) == 0: + logging.info('missing command line argument for tty device') + print_usage() + sys.exit(1) + + return argv[0] + + +alive = True # global alive flag, watchdog_task clears it, update_task sets it + + +def create_update_task(modbus, dbus, batteries, signals, csv_signals, main_loop): + # type: (Modbus, DBus, Iterable[Battery], Iterable[Signal], DBusGMainLoop) -> Callable[[],bool] + """ + Creates an update task which runs the main update function + and resets the alive flag + """ + + def update_task(): + # type: () -> bool + + global alive + + alive = update(modbus, batteries, dbus, signals, csv_signals) + + if not alive: + logging.info('update_task: quitting main loop because of error') + main_loop.quit() + + return alive + + return update_task + + +def create_watchdog_task(main_loop): + # type: (DBusGMainLoop) -> Callable[[],bool] + """ + Creates a Watchdog task that monitors the alive flag. + The watchdog kills the main loop if the alive flag is not periodically reset by the update task. + Who watches the watchdog? + """ + def watchdog_task(): + # type: () -> bool + + global alive + + if alive: + logging.debug('watchdog_task: update_task is alive') + alive = False + return True + else: + logging.info('watchdog_task: killing main loop because update_task is no longer alive') + main_loop.quit() + return False + + return watchdog_task + + +def get_installation_name(file_path): + with open(file_path, 'r') as file: + return file.read().strip() + +def manage_csv_files(directory_path, max_files=20): + csv_files = [f for f in os.listdir(directory_path)] + 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: + file_to_delete = os.path.join(directory_path, csv_files.pop(0)) + os.remove(file_to_delete) + +def serialize_for_csv(value): + if isinstance(value, (dict, list, tuple)): + return json.dumps(value, ensure_ascii=False) + return str(value) + +def insert_id(path, id_number): + parts = path.split("/") + + insert_position = parts.index("Devices") + 1 + + parts.insert(insert_position, str(id_number)) + + return "/".join(parts) + +def create_csv_files(signals, statuses, node_numbers): + timestamp = int(time.time()) + if timestamp % 2 != 0: + timestamp -= 1 + # Create CSV directory if it doesn't exist + if not os.path.exists(CSV_DIR): + os.makedirs(CSV_DIR) + + #installation_name = get_installation_name(INSTALLATION_NAME_FILE) + csv_filename = f"{timestamp}.csv" + csv_path = os.path.join(CSV_DIR, csv_filename) + + # Append values to the CSV file + with open(csv_path, 'a', newline='') as csvfile: + csv_writer = csv.writer(csvfile, delimiter=';') + + # Add a special row for the nodes configuration + nodes_config_path = "/Config/Devices/BatteryNodes" + nodes_list = ",".join(str(node) for node in node_numbers) + config_row = [nodes_config_path, nodes_list, ""] + csv_writer.writerow(config_row) + + # Iterate over each node and signal to create rows in the new format + for i, node in enumerate(node_numbers): + for s in signals: + signal_name = insert_id(s.name, i+1) + #value = serialize_for_csv(s.get_value(statuses[i])) + value = s.get_value(statuses[i]) + row_values = [signal_name, value, s.get_text] + csv_writer.writerow(row_values) + + # Manage CSV files, keep a limited number of files + + + + # Create the CSV as a string + csv_data = read_csv_as_string(csv_path) + + + # Create an S3config instance + s3_config = S3config() + response = s3_config.create_put_request(csv_filename, csv_data) + + if response.status_code == 200: + os.remove(csv_path) + print("Success") + else: + failed_dir = os.path.join(CSV_DIR, "failed") + if not os.path.exists(failed_dir): + os.makedirs(failed_dir) + failed_path = os.path.join(failed_dir, csv_filename) + os.rename(csv_path, failed_path) + print("Uploading failed") + manage_csv_files(failed_dir, 10) + + + manage_csv_files(CSV_DIR) + + +def main(argv): + # type: (list[str]) -> () + + logging.basicConfig(level=cfg.LOG_LEVEL) + logging.info('starting ' + __file__) + + tty = parse_cmdline_args(argv) + modbus = init_modbus(tty) + + batteries = identify_batteries(modbus) + + n = len(batteries) + + logging.info('found ' + str(n) + (' battery' if n == 1 else ' batteries')) + + if n <= 0: + sys.exit(2) + + bat = c.first(batteries) # report hw and fw version of first battery found + + signals = init_signals(bat.hardware_version, bat.firmware_version, n) + csv_signals = create_csv_signals(bat.firmware_version) + + main_loop = init_main_loop() # must run before init_dbus because gobject does some global magic + dbus = init_dbus(tty, signals) + + update_task = create_update_task(modbus, dbus, batteries, signals, csv_signals, main_loop) + watchdog_task = create_watchdog_task(main_loop) + + GLib.timeout_add(cfg.UPDATE_INTERVAL * 2, watchdog_task) # add watchdog first + GLib.timeout_add(cfg.UPDATE_INTERVAL, update_task) # call update once every update_interval + + logging.info('starting GLib.MainLoop') + main_loop.run() + logging.info('GLib.MainLoop was shut down') + + sys.exit(0xFF) # reaches this only on error + + +if __name__ == "__main__": + main(sys.argv[1:]) diff --git a/NodeRed/dbus-fzsonick-48tl/ext/velib_python/ve_utils.py b/NodeRed/dbus-fzsonick-48tl/ext/velib_python/ve_utils.py new file mode 100644 index 000000000..f5a2f85a0 --- /dev/null +++ b/NodeRed/dbus-fzsonick-48tl/ext/velib_python/ve_utils.py @@ -0,0 +1,276 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +import sys +from traceback import print_exc +from os import _exit as os_exit +from os import statvfs +from subprocess import check_output, CalledProcessError +import logging +import dbus +logger = logging.getLogger(__name__) + +VEDBUS_INVALID = dbus.Array([], signature=dbus.Signature('i'), variant_level=1) + +class NoVrmPortalIdError(Exception): + pass + +# Use this function to make sure the code quits on an unexpected exception. Make sure to use it +# when using GLib.idle_add and also GLib.timeout_add. +# Without this, the code will just keep running, since GLib does not stop the mainloop on an +# exception. +# Example: GLib.idle_add(exit_on_error, myfunc, arg1, arg2) +def exit_on_error(func, *args, **kwargs): + try: + return func(*args, **kwargs) + except: + try: + print ('exit_on_error: there was an exception. Printing stacktrace will be tried and then exit') + print_exc() + except: + pass + + # sys.exit() is not used, since that throws an exception, which does not lead to a program + # halt when used in a dbus callback, see connection.py in the Python/Dbus libraries, line 230. + os_exit(1) + + +__vrm_portal_id = None +def get_vrm_portal_id(): + # The original definition of the VRM Portal ID is that it is the mac + # address of the onboard- ethernet port (eth0), stripped from its colons + # (:) and lower case. This may however differ between platforms. On Venus + # the task is therefore deferred to /sbin/get-unique-id so that a + # platform specific method can be easily defined. + # + # If /sbin/get-unique-id does not exist, then use the ethernet address + # of eth0. This also handles the case where velib_python is used as a + # package install on a Raspberry Pi. + # + # On a Linux host where the network interface may not be eth0, you can set + # the VRM_IFACE environment variable to the correct name. + + global __vrm_portal_id + + if __vrm_portal_id: + return __vrm_portal_id + + portal_id = None + + # First try the method that works if we don't have a data partition. This + # will fail when the current user is not root. + try: + portal_id = check_output("/sbin/get-unique-id").decode("utf-8", "ignore").strip() + if not portal_id: + raise NoVrmPortalIdError("get-unique-id returned blank") + __vrm_portal_id = portal_id + return portal_id + except CalledProcessError: + # get-unique-id returned non-zero + raise NoVrmPortalIdError("get-unique-id returned non-zero") + except OSError: + # File doesn't exist, use fallback + pass + + # Fall back to getting our id using a syscall. Assume we are on linux. + # Allow the user to override what interface is used using an environment + # variable. + import fcntl, socket, struct, os + + iface = os.environ.get('VRM_IFACE', 'eth0').encode('ascii') + s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + try: + info = fcntl.ioctl(s.fileno(), 0x8927, struct.pack('256s', iface[:15])) + except IOError: + raise NoVrmPortalIdError("ioctl failed for eth0") + + __vrm_portal_id = info[18:24].hex() + return __vrm_portal_id + + +# See VE.Can registers - public.docx for definition of this conversion +def convert_vreg_version_to_readable(version): + def str_to_arr(x, length): + a = [] + for i in range(0, len(x), length): + a.append(x[i:i+length]) + return a + + x = "%x" % version + x = x.upper() + + if len(x) == 5 or len(x) == 3 or len(x) == 1: + x = '0' + x + + a = str_to_arr(x, 2); + + # remove the first 00 if there are three bytes and it is 00 + if len(a) == 3 and a[0] == '00': + a.remove(0); + + # if we have two or three bytes now, and the first character is a 0, remove it + if len(a) >= 2 and a[0][0:1] == '0': + a[0] = a[0][1]; + + result = '' + for item in a: + result += ('.' if result != '' else '') + item + + + result = 'v' + result + + return result + + +def get_free_space(path): + result = -1 + + try: + s = statvfs(path) + result = s.f_frsize * s.f_bavail # Number of free bytes that ordinary users + except Exception as ex: + logger.info("Error while retrieving free space for path %s: %s" % (path, ex)) + + return result + + +def _get_sysfs_machine_name(): + try: + with open('/sys/firmware/devicetree/base/model', 'r') as f: + return f.read().rstrip('\x00') + except IOError: + pass + + return None + +# Returns None if it cannot find a machine name. Otherwise returns the string +# containing the name +def get_machine_name(): + # First try calling the venus utility script + try: + return check_output("/usr/bin/product-name").strip().decode('UTF-8') + except (CalledProcessError, OSError): + pass + + # Fall back to sysfs + name = _get_sysfs_machine_name() + if name is not None: + return name + + # Fall back to venus build machine name + try: + with open('/etc/venus/machine', 'r', encoding='UTF-8') as f: + return f.read().strip() + except IOError: + pass + + return None + + +def get_product_id(): + """ Find the machine ID and return it. """ + + # First try calling the venus utility script + try: + return check_output("/usr/bin/product-id").strip().decode('UTF-8') + except (CalledProcessError, OSError): + pass + + # Fall back machine name mechanism + name = _get_sysfs_machine_name() + return { + 'Color Control GX': 'C001', + 'Venus GX': 'C002', + 'Octo GX': 'C006', + 'EasySolar-II': 'C007', + 'MultiPlus-II': 'C008', + 'Maxi GX': 'C009', + 'Cerbo GX': 'C00A' + }.get(name, 'C003') # C003 is Generic + + +# Returns False if it cannot open the file. Otherwise returns its rstripped contents +def read_file(path): + content = False + + try: + with open(path, 'r') as f: + content = f.read().rstrip() + except Exception as ex: + logger.debug("Error while reading %s: %s" % (path, ex)) + + return content + + +def wrap_dbus_value(value): + if value is None: + return VEDBUS_INVALID + if isinstance(value, float): + return dbus.Double(value, variant_level=1) + if isinstance(value, bool): + return dbus.Boolean(value, variant_level=1) + if isinstance(value, int): + try: + return dbus.Int32(value, variant_level=1) + except OverflowError: + return dbus.Int64(value, variant_level=1) + if isinstance(value, str): + return dbus.String(value, variant_level=1) + if isinstance(value, list): + if len(value) == 0: + # If the list is empty we cannot infer the type of the contents. So assume unsigned integer. + # A (signed) integer is dangerous, because an empty list of signed integers is used to encode + # an invalid value. + return dbus.Array([], signature=dbus.Signature('u'), variant_level=1) + return dbus.Array([wrap_dbus_value(x) for x in value], variant_level=1) + if isinstance(value, dict): + # Wrapping the keys of the dictionary causes D-Bus errors like: + # 'arguments to dbus_message_iter_open_container() were incorrect, + # assertion "(type == DBUS_TYPE_ARRAY && contained_signature && + # *contained_signature == DBUS_DICT_ENTRY_BEGIN_CHAR) || (contained_signature == NULL || + # _dbus_check_is_valid_signature (contained_signature))" failed in file ...' + return dbus.Dictionary({(k, wrap_dbus_value(v)) for k, v in value.items()}, variant_level=1) + return value + + +dbus_int_types = (dbus.Int32, dbus.UInt32, dbus.Byte, dbus.Int16, dbus.UInt16, dbus.UInt32, dbus.Int64, dbus.UInt64) + + +def unwrap_dbus_value(val): + """Converts D-Bus values back to the original type. For example if val is of type DBus.Double, + a float will be returned.""" + if isinstance(val, dbus_int_types): + return int(val) + if isinstance(val, dbus.Double): + return float(val) + if isinstance(val, dbus.Array): + v = [unwrap_dbus_value(x) for x in val] + return None if len(v) == 0 else v + if isinstance(val, (dbus.Signature, dbus.String)): + return str(val) + # Python has no byte type, so we convert to an integer. + if isinstance(val, dbus.Byte): + return int(val) + if isinstance(val, dbus.ByteArray): + return "".join([bytes(x) for x in val]) + if isinstance(val, (list, tuple)): + return [unwrap_dbus_value(x) for x in val] + if isinstance(val, (dbus.Dictionary, dict)): + # Do not unwrap the keys, see comment in wrap_dbus_value + return dict([(x, unwrap_dbus_value(y)) for x, y in val.items()]) + if isinstance(val, dbus.Boolean): + return bool(val) + return val + +# When supported, only name owner changes for the the given namespace are reported. This +# prevents spending cpu time at irrelevant changes, like scripts accessing the bus temporarily. +def add_name_owner_changed_receiver(dbus, name_owner_changed, namespace="com.victronenergy"): + # support for arg0namespace is submitted upstream, but not included at the time of + # writing, Venus OS does support it, so try if it works. + if namespace is None: + dbus.add_signal_receiver(name_owner_changed, signal_name='NameOwnerChanged') + else: + try: + dbus.add_signal_receiver(name_owner_changed, + signal_name='NameOwnerChanged', arg0namespace=namespace) + except TypeError: + dbus.add_signal_receiver(name_owner_changed, signal_name='NameOwnerChanged') diff --git a/NodeRed/dbus-fzsonick-48tl/ext/velib_python/vedbus.py b/NodeRed/dbus-fzsonick-48tl/ext/velib_python/vedbus.py new file mode 100644 index 000000000..6171a2101 --- /dev/null +++ b/NodeRed/dbus-fzsonick-48tl/ext/velib_python/vedbus.py @@ -0,0 +1,614 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +import dbus.service +import logging +import traceback +import os +import weakref +from collections import defaultdict +from ve_utils import wrap_dbus_value, unwrap_dbus_value + +# vedbus contains three classes: +# VeDbusItemImport -> use this to read data from the dbus, ie import +# VeDbusItemExport -> use this to export data to the dbus (one value) +# VeDbusService -> use that to create a service and export several values to the dbus + +# Code for VeDbusItemImport is copied from busitem.py and thereafter modified. +# All projects that used busitem.py need to migrate to this package. And some +# projects used to define there own equivalent of VeDbusItemExport. Better to +# use VeDbusItemExport, or even better the VeDbusService class that does it all for you. + +# TODOS +# 1 check for datatypes, it works now, but not sure if all is compliant with +# com.victronenergy.BusItem interface definition. See also the files in +# tests_and_examples. And see 'if type(v) == dbus.Byte:' on line 102. Perhaps +# something similar should also be done in VeDbusBusItemExport? +# 2 Shouldn't VeDbusBusItemExport inherit dbus.service.Object? +# 7 Make hard rules for services exporting data to the D-Bus, in order to make tracking +# changes possible. Does everybody first invalidate its data before leaving the bus? +# And what about before taking one object away from the bus, instead of taking the +# whole service offline? +# They should! And after taking one value away, do we need to know that someone left +# the bus? Or we just keep that value in invalidated for ever? Result is that we can't +# see the difference anymore between an invalidated value and a value that was first on +# the bus and later not anymore. See comments above VeDbusItemImport as well. +# 9 there are probably more todos in the code below. + +# Some thoughts with regards to the data types: +# +# Text from: http://dbus.freedesktop.org/doc/dbus-python/doc/tutorial.html#data-types +# --- +# Variants are represented by setting the variant_level keyword argument in the +# constructor of any D-Bus data type to a value greater than 0 (variant_level 1 +# means a variant containing some other data type, variant_level 2 means a variant +# containing a variant containing some other data type, and so on). If a non-variant +# is passed as an argument but introspection indicates that a variant is expected, +# it'll automatically be wrapped in a variant. +# --- +# +# Also the different dbus datatypes, such as dbus.Int32, and dbus.UInt32 are a subclass +# of Python int. dbus.String is a subclass of Python standard class unicode, etcetera +# +# So all together that explains why we don't need to explicitly convert back and forth +# between the dbus datatypes and the standard python datatypes. Note that all datatypes +# in python are objects. Even an int is an object. + +# The signature of a variant is 'v'. + +# Export ourselves as a D-Bus service. +class VeDbusService(object): + def __init__(self, servicename, bus=None): + # dict containing the VeDbusItemExport objects, with their path as the key. + self._dbusobjects = {} + self._dbusnodes = {} + self._ratelimiters = [] + self._dbusname = None + + # dict containing the onchange callbacks, for each object. Object path is the key + self._onchangecallbacks = {} + + # Connect to session bus whenever present, else use the system bus + self._dbusconn = bus or (dbus.SessionBus() if 'DBUS_SESSION_BUS_ADDRESS' in os.environ else dbus.SystemBus()) + + # make the dbus connection available to outside, could make this a true property instead, but ach.. + self.dbusconn = self._dbusconn + + # Register ourselves on the dbus, trigger an error if already in use (do_not_queue) + self._dbusname = dbus.service.BusName(servicename, self._dbusconn, do_not_queue=True) + + # Add the root item that will return all items as a tree + self._dbusnodes['/'] = VeDbusRootExport(self._dbusconn, '/', self) + + logging.info("registered ourselves on D-Bus as %s" % servicename) + + # To force immediate deregistering of this dbus service and all its object paths, explicitly + # call __del__(). + def __del__(self): + for node in list(self._dbusnodes.values()): + node.__del__() + self._dbusnodes.clear() + for item in list(self._dbusobjects.values()): + item.__del__() + self._dbusobjects.clear() + if self._dbusname: + self._dbusname.__del__() # Forces call to self._bus.release_name(self._name), see source code + self._dbusname = None + + def get_name(self): + return self._dbusname.get_name() + + # @param callbackonchange function that will be called when this value is changed. First parameter will + # be the path of the object, second the new value. This callback should return + # True to accept the change, False to reject it. + def add_path(self, path, value, description="", writeable=False, + onchangecallback=None, gettextcallback=None, valuetype=None, itemtype=None): + + if onchangecallback is not None: + self._onchangecallbacks[path] = onchangecallback + + itemtype = itemtype or VeDbusItemExport + item = itemtype(self._dbusconn, path, value, description, writeable, + self._value_changed, gettextcallback, deletecallback=self._item_deleted, valuetype=valuetype) + + spl = path.split('/') + for i in range(2, len(spl)): + subPath = '/'.join(spl[:i]) + if subPath not in self._dbusnodes and subPath not in self._dbusobjects: + self._dbusnodes[subPath] = VeDbusTreeExport(self._dbusconn, subPath, self) + self._dbusobjects[path] = item + logging.debug('added %s with start value %s. Writeable is %s' % (path, value, writeable)) + + # Add the mandatory paths, as per victron dbus api doc + def add_mandatory_paths(self, processname, processversion, connection, + deviceinstance, productid, productname, firmwareversion, hardwareversion, connected): + self.add_path('/Mgmt/ProcessName', processname) + self.add_path('/Mgmt/ProcessVersion', processversion) + self.add_path('/Mgmt/Connection', connection) + + # Create rest of the mandatory objects + self.add_path('/DeviceInstance', deviceinstance) + self.add_path('/ProductId', productid) + self.add_path('/ProductName', productname) + self.add_path('/FirmwareVersion', firmwareversion) + self.add_path('/HardwareVersion', hardwareversion) + self.add_path('/Connected', connected) + + # Callback function that is called from the VeDbusItemExport objects when a value changes. This function + # maps the change-request to the onchangecallback given to us for this specific path. + def _value_changed(self, path, newvalue): + if path not in self._onchangecallbacks: + return True + + return self._onchangecallbacks[path](path, newvalue) + + def _item_deleted(self, path): + self._dbusobjects.pop(path) + for np in list(self._dbusnodes.keys()): + if np != '/': + for ip in self._dbusobjects: + if ip.startswith(np + '/'): + break + else: + self._dbusnodes[np].__del__() + self._dbusnodes.pop(np) + + def __getitem__(self, path): + return self._dbusobjects[path].local_get_value() + + def __setitem__(self, path, newvalue): + self._dbusobjects[path].local_set_value(newvalue) + + def __delitem__(self, path): + self._dbusobjects[path].__del__() # Invalidates and then removes the object path + assert path not in self._dbusobjects + + def __contains__(self, path): + return path in self._dbusobjects + + def __enter__(self): + l = ServiceContext(self) + self._ratelimiters.append(l) + return l + + def __exit__(self, *exc): + # pop off the top one and flush it. If with statements are nested + # then each exit flushes its own part. + if self._ratelimiters: + self._ratelimiters.pop().flush() + +class ServiceContext(object): + def __init__(self, parent): + self.parent = parent + self.changes = {} + + def __getitem__(self, path): + return self.parent[path] + + def __setitem__(self, path, newvalue): + c = self.parent._dbusobjects[path]._local_set_value(newvalue) + if c is not None: + self.changes[path] = c + + def flush(self): + if self.changes: + self.parent._dbusnodes['/'].ItemsChanged(self.changes) + +class TrackerDict(defaultdict): + """ Same as defaultdict, but passes the key to default_factory. """ + def __missing__(self, key): + self[key] = x = self.default_factory(key) + return x + +class VeDbusRootTracker(object): + """ This tracks the root of a dbus path and listens for PropertiesChanged + signals. When a signal arrives, parse it and unpack the key/value changes + into traditional events, then pass it to the original eventCallback + method. """ + def __init__(self, bus, serviceName): + self.importers = defaultdict(weakref.WeakSet) + self.serviceName = serviceName + self._match = bus.get_object(serviceName, '/', introspect=False).connect_to_signal( + "ItemsChanged", weak_functor(self._items_changed_handler)) + + def __del__(self): + self._match.remove() + self._match = None + + def add(self, i): + self.importers[i.path].add(i) + + def _items_changed_handler(self, items): + if not isinstance(items, dict): + return + + for path, changes in items.items(): + try: + v = changes['Value'] + except KeyError: + continue + + try: + t = changes['Text'] + except KeyError: + t = str(unwrap_dbus_value(v)) + + for i in self.importers.get(path, ()): + i._properties_changed_handler({'Value': v, 'Text': t}) + +""" +Importing basics: + - If when we power up, the D-Bus service does not exist, or it does exist and the path does not + yet exist, still subscribe to a signal: as soon as it comes online it will send a signal with its + initial value, which VeDbusItemImport will receive and use to update local cache. And, when set, + call the eventCallback. + - If when we power up, save it + - When using get_value, know that there is no difference between services (or object paths) that don't + exist and paths that are invalid (= empty array, see above). Both will return None. In case you do + really want to know ifa path exists or not, use the exists property. + - When a D-Bus service leaves the D-Bus, it will first invalidate all its values, and send signals + with that update, and only then leave the D-Bus. (or do we need to subscribe to the NameOwnerChanged- + signal!?!) To be discussed and make sure. Not really urgent, since all existing code that uses this + class already subscribes to the NameOwnerChanged signal, and subsequently removes instances of this + class. + +Read when using this class: +Note that when a service leaves that D-Bus without invalidating all its exported objects first, for +example because it is killed, VeDbusItemImport doesn't have a clue. So when using VeDbusItemImport, +make sure to also subscribe to the NamerOwnerChanged signal on bus-level. Or just use dbusmonitor, +because that takes care of all of that for you. +""" +class VeDbusItemImport(object): + def __new__(cls, bus, serviceName, path, eventCallback=None, createsignal=True): + instance = object.__new__(cls) + + # If signal tracking should be done, also add to root tracker + if createsignal: + if "_roots" not in cls.__dict__: + cls._roots = TrackerDict(lambda k: VeDbusRootTracker(bus, k)) + + return instance + + ## Constructor + # @param bus the bus-object (SESSION or SYSTEM). + # @param serviceName the dbus-service-name (string), for example 'com.victronenergy.battery.ttyO1' + # @param path the object-path, for example '/Dc/V' + # @param eventCallback function that you want to be called on a value change + # @param createSignal only set this to False if you use this function to one time read a value. When + # leaving it to True, make sure to also subscribe to the NameOwnerChanged signal + # elsewhere. See also note some 15 lines up. + def __init__(self, bus, serviceName, path, eventCallback=None, createsignal=True): + # TODO: is it necessary to store _serviceName and _path? Isn't it + # stored in the bus_getobjectsomewhere? + self._serviceName = serviceName + self._path = path + self._match = None + # TODO: _proxy is being used in settingsdevice.py, make a getter for that + self._proxy = bus.get_object(serviceName, path, introspect=False) + self.eventCallback = eventCallback + + assert eventCallback is None or createsignal == True + if createsignal: + self._match = self._proxy.connect_to_signal( + "PropertiesChanged", weak_functor(self._properties_changed_handler)) + self._roots[serviceName].add(self) + + # store the current value in _cachedvalue. When it doesn't exists set _cachedvalue to + # None, same as when a value is invalid + self._cachedvalue = None + try: + v = self._proxy.GetValue() + except dbus.exceptions.DBusException: + pass + else: + self._cachedvalue = unwrap_dbus_value(v) + + def __del__(self): + if self._match is not None: + self._match.remove() + self._match = None + self._proxy = None + + def _refreshcachedvalue(self): + self._cachedvalue = unwrap_dbus_value(self._proxy.GetValue()) + + ## Returns the path as a string, for example '/AC/L1/V' + @property + def path(self): + return self._path + + ## Returns the dbus service name as a string, for example com.victronenergy.vebus.ttyO1 + @property + def serviceName(self): + return self._serviceName + + ## Returns the value of the dbus-item. + # the type will be a dbus variant, for example dbus.Int32(0, variant_level=1) + # this is not a property to keep the name consistant with the com.victronenergy.busitem interface + # returns None when the property is invalid + def get_value(self): + return self._cachedvalue + + ## Writes a new value to the dbus-item + def set_value(self, newvalue): + r = self._proxy.SetValue(wrap_dbus_value(newvalue)) + + # instead of just saving the value, go to the dbus and get it. So we have the right type etc. + if r == 0: + self._refreshcachedvalue() + + return r + + ## Resets the item to its default value + def set_default(self): + self._proxy.SetDefault() + self._refreshcachedvalue() + + ## Returns the text representation of the value. + # For example when the value is an enum/int GetText might return the string + # belonging to that enum value. Another example, for a voltage, GetValue + # would return a float, 12.0Volt, and GetText could return 12 VDC. + # + # Note that this depends on how the dbus-producer has implemented this. + def get_text(self): + return self._proxy.GetText() + + ## Returns true of object path exists, and false if it doesn't + @property + def exists(self): + # TODO: do some real check instead of this crazy thing. + r = False + try: + r = self._proxy.GetValue() + r = True + except dbus.exceptions.DBusException: + pass + + return r + + ## callback for the trigger-event. + # @param eventCallback the event-callback-function. + @property + def eventCallback(self): + return self._eventCallback + + @eventCallback.setter + def eventCallback(self, eventCallback): + self._eventCallback = eventCallback + + ## Is called when the value of the imported bus-item changes. + # Stores the new value in our local cache, and calls the eventCallback, if set. + def _properties_changed_handler(self, changes): + if "Value" in changes: + changes['Value'] = unwrap_dbus_value(changes['Value']) + self._cachedvalue = changes['Value'] + if self._eventCallback: + # The reason behind this try/except is to prevent errors silently ending up the an error + # handler in the dbus code. + try: + self._eventCallback(self._serviceName, self._path, changes) + except: + traceback.print_exc() + os._exit(1) # sys.exit() is not used, since that also throws an exception + + +class VeDbusTreeExport(dbus.service.Object): + def __init__(self, bus, objectPath, service): + dbus.service.Object.__init__(self, bus, objectPath) + self._service = service + logging.debug("VeDbusTreeExport %s has been created" % objectPath) + + def __del__(self): + # self._get_path() will raise an exception when retrieved after the call to .remove_from_connection, + # so we need a copy. + path = self._get_path() + if path is None: + return + self.remove_from_connection() + logging.debug("VeDbusTreeExport %s has been removed" % path) + + def _get_path(self): + if len(self._locations) == 0: + return None + return self._locations[0][1] + + def _get_value_handler(self, path, get_text=False): + logging.debug("_get_value_handler called for %s" % path) + r = {} + px = path + if not px.endswith('/'): + px += '/' + for p, item in self._service._dbusobjects.items(): + if p.startswith(px): + v = item.GetText() if get_text else wrap_dbus_value(item.local_get_value()) + r[p[len(px):]] = v + logging.debug(r) + return r + + @dbus.service.method('com.victronenergy.BusItem', out_signature='v') + def GetValue(self): + value = self._get_value_handler(self._get_path()) + return dbus.Dictionary(value, signature=dbus.Signature('sv'), variant_level=1) + + @dbus.service.method('com.victronenergy.BusItem', out_signature='v') + def GetText(self): + return self._get_value_handler(self._get_path(), True) + + def local_get_value(self): + return self._get_value_handler(self.path) + +class VeDbusRootExport(VeDbusTreeExport): + @dbus.service.signal('com.victronenergy.BusItem', signature='a{sa{sv}}') + def ItemsChanged(self, changes): + pass + + @dbus.service.method('com.victronenergy.BusItem', out_signature='a{sa{sv}}') + def GetItems(self): + return { + path: { + 'Value': wrap_dbus_value(item.local_get_value()), + 'Text': item.GetText() } + for path, item in self._service._dbusobjects.items() + } + + +class VeDbusItemExport(dbus.service.Object): + ## Constructor of VeDbusItemExport + # + # Use this object to export (publish), values on the dbus + # Creates the dbus-object under the given dbus-service-name. + # @param bus The dbus object. + # @param objectPath The dbus-object-path. + # @param value Value to initialize ourselves with, defaults to None which means Invalid + # @param description String containing a description. Can be called over the dbus with GetDescription() + # @param writeable what would this do!? :). + # @param callback Function that will be called when someone else changes the value of this VeBusItem + # over the dbus. First parameter passed to callback will be our path, second the new + # value. This callback should return True to accept the change, False to reject it. + def __init__(self, bus, objectPath, value=None, description=None, writeable=False, + onchangecallback=None, gettextcallback=None, deletecallback=None, + valuetype=None): + dbus.service.Object.__init__(self, bus, objectPath) + self._onchangecallback = onchangecallback + self._gettextcallback = gettextcallback + self._value = value + self._description = description + self._writeable = writeable + self._deletecallback = deletecallback + self._type = valuetype + + # To force immediate deregistering of this dbus object, explicitly call __del__(). + def __del__(self): + # self._get_path() will raise an exception when retrieved after the + # call to .remove_from_connection, so we need a copy. + path = self._get_path() + if path == None: + return + if self._deletecallback is not None: + self._deletecallback(path) + self.remove_from_connection() + logging.debug("VeDbusItemExport %s has been removed" % path) + + def _get_path(self): + if len(self._locations) == 0: + return None + return self._locations[0][1] + + ## Sets the value. And in case the value is different from what it was, a signal + # will be emitted to the dbus. This function is to be used in the python code that + # is using this class to export values to the dbus. + # set value to None to indicate that it is Invalid + def local_set_value(self, newvalue): + changes = self._local_set_value(newvalue) + if changes is not None: + self.PropertiesChanged(changes) + + def _local_set_value(self, newvalue): + if self._value == newvalue: + return None + + self._value = newvalue + return { + 'Value': wrap_dbus_value(newvalue), + 'Text': self.GetText() + } + + def local_get_value(self): + return self._value + + # ==== ALL FUNCTIONS BELOW THIS LINE WILL BE CALLED BY OTHER PROCESSES OVER THE DBUS ==== + + ## Dbus exported method SetValue + # Function is called over the D-Bus by other process. It will first check (via callback) if new + # value is accepted. And it is, stores it and emits a changed-signal. + # @param value The new value. + # @return completion-code When successful a 0 is return, and when not a -1 is returned. + @dbus.service.method('com.victronenergy.BusItem', in_signature='v', out_signature='i') + def SetValue(self, newvalue): + if not self._writeable: + return 1 # NOT OK + + newvalue = unwrap_dbus_value(newvalue) + + # If value type is enforced, cast it. If the type can be coerced + # python will do it for us. This allows ints to become floats, + # or bools to become ints. Additionally also allow None, so that + # a path may be invalidated. + if self._type is not None and newvalue is not None: + try: + newvalue = self._type(newvalue) + except (ValueError, TypeError): + return 1 # NOT OK + + if newvalue == self._value: + return 0 # OK + + # call the callback given to us, and check if new value is OK. + if (self._onchangecallback is None or + (self._onchangecallback is not None and self._onchangecallback(self.__dbus_object_path__, newvalue))): + + self.local_set_value(newvalue) + return 0 # OK + + return 2 # NOT OK + + ## Dbus exported method GetDescription + # + # Returns the a description. + # @param language A language code (e.g. ISO 639-1 en-US). + # @param length Lenght of the language string. + # @return description + @dbus.service.method('com.victronenergy.BusItem', in_signature='si', out_signature='s') + def GetDescription(self, language, length): + return self._description if self._description is not None else 'No description given' + + ## Dbus exported method GetValue + # Returns the value. + # @return the value when valid, and otherwise an empty array + @dbus.service.method('com.victronenergy.BusItem', out_signature='v') + def GetValue(self): + return wrap_dbus_value(self._value) + + ## Dbus exported method GetText + # Returns the value as string of the dbus-object-path. + # @return text A text-value. '---' when local value is invalid + @dbus.service.method('com.victronenergy.BusItem', out_signature='s') + def GetText(self): + if self._value is None: + return '---' + + # Default conversion from dbus.Byte will get you a character (so 'T' instead of '84'), so we + # have to convert to int first. Note that if a dbus.Byte turns up here, it must have come from + # the application itself, as all data from the D-Bus should have been unwrapped by now. + if self._gettextcallback is None and type(self._value) == dbus.Byte: + return str(int(self._value)) + + if self._gettextcallback is None and self.__dbus_object_path__ == '/ProductId': + return "0x%X" % self._value + + if self._gettextcallback is None: + return str(self._value) + + return self._gettextcallback(self.__dbus_object_path__, self._value) + + ## The signal that indicates that the value has changed. + # Other processes connected to this BusItem object will have subscribed to the + # event when they want to track our state. + @dbus.service.signal('com.victronenergy.BusItem', signature='a{sv}') + def PropertiesChanged(self, changes): + pass + +## This class behaves like a regular reference to a class method (eg. self.foo), but keeps a weak reference +## to the object which method is to be called. +## Use this object to break circular references. +class weak_functor: + def __init__(self, f): + self._r = weakref.ref(f.__self__) + self._f = weakref.ref(f.__func__) + + def __call__(self, *args, **kargs): + r = self._r() + f = self._f() + if r == None or f == None: + return + f(r, *args, **kargs) diff --git a/NodeRed/dbus-fzsonick-48tl/start.sh b/NodeRed/dbus-fzsonick-48tl/start.sh new file mode 100755 index 000000000..d818ffc57 --- /dev/null +++ b/NodeRed/dbus-fzsonick-48tl/start.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +. /opt/victronenergy/serial-starter/run-service.sh + +app=/opt/victronenergy/dbus-fzsonick-48tl/dbus-fzsonick-48tl.py +args="$tty" +start $args diff --git a/NodeRed/dvcc.py b/NodeRed/dvcc.py new file mode 100644 index 000000000..3a6720892 --- /dev/null +++ b/NodeRed/dvcc.py @@ -0,0 +1,1287 @@ +from dbus.exceptions import DBusException +from gi.repository import GLib +import logging +from math import pi, floor, ceil +import traceback +from itertools import count, chain +from functools import partial, wraps + +# Victron packages +from sc_utils import safeadd, copy_dbus_value, reify, ExpiringValue +from ve_utils import exit_on_error + +from delegates.base import SystemCalcDelegate +from delegates.batteryservice import BatteryService +from delegates.multi import Multi as MultiService + +# Adjust things this often (in seconds) +# solar chargers has to switch to HEX mode each time we write a value to its +# D-Bus service. Writing too often may block text messages. In MPPT firmware +# v1.23 and later, all relevant values will be transmitted as asynchronous +# message, so the update rate could be increased. For now, keep this at 3 and +# above. +ADJUST = 3 + +VEBUS_FIRMWARE_REQUIRED = 0x422 +VEDIRECT_FIRMWARE_REQUIRED = 0x129 +VECAN_FIRMWARE_REQUIRED = 0x10200 # 1.02, 24-bit version + +# This is a place to account for some BMS quirks where we may have to ignore +# the BMS value and substitute our own. + +def _byd_quirk(dvcc, bms, charge_voltage, charge_current, feedback_allowed): + """ Quirk for the BYD batteries. When the battery sends CCL=0, float it at + 55V. """ + if charge_current == 0: + return (55, 40, feedback_allowed, False) + return (charge_voltage, charge_current, feedback_allowed, False) + +def _lg_quirk(dvcc, bms, charge_voltage, charge_current, feedback_allowed): + """ Quirk for LG batteries. The hard limit is 58V. Above that you risk + tripping on high voltage. The batteries publish a charge voltage of 57.7V + but we need to make room for an 0.4V overvoltage when feed-in is enabled. + """ + # Make room for a potential 0.4V at the top + return (min(charge_voltage, 57.3), charge_current, feedback_allowed, False) + +def _pylontech_quirk(dvcc, bms, charge_voltage, charge_current, feedback_allowed): + """ Quirk for Pylontech. Make a bit of room at the top. Pylontech says that + at 51.8V the battery is 95% full, and that balancing starts at 90%. + 53.2V is normally considered 100% full, and 54V raises an alarm. By + running the battery at 52.4V it will be 99%-100% full, balancing should + be active, and we should avoid high voltage alarms. + + Identify 24-V batteries by the lower charge voltage, and do the same + thing with an 8-to-15 cell ratio, +-3.48V per cell. + """ + # Use 3.48V per cell plus a little, 52.4V for 15 cell 48V batteries. + # Use 3.46V per cell plus a little, 27.8V for 24V batteries testing shows that's 100% SOC. + # That leaves 1.6V margin for 48V batteries and 1.0V for 24V. + # See https://github.com/victronenergy/venus/issues/536 + if charge_voltage > 55: + # 48V battery (16 cells.) Assume BMS knows what it's doing. + return (charge_voltage, charge_current, feedback_allowed, False) + if charge_voltage > 30: + # 48V battery (15 cells) + return (min(charge_voltage, 52.4), charge_current, feedback_allowed, False) + if charge_voltage > 20: + # 24V battery (8 cells). 24V batteries send CCL=0 when they are full, + # whereas the 48V batteries reduce CCL by 50% when the battery is full. + # Do the same for 24V batteries. The normal limit is C/2, so put the + # limit to C/4. Note that this is just a nicety, the important part is + # to clip the charge voltage to 27.8 volts. That fixes the sawtooth + # issue. + capacity = bms.capacity or 55 + return (min(charge_voltage, 27.8), max(charge_current, round(capacity/4.0)), feedback_allowed, False) + + # Not known, probably a 12V battery. + return (charge_voltage, charge_current, feedback_allowed, False) + +def _pylontech_pelio_quirk(dvcc, bms, charge_voltage, charge_current, feedback_allowed): + """ Quirk for Pelio-L batteries. This is a 16-cell battery. 56V is 3.5V per + cell which is where this battery registers 100% SOC. Battery sends + CCL=0 at 3.55V per cell, to ensure good feed-in of excess DC coupled + PV, set the lower limit to 20% of capacity, which is what the battery + itself imposes at around 98% SOC. + """ + capacity = bms.capacity or 100.0 + return (min(charge_voltage, 56.0), max(charge_current, round(capacity/5.0)), feedback_allowed, False) + +def _lynx_smart_bms_quirk(dvcc, bms, charge_voltage, charge_current, feedback_allowed): + """ When the Lynx Smart BMS sends CCL=0, it wants all chargers to stop. """ + return (charge_voltage, charge_current, feedback_allowed, True) + +QUIRKS = { + 0xB004: _lg_quirk, + 0xB009: _pylontech_quirk, + 0xB00A: _byd_quirk, + 0xB015: _byd_quirk, + 0xB019: _byd_quirk, + 0xB029: _pylontech_pelio_quirk, + 0xA3E5: _lynx_smart_bms_quirk, + 0xA3E6: _lynx_smart_bms_quirk, +} + +def distribute(current_values, max_values, increment): + """ current_values and max_values are lists of equal size containing the + current limits, and the maximum they can be increased to. increment + contains the amount by which we want to increase the total, ie the sum + of the values in current_values, while staying below max_values. + + This is done simply by first attempting to spread the increment + equally. If a value exceeds the max in that process, the remainder is + thrown back into the pot and distributed equally among the rest. + + Negative values are also handled, and zero is assumed to be the + implicit lower limit. """ + n = cn = len(current_values) + new_values = [-1] * n + for j in range(0, n): + for i, mv, av in zip(count(), max_values, current_values): + assert mv >= 0 + if new_values[i] == mv or new_values[i] == 0: + continue + nv = av + float(increment) / cn + + if nv >= mv: + increment += av - mv + cn -= 1 + new_values[i] = mv + break + elif nv < 0: + increment += av + cn -= 1 + new_values[i] = 0 + break + + new_values[i] = nv + else: + break + continue + return new_values + +class LowPassFilter(object): + """ Low pass filter, with a cap. """ + def __init__(self, omega, value): + self.omega = omega + self._value = value + + def update(self, newvalue): + self._value += (newvalue - self._value) * self.omega + return self._value + + @property + def value(self): + return self._value + +class BaseCharger(object): + def __init__(self, monitor, service): + self.monitor = monitor + self.service = service + + def _get_path(self, path): + return self.monitor.get_value(self.service, path) + + def _set_path(self, path, v): + if self.monitor.seen(self.service, path): + self.monitor.set_value_async(self.service, path, v) + + @property + def firmwareversion(self): + return self.monitor.get_value(self.service, '/FirmwareVersion') + + @property + def product_id(self): + return self.monitor.get_value(self.service, '/ProductId') or 0 + + @property + def chargecurrent(self): + return self._get_path('/Dc/0/Current') + + @property + def n2k_device_instance(self): + return self.monitor.get_value(self.service, '/N2kDeviceInstance') + + @property + def connection(self): + return self._get_path('/Mgmt/Connection') + + @property + def active(self): + return self._get_path('/State') != 0 + + @property + def has_externalcontrol_support(self): + """ Override this to implement detection of external control support. + """ + return False + + @property + def want_bms(self): + """ Indicates whether this solar charger was previously + controlled by a BMS and therefore expects one to + be present. """ + return 0 + + @property + def maxchargecurrent(self): + v = self._get_path('/Link/ChargeCurrent') + return v if v is not None else self.currentlimit + + @maxchargecurrent.setter + def maxchargecurrent(self, v): + v = max(0, min(v, self.currentlimit)) + self._set_path('/Link/ChargeCurrent', v) + + @property + def chargevoltage(self): + return self._get_path('/Link/ChargeVoltage') + + @chargevoltage.setter + def chargevoltage(self, v): + self._set_path('/Link/ChargeVoltage', v) + + @property + def currentlimit(self): + return self._get_path('/Settings/ChargeCurrentLimit') + + def maximize_charge_current(self): + """ Max out the charge current of this solar charger by setting + ChargeCurrent to the configured limit in settings. """ + if self.monitor.seen(self.service, '/Link/ChargeCurrent'): + copy_dbus_value(self.monitor, + self.service, '/Settings/ChargeCurrentLimit', + self.service, '/Link/ChargeCurrent') + + @property + def smoothed_current(self): + # For chargers that are not solar-chargers, the generated current + # should be fairly stable already + return self.chargecurrent or 0 + +class Networkable(object): + """ Mix into BaseCharger to support network paths. """ + @property + def networkmode(self): + return self._get_path('/Link/NetworkMode') + + @networkmode.setter + def networkmode(self, v): + self._set_path('/Link/NetworkMode', 0) + self._set_path('/Settings/BmsPresent',0) + +class SolarCharger(BaseCharger, Networkable): + """ Encapsulates a solar charger on dbus. Exposes dbus paths as convenient + attributes. """ + + def __init__(self, monitor, service): + super().__init__(monitor, service) + self._smoothed_current = LowPassFilter((2 * pi)/20, self.chargecurrent or 0) + self._has_externalcontrol_support = False + + @property + def has_externalcontrol_support(self): + # If we have previously determined that there is support, re-use that. + # If the firmware is ever to be downgraded, the solarcharger must necessarily + # disconnect and reconnect, so this is completely safe. + if self._has_externalcontrol_support: + return True + + # These products are known to have support, but may have older firmware + # See https://github.com/victronenergy/venus/issues/655 + if 0xA102 <= self.product_id <= 0xA10E: + self._has_externalcontrol_support = True + return True + + v = self.firmwareversion + + # If the firmware version is not known, don't raise a false + # warning. + if v is None: + return True + + # New VE.Can controllers have 24-bit version strings. One would + # hope that any future VE.Direct controllers with 24-bit firmware + # versions will 1) have a version larger than 1.02 and 2) support + # external control. + if v & 0xFF0000: + self._has_externalcontrol_support = (v >= VECAN_FIRMWARE_REQUIRED) + else: + self._has_externalcontrol_support = (v >= VEDIRECT_FIRMWARE_REQUIRED) + return self._has_externalcontrol_support + + @property + def smoothed_current(self): + """ Returns the internal low-pass filtered current value. """ + return self._smoothed_current.value + + def update_values(self): + # This is called periodically from a timer to maintain + # a smooth current value. + v = self.monitor.get_value(self.service, '/Dc/0/Current') + if v is not None: + self._smoothed_current.update(v) + +class Alternator(BaseCharger, Networkable): + """ This also includes other DC/DC converters. """ + @property + def has_externalcontrol_support(self): + # If it has the ChargeCurrent path, we assume it has + # external control support + return self.monitor.seen(self.service, '/Link/ChargeCurrent') + +class InverterCharger(SolarCharger): + """ Encapsulates an inverter/charger object, currently the inverter RS, + which has a solar input and can charge the battery like a solar + charger, but is also an inverter. + """ + def __init__(self, monitor, service): + super(InverterCharger, self).__init__(monitor, service) + + @property + def has_externalcontrol_support(self): + # Inverter RS always had support + return True + + @property + def maxdischargecurrent(self): + """ Returns discharge current setting. This does nothing except + return the previously set value. """ + return self.monitor.get_value(self.service, '/Link/DischargeCurrent') + + @maxdischargecurrent.setter + def maxdischargecurrent(self, limit): + self.monitor.set_value_async(self.service, '/Link/DischargeCurrent', limit) + + def set_maxdischargecurrent(self, limit): + """ Write the maximum discharge limit across. The firmware + already handles a zero by turning off. """ + self.maxdischargecurrent = limit + + @property + def active(self): + # The charger part is active, as long as the maximum charging + # power value is more than zero. + return (self.monitor.get_value(self.service, + '/Settings/ChargeCurrentLimit') or 0) > 0 + +class InverterSubsystem(object): + """ Encapsulate collection of inverters. """ + def __init__(self, monitor): + self.monitor = monitor + self._inverters = {} + + def _add_inverter(self, ob): + self._inverters[ob.service] = ob + return ob + + def remove_inverter(self, service): + del self._inverters[service] + + def __iter__(self): + return iter(self._inverters.values()) + + def __len__(self): + return len(self._inverters) + + def __contains__(self, k): + return k in self._inverters + + def set_maxdischargecurrent(self, limit): + # Inverters only care about limit=0, so simply send + # it to all. + for inverter in self: + inverter.set_maxdischargecurrent(limit) + +class ChargerSubsystem(object): + """ Encapsulates a collection of chargers or devices that incorporate a + charger, to collectively make up a charging system (sans Multi). + Properties related to the whole system or some combination of the + individual chargers are exposed here as attributes. """ + def __init__(self, monitor): + self.monitor = monitor + self._solarchargers = {} + self._otherchargers = {} + + def add_solar_charger(self, service): + self._solarchargers[service] = charger = SolarCharger(self.monitor, service) + return charger + + def add_alternator(self, service): + self._otherchargers[service] = charger = Alternator(self.monitor, service) + return charger + + def add_invertercharger(self, service): + self._solarchargers[service] = inverter = InverterCharger(self.monitor, service) + return inverter + + def remove_charger(self, service): + for di in (self._solarchargers, self._otherchargers): + try: + del di[service] + except KeyError: + pass + + def __iter__(self): + return iter(chain(self._solarchargers.values(), self._otherchargers.values())) + + def __len__(self): + return len(self._solarchargers) + len(self._otherchargers) + + def __contains__(self, k): + return k in self._solarchargers or k in self._otherchargers + + @property + def has_externalcontrol_support(self): + # Only consider solarchargers. This is used for firmware warning + # above, and we only care about the solar chargers there. + return all(s.has_externalcontrol_support for s in self._solarchargers.values()) + + @property + def has_vecan_chargers(self): + """ Returns true if we have any VE.Can chargers in the system. This is + used elsewhere to enable broadcasting charge voltages on the relevant + can device. """ + return any((s.connection == 'VE.Can' for s in self)) + + @property + def want_bms(self): + """ Return true if any of our solar chargers expect a BMS to + be present. """ + return any((s.want_bms for s in self)) + + @property + def totalcapacity(self): + """ Total capacity if all chargers are running at full power. """ + return safeadd(*(c.currentlimit for c in self)) + + @property + def smoothed_current(self): + """ Total smoothed current, calculated by adding the smoothed current + of the individual chargers. """ + return safeadd(*(c.smoothed_current for c in self)) or 0 + + @property + def solar_current(self): + return safeadd(*(c.smoothed_current for c in self._solarchargers.values())) or 0 + + def maximize_charge_current(self): + """ Max out all chargers. """ + for charger in self: + charger.maximize_charge_current() + + def shutdown_chargers(self): + """ Shut down all chargers. """ + for charger in self: + charger.maxchargecurrent = 0 + + def set_networked(self, has_bms, bms_charge_voltage, charge_voltage, max_charge_current, feedback_allowed, stop_on_mcc0): + """ This is the main entry-point into the solar charger subsystem. This + sets all chargers to the same charge_voltage, and distributes + max_charge_current between the chargers. If feedback_allowed, then + we simply max out the chargers. We also don't bother with + distribution if there's only one charger in the system or if + it exceeds our total capacity. + """ + # Network mode: + # bit 0: Operated in network environment + # bit 2: Remote Hub-1 control (MPPT will accept charge voltage and max charge current) + # bit 3: Remote BMS control (MPPT enter BMS mode) + network_mode = 1 | (0 if charge_voltage is None and max_charge_current is None else 4) | (8 if has_bms else 0) + network_mode_written = False + for charger in self: + charger.networkmode = network_mode + network_mode_written = True + + # Distribute the voltage setpoint to all solar chargers. + # Non-solar chargers are controlled elsewhere. + voltage_written = 0 + if charge_voltage is not None: + voltage_written = int(len(self)>0) + for charger in self._solarchargers.values(): + charger.chargevoltage = charge_voltage + + # Distribute the original BMS voltage setpoint, if there is one, + # to the other chargers + if bms_charge_voltage is not None: + for charger in self._otherchargers.values(): + charger.chargevoltage = bms_charge_voltage + + # Do not limit max charge current when feedback is allowed. The + # rationale behind this is that MPPT charge power should match the + # capabilities of the battery. If the default charge algorithm is used + # by the MPPTs, the charge current should stay within limits. This + # avoids a problem that we do not know if extra MPPT power will be fed + # back to the grid when we decide to increase the MPPT max charge + # current. + # + # Additionally, don't bother with chargers that are disconnected. + chargers = [x for x in self._solarchargers.values() if x.active and x.maxchargecurrent is not None and x.n2k_device_instance in (0, None)] + if len(chargers) > 0: + if stop_on_mcc0 and max_charge_current == 0: + self.shutdown_chargers() + elif feedback_allowed: + self.maximize_charge_current() + elif max_charge_current is not None: + if len(chargers) == 1: + # The simple case: Only one charger. Simply assign the + # limit to the charger + sc = chargers[0] + cc = min(ceil(max_charge_current), sc.currentlimit) + sc.maxchargecurrent = cc + elif max_charge_current > self.totalcapacity * 0.95: + # Another simple case, we're asking for more than our + # combined capacity (with a 5% margin) + self.maximize_charge_current() + else: + # The hard case, we have more than one CC and we want + # less than our capacity. + self._distribute_current(chargers, max_charge_current) + + # Split remainder over other chargers, according to individual + # capacity. Only consider controllable devices. + if max_charge_current is not None: + remainder = max(0.0, max_charge_current - self.solar_current) + controllable = [c for c in self._otherchargers.values() if c.has_externalcontrol_support] + capacity = safeadd(*(c.currentlimit for c in controllable)) or 0 + if capacity > 0: + for c in controllable: + c.maxchargecurrent = remainder * c.currentlimit / capacity + + # Return flags of what we did + return voltage_written, int(network_mode_written and max_charge_current is not None), network_mode + + # The math for the below is as follows. Let c be the total capacity of the + # charger, l be the current limit, a the actual current it produces, k the + # total current limit for the two chargers, and m the margin (l - a) + # between the limit and what is produced. + # + # We want m/c to be the same for all our chargers. + # + # Expression 1: (l1-a1)/c1 == (l2-a2)/c2 + # Expression 2: l1 + l2 == k + # + # Solving that yields the expression below. + @staticmethod + def _balance_chargers(charger1, charger2, l1, l2): + c1, c2 = charger1.currentlimit, charger2.currentlimit + a1 = min(charger1.smoothed_current, c1) + a2 = min(charger2.smoothed_current, c2) + k = l1 + l2 + + try: + l1 = round((c2 * a1 - c1 * a2 + k * c1)/(c1 + c2), 1) + except ArithmeticError: + return l1, l2 # unchanged + else: + l1 = max(min(l1, c1), 0) + return l1, k - l1 + + @staticmethod + def _distribute_current(chargers, max_charge_current): + """ This is called if there are two or more solar chargers. It + distributes the charge current over all of them. """ + + # Take the difference between the values and spread it over all + # the chargers. The maxchargecurrents of the chargers should ideally + # always add up to the whole. + limits = [c.maxchargecurrent for c in chargers] + ceilings = [c.currentlimit for c in chargers] + + # We cannot have a max_charge_current higher than the sum of the + # ceilings. + max_charge_current = min(sum(ceilings), max_charge_current) + + + # Check how far we have to move our adjustment. If it doesn't have to + # move much (or at all), then just balance the charge limits. Our + # threshold for doing an additional distribution of charge is relative + # to the number of chargers, as it makes no sense to attempt a + # distribution if there is too little to be gained. The chosen value + # here is 100mA per charger. + delta = max_charge_current - sum(limits) + if abs(delta) > 0.1 * len(chargers): + limits = distribute(limits, ceilings, delta) + for charger, limit in zip(chargers, limits): + charger.maxchargecurrent = limit + else: + # Balance the limits so they have the same headroom at the top. + # Each charger is balanced against its neighbour, the one at the + # end is paired with the one at the start. + limits = [] + r = chargers[0].maxchargecurrent + for c1, c2 in zip(chargers, chargers[1:]): + l, r = ChargerSubsystem._balance_chargers(c1, c2, r, c2.maxchargecurrent) + limits.append(l) + l, limits[0] = ChargerSubsystem._balance_chargers(c2, chargers[0], r, limits[0]) + limits.append(l) + + for charger, limit in zip(chargers, limits): + charger.maxchargecurrent = limit + + def update_values(self): + # This is called periodically from a timer to update contained + # solar chargers with values that they track. + for charger in self: + try: + charger.update_values() + except AttributeError: + pass + +class BatteryOperationalLimits(object): + """ Only used to encapsulate this part of the Multi's functionality. + """ + def __init__(self, multi): + self._multi = multi + + def _property(path, self): + # Due to the use of partial, path and self is reversed. + return self._multi.monitor.get_value(self._multi.service, path) + + def _set_property(path, self, v): + # None of these values can be negative + if v is not None: + v = max(0, v) + self._multi.monitor.set_value_async(self._multi.service, path, v) + + chargevoltage = property( + partial(_property, '/BatteryOperationalLimits/MaxChargeVoltage'), + partial(_set_property, '/BatteryOperationalLimits/MaxChargeVoltage')) + maxchargecurrent = property( + partial(_property, '/BatteryOperationalLimits/MaxChargeCurrent'), + partial(_set_property, '/BatteryOperationalLimits/MaxChargeCurrent')) + maxdischargecurrent = property( + partial(_property, '/BatteryOperationalLimits/MaxDischargeCurrent'), + partial(_set_property, '/BatteryOperationalLimits/MaxDischargeCurrent')) + batterylowvoltage = property( + partial(_property, '/BatteryOperationalLimits/BatteryLowVoltage'), + partial(_set_property, '/BatteryOperationalLimits/BatteryLowVoltage')) + + +class Multi(object): + """ Encapsulates the multi. Makes access to dbus paths a bit neater by + exposing them as attributes. """ + def __init__(self, monitor, service): + self.monitor = monitor + self._service = service + self.bol = BatteryOperationalLimits(self) + self._dc_current = LowPassFilter((2 * pi)/30, 0) + self._v = object() + + @property + def service(self): + return getattr(MultiService.instance.vebus_service, 'service', None) + + @property + def active(self): + return self.service is not None + + @property + def ac_connected(self): + return self.monitor.get_value(self.service, '/Ac/ActiveIn/Connected') == 1 + + @property + def has_bolframe(self): + return self.monitor.get_value(self.service, '/FirmwareFeatures/BolFrame') == 1 + + @property + def has_ess_assistant(self): + # We do not analyse the content of /Devices/0/Assistants, because that + # would require us to keep a list of ESS assistant version numbers (see + # VebusSocWriter._hub2_assistant_ids). Because that list is expected to + # change (unlike the list of hub-2 assistants), we use + # /Hub4/AssistantId to check the presence. It is guaranteed that + # /Hub4/AssistantId will be published before /Devices/0/Assistants. + assistants = self.monitor.get_value(self.service, '/Devices/0/Assistants') + return assistants is not None and \ + self.monitor.get_value(self.service, '/Hub4/AssistantId') == 5 + + @property + def dc_current(self): + """ Return a low-pass smoothed current. """ + return self._dc_current.value + + @property + def hub_voltage(self): + return self.monitor.get_value(self.service, '/Hub/ChargeVoltage') + + @property + def maxchargecurrent(self): + return self.monitor.get_value(self.service, '/Dc/0/MaxChargeCurrent') + + @maxchargecurrent.setter + def maxchargecurrent(self, v): + # If the Multi is not ready, don't write to it just yet + if self.active and self.maxchargecurrent is not None and v != self._v: + # The maximum present charge current is 6-parallel 12V 5kva units, 6*220 = 1320A. + # We will consider 10000A to be impossibly high. + self.monitor.set_value_async(self.service, '/Dc/0/MaxChargeCurrent', 10000 if v is None else v) + self._v = v + + @property + def state(self): + return self.monitor.get_value(self.service, '/State') + + @property + def feedin_enabled(self): + return self.monitor.get_value(self.service, + '/Hub4/L1/DoNotFeedInOvervoltage') == 0 + + @property + def firmwareversion(self): + return self.monitor.get_value(self.service, '/FirmwareVersion') + + @property + def allow_to_charge(self): + return self.monitor.get_value(self.service, '/Bms/AllowToCharge') != 0 + + @property + def has_vebus_bms(self): + """ This checks that we have a VE.Bus BMS. """ + return self.monitor.get_value(self.service, '/Bms/BmsType') == 2 + + @property + def has_vebus_bmsv2(self): + """ Checks that we have v2 of the VE.Bus BMS, but also that we can + properly use it, that is we also have an mk3. """ + version = self.monitor.get_value(self.service, '/Devices/Bms/Version') + atc = self.monitor.get_value(self.service, '/Bms/AllowToCharge') + + # If AllowToCharge is defined, but we have no version, then the Multi + # is off, but we still have a v2 BMS. V1 goes invalid if the multi + # is off. Yes, this is kludgy, but it is less kludgy than the + # fix the other end would require. + if self.has_vebus_bms and atc is not None and version is None: + return True + + # Otherwise, if the Multi is on, check the version to see if we should + # enable v2 functionality. + return (version or 0) >= 1146100 and \ + self.monitor.get_value(self.service, '/Interfaces/Mk2/ProductName') == 'MK3' + + def update_values(self, limit): + c = self.monitor.get_value(self.service, '/Dc/0/Current', 0) + if c is not None: + # Cap the filter at a limit. If we don't do this, dc currents + # in excess of our capacity causes a kind of wind-up that delays + # backing-off when the load drops suddenly. + if limit is not None: + c = max(c, -limit) + self._dc_current.update(c) + +class Dvcc(SystemCalcDelegate): + """ This is the main DVCC delegate object. """ + def __init__(self, sc): + super(Dvcc, self).__init__() + self.systemcalc = sc + self._chargesystem = None + self._vecan_services = [] + self._timer = None + self._tickcount = ADJUST + self._dcsyscurrent = LowPassFilter((2 * pi)/20, 0.0) + self._internal_mcp = ExpiringValue(3, None) # Max charging power + + def get_input(self): + return [ + ('com.victronenergy.vebus', [ + '/Ac/ActiveIn/Connected', + '/Hub/ChargeVoltage', + '/Dc/0/Current', + '/Dc/0/MaxChargeCurrent', + '/State', + '/BatteryOperationalLimits/BatteryLowVoltage', + '/BatteryOperationalLimits/MaxChargeCurrent', + '/BatteryOperationalLimits/MaxChargeVoltage', + '/BatteryOperationalLimits/MaxDischargeCurrent', + '/Bms/AllowToCharge', + '/Bms/BmsType', + '/Devices/Bms/Version', + '/FirmwareFeatures/BolFrame', + '/Hub4/L1/DoNotFeedInOvervoltage', + '/FirmwareVersion', + '/Interfaces/Mk2/ProductName']), + ('com.victronenergy.solarcharger', [ + '/ProductId', + '/Dc/0/Current', + '/Link/NetworkMode', + '/Link/ChargeVoltage', + '/Link/ChargeCurrent', + '/Settings/ChargeCurrentLimit', + '/State', + '/FirmwareVersion', + '/N2kDeviceInstance', + '/Mgmt/Connection', + '/Settings/BmsPresent']), + ('com.victronenergy.alternator', [ + '/ProductId', + '/Dc/0/Voltage', + '/Dc/0/Current', + '/Link/NetworkMode', + '/Link/ChargeVoltage', + '/Link/ChargeCurrent', + '/Settings/ChargeCurrentLimit', + '/State', + '/FirmwareVersion', + '/N2kDeviceInstance', + '/Mgmt/Connection', + '/Settings/BmsPresent']), + ('com.victronenergy.inverter', [ + '/ProductId', + '/Dc/0/Current', + '/IsInverterCharger', + '/Link/NetworkMode', + '/Link/ChargeVoltage', + '/Link/ChargeCurrent', + '/Link/DischargeCurrent', + '/Settings/ChargeCurrentLimit', + '/State', + '/N2kDeviceInstance', + '/Mgmt/Connection', + '/Settings/BmsPresent']), + ('com.victronenergy.multi', [ + '/ProductId', + '/Dc/0/Current', + '/IsInverterCharger', + '/Link/ChargeCurrent', + '/Link/DischargeCurrent', + '/Settings/ChargeCurrentLimit', + '/State', + '/N2kDeviceInstance', + '/Mgmt/Connection', + '/Settings/BmsPresent']), + ('com.victronenergy.vecan', [ + '/Link/ChargeVoltage', + '/Link/NetworkMode']), + ('com.victronenergy.settings', [ + '/Settings/CGwacs/OvervoltageFeedIn', + '/Settings/Services/Bol'])] + + def get_settings(self): + return [ + ('maxchargecurrent', '/Settings/SystemSetup/MaxChargeCurrent', -1, -1, 10000), + ('maxchargevoltage', '/Settings/SystemSetup/MaxChargeVoltage', 0.0, 0.0, 80.0), + ('bol', '/Settings/Services/Bol', 0, 0, 7) + ] + + def set_sources(self, dbusmonitor, settings, dbusservice): + SystemCalcDelegate.set_sources(self, dbusmonitor, settings, dbusservice) + self._chargesystem = ChargerSubsystem(dbusmonitor) + self._inverters = InverterSubsystem(dbusmonitor) + self._multi = Multi(dbusmonitor, dbusservice) + + self._dbusservice.add_path('/Control/SolarChargeVoltage', value=0) + self._dbusservice.add_path('/Control/SolarChargeCurrent', value=0) + self._dbusservice.add_path('/Control/EffectiveChargeVoltage', value=None) + self._dbusservice.add_path('/Control/BmsParameters', value=0) + self._dbusservice.add_path('/Control/MaxChargeCurrent', value=0) + self._dbusservice.add_path('/Control/Dvcc', value=self.has_dvcc) + self._dbusservice.add_path('/Debug/BatteryOperationalLimits/SolarVoltageOffset', value=0, writeable=True) + self._dbusservice.add_path('/Debug/BatteryOperationalLimits/VebusVoltageOffset', value=0, writeable=True) + self._dbusservice.add_path('/Debug/BatteryOperationalLimits/CurrentOffset', value=0, writeable=True) + self._dbusservice.add_path('/Dvcc/Alarms/FirmwareInsufficient', value=0) + self._dbusservice.add_path('/Dvcc/Alarms/MultipleBatteries', value=0) + + def device_added(self, service, instance, do_service_change=True): + service_type = service.split('.')[2] + if service_type == 'solarcharger': + self._chargesystem.add_solar_charger(service) + elif service_type in ('inverter', 'multi'): + if self._dbusmonitor.get_value(service, '/IsInverterCharger') == 1: + # Add to both the solarcharger and inverter collections. + # add_invertercharger returns an object that can be directly + # added to the inverter collection. + self._inverters._add_inverter( + self._chargesystem.add_invertercharger(service)) + elif service_type == 'vecan': + self._vecan_services.append(service) + elif service_type == 'alternator': + self._chargesystem.add_alternator(service) + elif service_type == 'battery': + pass # install timer below + else: + # Skip timer code below + return + + if self._timer is None: + self._timer = GLib.timeout_add(1000, exit_on_error, self._on_timer) + + def device_removed(self, service, instance): + if service in self._chargesystem: + self._chargesystem.remove_charger(service) + # Some solar chargers are inside an inverter + if service in self._inverters: + self._inverters.remove_inverter(service) + elif service in self._vecan_services: + self._vecan_services.remove(service) + elif service in self._inverters: + self._inverters.remove_inverter(service) + if len(self._chargesystem) == 0 and len(self._vecan_services) == 0 and \ + len(BatteryService.instance.batteries) == 0 and self._timer is not None: + GLib.source_remove(self._timer) + self._timer = None + + def _property(path, self): + # Due to the use of partial, path and self is reversed. + try: + return float(self._dbusservice[path]) + except ValueError: + return None + + solarvoltageoffset = property(partial(_property, '/Debug/BatteryOperationalLimits/SolarVoltageOffset')) + invertervoltageoffset = property(partial(_property, '/Debug/BatteryOperationalLimits/VebusVoltageOffset')) + currentoffset = property(partial(_property, '/Debug/BatteryOperationalLimits/CurrentOffset')) + + @property + def internal_maxchargepower(self): + return self._internal_mcp.get() + + @internal_maxchargepower.setter + def internal_maxchargepower(self, v): + self._internal_mcp.set(v) + + @property + def dcsyscurrent(self): + """ Return non-zero DC system current, if it is based on + a real measurement. If an estimate/calculation, we cannot use it. + """ + if self._dbusservice['/Dc/System/MeasurementType'] == 1: + try: + v = self._dbusservice['/Dc/Battery/Voltage'] + return self._dcsyscurrent.update( + float(self._dbusservice['/Dc/System/Power'])/v) + except (TypeError, ZeroDivisionError): + pass + return 0.0 + + @property + def has_ess_assistant(self): + return self._multi.active and self._multi.has_ess_assistant + + @property + def has_dvcc(self): + # 0b00 = Off + # 0b01 = On + # 0b10 = Forced off + # 0b11 = Forced on + v = self._settings['bol'] + return bool(v & 1) + + @property + def bms(self): + return BatteryService.instance.bms + + @property + def bms_seen(self): + return self._chargesystem.want_bms + + def _on_timer(self): + def update_solarcharger_control_flags(voltage_written, current_written, chargevoltage): + self._dbusservice['/Control/SolarChargeVoltage'] = voltage_written + self._dbusservice['/Control/SolarChargeCurrent'] = current_written + self._dbusservice['/Control/EffectiveChargeVoltage'] = chargevoltage + + bol_support = self.has_dvcc + + self._tickcount -= 1; self._tickcount %= ADJUST + + if not bol_support: + if self._tickcount > 0: return True + + voltage_written, current_written = self._legacy_update_solarchargers() + update_solarcharger_control_flags(voltage_written, current_written, None) # Not tracking for non-DVCC case + self._dbusservice['/Control/BmsParameters'] = 0 + self._dbusservice['/Control/MaxChargeCurrent'] = 0 + self._dbusservice['/Control/Dvcc'] = 0 + self._dbusservice['/Dvcc/Alarms/FirmwareInsufficient'] = 0 + self._dbusservice['/Dvcc/Alarms/MultipleBatteries'] = 0 + return True + + + # BOL/DVCC support below + self._dbusservice['/Dvcc/Alarms/FirmwareInsufficient'] = int( + not self._chargesystem.has_externalcontrol_support or ( + self._multi.firmwareversion is not None and self._multi.firmwareversion < VEBUS_FIRMWARE_REQUIRED)) + self._dbusservice['/Dvcc/Alarms/MultipleBatteries'] = int( + len(BatteryService.instance.bmses) > 1) + + # Update subsystems + self._chargesystem.update_values() + self._multi.update_values(self._chargesystem.totalcapacity) + + # Below are things we only do every ADJUST seconds + if self._tickcount > 0: return True + + # Signal Dvcc support to other processes + self._dbusservice['/Control/Dvcc'] = 1 + + # Check that we have not lost the BMS, if we ever had one. If the BMS + # is lost, stop passing information to the solar chargers so that they + # might time out. + bms_service = self.bms + if self.bms_seen and bms_service is None and not self._multi.has_vebus_bmsv2: + # BMS is lost + update_solarcharger_control_flags(0, 0, None) + return True + + # Get the user current limit, if set + user_max_charge_current = self._settings['maxchargecurrent'] + if user_max_charge_current < 0: user_max_charge_current = None + + # If there is a BMS, get the charge voltage and current from it + max_charge_current = None + charge_voltage = None + feedback_allowed = self.feedback_allowed + stop_on_mcc0 = False + has_bms = bms_service is not None + if has_bms: + charge_voltage, max_charge_current, feedback_allowed, stop_on_mcc0 = \ + self._adjust_battery_operational_limits(bms_service, feedback_allowed) + + # Check /Bms/AllowToCharge on the VE.Bus service, and set + # max_charge_current to zero if charging is not allowed. Skip this if + # ESS is involved, then the Multi controls this through the charge + # voltage. If it is BMS v2, then also set BMS bit so that solarchargers + # go into #67 if we lose it. + if self._multi.has_vebus_bms: + stop_on_mcc0 = True + has_bms = has_bms or self._multi.has_vebus_bmsv2 + max_charge_current = 10000 if self._multi.allow_to_charge else 0 + + # Take the lesser of the BMS and user current limits, wherever they exist + maximae = [x for x in (user_max_charge_current, max_charge_current) if x is not None] + max_charge_current = min(maximae) if maximae else None + + # Override the battery charge voltage by taking the lesser of the + # voltage limits. Only override if the battery supplies one, to prevent + # a voltage being sent to a Multi in a system without a managed battery. + # Otherwise the Multi will go into passthru if the user disables this. + if charge_voltage is not None: + user_charge_voltage = self._settings['maxchargevoltage'] + if user_charge_voltage > 0: + charge_voltage = min(charge_voltage, user_charge_voltage) + + # @todo EV What if ESS + OvervoltageFeedIn? In that case there is no + # charge current control on the MPPTs, but we'll still indicate that + # the control is active here. Should we? + self._dbusservice['/Control/MaxChargeCurrent'] = \ + not self._multi.active or self._multi.has_bolframe + + # If there is a measured DC system, the Multi and solarchargers + # should add extra current for that. Round this to nearest 100mA. + if max_charge_current is not None and max_charge_current > 0 and not stop_on_mcc0: + max_charge_current = round(max_charge_current + self.dcsyscurrent, 1) + + # We need to keep a copy of the original value for later. We will be + # modifying one of them to compensate for vebus current. + _max_charge_current = max_charge_current + + # If we have vebus current, we have to compensate for it. But if we must + # stop on MCC=0, then only if the max charge current is above zero. + # Otherwise leave it unmodified so that the solarchargers are also + # stopped. + vebus_dc_current = self._multi.dc_current + if _max_charge_current is not None and vebus_dc_current is not None and \ + (not stop_on_mcc0 or _max_charge_current > 0) and vebus_dc_current < 0: + _max_charge_current = ceil(_max_charge_current - vebus_dc_current) + + # Try to push the solar chargers to the vebus-compensated value + voltage_written, current_written, effective_charge_voltage = \ + self._update_solarchargers_and_vecan(has_bms, charge_voltage, + _max_charge_current, feedback_allowed, stop_on_mcc0) + update_solarcharger_control_flags(voltage_written, current_written, effective_charge_voltage) + + # The Multi gets the remainder after subtracting what the solar + # chargers made. If there is a maximum charge power from another + # delegate (dynamicess), apply that here. + if max_charge_current is not None: + max_charge_current = max(0.0, round(max_charge_current - self._chargesystem.smoothed_current)) + + try: + internal_mcc = self.internal_maxchargepower / self._dbusservice['/Dc/Battery/Voltage'] + except (TypeError, ZeroDivisionError, ValueError): + pass + else: + try: + max_charge_current = min(x for x in (ceil(internal_mcc), max_charge_current) if x is not None) + except ValueError: + pass + + # Write the remainder to the Multi. + # There are two ways to limit the charge current of a VE.Bus system. If we have a BMS, + # the BOL parameter is used. + # If not, then the BOL parameters are not available, and the /Dc/0/MaxChargeCurrent path is + # used instead. This path relates to the MaxChargeCurrent setting as also available in + # VEConfigure, except that writing to it only changes the value in RAM in the Multi. + # Unlike VEConfigure it's not necessary to take the number of units in a system into account. + # + # Venus OS v2.30 fixes in mk2-dbus related to /Dc/0/MaxChargeCurrent: + # 1) Fix charge current too high in systems with multiple units per phase. mk2-bus was dividing + # the received current only by the number of phases in the system instead of dividing by the + # number of units in the system. + # 2) Fix setted charge current still active after disabling the "Limit charge current" setting. + # It used to be necessary to set a high current; and only then disable the setting or reset + # the VE.Bus system to re-initialise from the stored setting as per VEConfigure. + bms_parameters_written = 0 + if bms_service is None: + if max_charge_current is None: + self._multi.maxchargecurrent = None + else: + # Don't bother setting a charge current at 1A or less + self._multi.maxchargecurrent = max_charge_current if max_charge_current > 1 else 0 + else: + bms_parameters_written = self._update_battery_operational_limits(bms_service, charge_voltage, max_charge_current) + self._dbusservice['/Control/BmsParameters'] = int(bms_parameters_written or (bms_service is not None and voltage_written)) + + return True + + def _adjust_battery_operational_limits(self, bms_service, feedback_allowed): + """ Take the charge voltage and maximum charge current from the BMS + and adjust it as necessary. For now we only implement quirks + for batteries known to have them. + """ + cv = bms_service.chargevoltage + mcc = bms_service.maxchargecurrent + + quirk = QUIRKS.get(bms_service.product_id) + stop_on_mcc0 = False + if quirk is not None: + # If any quirks are registered for this battery, use that + # instead. + cv, mcc, feedback_allowed, stop_on_mcc0 = quirk(self, bms_service, cv, mcc, feedback_allowed) + + # Add debug offsets + if cv is not None: + cv = safeadd(cv, self.invertervoltageoffset) + if mcc is not None: + mcc = safeadd(mcc, self.currentoffset) + return cv, mcc, feedback_allowed, stop_on_mcc0 + + def _update_battery_operational_limits(self, bms_service, cv, mcc): + """ This function writes the bms parameters across to the Multi + if it exists. Also communicate DCL=0 to inverters. """ + written = 0 + if self._multi.active: + if cv is not None: + self._multi.bol.chargevoltage = cv + + if mcc is not None: + self._multi.bol.maxchargecurrent = mcc + # Also set the maxchargecurrent, to ensure this is not stuck + # at some lower value that overrides the intent here. + try: + self._multi.maxchargecurrent = max(self._multi.maxchargecurrent, mcc) + except TypeError: + pass + + # Copy the rest unmodified + self._multi.bol.maxdischargecurrent = bms_service.maxdischargecurrent + self._multi.bol.batterylowvoltage = bms_service.batterylowvoltage + written = 1 + + # Also control inverters if BMS stops discharge + if len(self._inverters): + self._inverters.set_maxdischargecurrent(bms_service.maxdischargecurrent) + written = 1 + + return written + + @property + def feedback_allowed(self): + # Feedback allowed is defined as 'ESS present and FeedInOvervoltage is + # enabled'. This ignores other setups which allow feedback: hub-1. + return self.has_ess_assistant and self._multi.ac_connected and \ + self._dbusmonitor.get_value('com.victronenergy.settings', + '/Settings/CGwacs/OvervoltageFeedIn') == 1 + + def _update_solarchargers_and_vecan(self, has_bms, bms_charge_voltage, max_charge_current, feedback_allowed, stop_on_mcc0): + """ This function updates the solar chargers only. Parameters + related to the Multi are handled elsewhere. """ + + # If the vebus service does not provide a charge voltage setpoint (so + # no ESS/Hub-1/Hub-4), we use the max charge voltage provided by the + # BMS (if any). This will probably prevent feedback, but that is + # probably not allowed anyway. + charge_voltage = None + if self._multi.active: + charge_voltage = self._multi.hub_voltage + if charge_voltage is None and bms_charge_voltage is not None: + charge_voltage = bms_charge_voltage + if charge_voltage is not None: + try: + charge_voltage += self.solarvoltageoffset + except (ValueError, TypeError): + pass + + if charge_voltage is None and max_charge_current is None: + return 0, 0, None + + voltage_written, current_written, network_mode = self._chargesystem.set_networked( + has_bms, bms_charge_voltage, charge_voltage, + max_charge_current, feedback_allowed, stop_on_mcc0) + + # Write the voltage to VE.Can. Also update the networkmode. + if charge_voltage is not None: + for service in self._vecan_services: + try: + # In case there is no path at all, the set_value below will + # raise an DBusException which we will ignore cheerfully. If we + # cannot set the NetworkMode there is no point in setting the + # ChargeVoltage. + self._dbusmonitor.set_value_async(service, '/Link/NetworkMode', network_mode) + self._dbusmonitor.set_value_async(service, '/Link/ChargeVoltage', charge_voltage) + voltage_written = 1 + except DBusException: + pass + + return voltage_written, current_written, charge_voltage + + def _legacy_update_solarchargers(self): + """ This is the old implementation we used before DVCC. It is kept + here so we can fall back to it where DVCC is not fully supported, + and to avoid maintaining two copies of systemcalc. """ + + max_charge_current = None + for battery in BatteryService.instance.batteries: + max_charge_current = safeadd(max_charge_current, battery.maxchargecurrent) + + # Workaround: copying the max charge current from BMS batteries to the solarcharger leads to problems: + # excess PV power is not fed back to the grid any more, and loads on AC-out are not fed with PV power. + # PV power is used for charging the batteries only. + # So we removed this feature, until we have a complete solution for solar charger support. Until then + # we set a 'high' max charge current to avoid 'BMS connection lost' alarms from the solarcharger. + if max_charge_current is not None: + max_charge_current = 1000 + + vebus_path = self._multi.service if self._multi.active else None + charge_voltage = None if vebus_path is None else \ + self._dbusmonitor.get_value(vebus_path, '/Hub/ChargeVoltage') + + if charge_voltage is None and max_charge_current is None: + return (0, 0) + + # Network mode: + # bit 0: Operated in network environment + # bit 2: Remote Hub-1 control + # bit 3: Remote BMS control + network_mode = 1 | (0 if charge_voltage is None else 4) | (0 if max_charge_current is None else 8) + voltage_written = 0 + current_written = 0 + for charger in self._chargesystem: + try: + # We use /Link/NetworkMode to detect Hub support in the solarcharger. Existence of this item + # implies existence of the other /Link/* fields. + if charger.networkmode is None: + continue + charger.networkmode = network_mode + + if charge_voltage is not None: + charger.chargevoltage = charge_voltage + voltage_written = 1 + + if max_charge_current is not None: + charger.maxchargecurrent = max_charge_current + current_written = 1 + except DBusException: + # If the charger for whatever reason doesn't have the /Link + # path, ignore it. This is the legacy implementation and + # better to keep it for the moment. + pass + + # The below is different to the non-legacy case above, where the voltage + # the com.victronenergy.vecan.* service instead. + if charge_voltage is not None and self._chargesystem.has_vecan_chargers: + # Charge voltage cannot by written directly to the CAN-bus solar chargers, we have to use + # the com.victronenergy.vecan.* service instead. + # Writing charge current to CAN-bus solar charger is not supported yet. + for service in self._vecan_services: + try: + # Note: we don't check the value of charge_voltage_item because it may be invalid, + # for example if the D-Bus path has not been written for more than 60 (?) seconds. + # In case there is no path at all, the set_value below will raise an DBusException + # which we will ignore cheerfully. + self._dbusmonitor.set_value_async(service, '/Link/ChargeVoltage', charge_voltage) + voltage_written = 1 + except DBusException: + pass + + return (voltage_written, current_written) diff --git a/NodeRed/flows.json b/NodeRed/flows.json new file mode 100644 index 000000000..c4e81e053 --- /dev/null +++ b/NodeRed/flows.json @@ -0,0 +1,5660 @@ +[ + { + "id": "e2588b9d824334f7", + "type": "tab", + "label": "controller_calibration_charge", + "disabled": false, + "info": "", + "env": [] + }, + { + "id": "322b256f0daf33ef", + "type": "tab", + "label": "controller_hold_min_soc&&charge_to_min_soc", + "disabled": false, + "info": "", + "env": [] + }, + { + "id": "32b2f9d4415d82ce", + "type": "tab", + "label": "controller_max_discharge", + "disabled": false, + "info": "", + "env": [] + }, + { + "id": "812b3c1b3d3fa76b", + "type": "tab", + "label": "parse_warnings_and_alarms", + "disabled": false, + "info": "", + "env": [] + }, + { + "id": "dd75eef8547a776f", + "type": "tab", + "label": "Node Red Dashboard", + "disabled": false, + "info": "", + "env": [] + }, + { + "id": "victron-client-id", + "type": "victron-client" + }, + { + "id": "e177392401620838", + "type": "ui_group", + "name": "Controller and Battery Info", + "tab": "157862d37ae585b5", + "order": 2, + "disp": true, + "width": "13", + "collapse": false, + "className": "" + }, + { + "id": "157862d37ae585b5", + "type": "ui_tab", + "name": "Home", + "icon": "check", + "disabled": false, + "hidden": false + }, + { + "id": "e0e675d533a148b7", + "type": "ui_base", + "theme": { + "name": "theme-light", + "lightTheme": { + "default": "#0094CE", + "baseColor": "#0094CE", + "baseFont": "-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif", + "edited": true, + "reset": false + }, + "darkTheme": { + "default": "#097479", + "baseColor": "#097479", + "baseFont": "-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif", + "edited": false + }, + "customTheme": { + "name": "Untitled Theme 1", + "default": "#4B7930", + "baseColor": "#4B7930", + "baseFont": "-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif", + "reset": false + }, + "themeState": { + "base-color": { + "default": "#0094CE", + "value": "#0094CE", + "edited": false + }, + "page-titlebar-backgroundColor": { + "value": "#0094CE", + "edited": false + }, + "page-backgroundColor": { + "value": "#fafafa", + "edited": false + }, + "page-sidebar-backgroundColor": { + "value": "#ffffff", + "edited": false + }, + "group-textColor": { + "value": "#1bbfff", + "edited": false + }, + "group-borderColor": { + "value": "#ffffff", + "edited": false + }, + "group-backgroundColor": { + "value": "#ffffff", + "edited": false + }, + "widget-textColor": { + "value": "#111111", + "edited": false + }, + "widget-backgroundColor": { + "value": "#0094ce", + "edited": false + }, + "widget-borderColor": { + "value": "#ffffff", + "edited": false + }, + "base-font": { + "value": "-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif" + } + }, + "angularTheme": { + "primary": "indigo", + "accents": "blue", + "warn": "red", + "background": "grey", + "palette": "light" + } + }, + "site": { + "name": "Node-RED Dashboard", + "hideToolbar": "false", + "allowSwipe": "false", + "lockMenu": "false", + "allowTempTheme": "true", + "dateFormat": "DD/MM/YYYY", + "sizes": { + "sx": 48, + "sy": 48, + "gx": 6, + "gy": 6, + "cx": 6, + "cy": 6, + "px": 0, + "py": 0 + } + } + }, + { + "id": "3290bd5996bd3175", + "type": "ui_group", + "name": "Easy Input", + "tab": "157862d37ae585b5", + "order": 3, + "disp": true, + "width": 13, + "collapse": false, + "className": "" + }, + { + "id": "d610b26df84f336e", + "type": "ui_group", + "name": "Calibration Charge", + "tab": "157862d37ae585b5", + "order": 1, + "disp": true, + "width": "13", + "collapse": false, + "className": "" + }, + { + "id": "1c76b68292d58d7a", + "type": "victron-input-custom", + "z": "e2588b9d824334f7", + "service": "com.victronenergy.battery/1", + "path": "/TimeToTOCRequest", + "serviceObj": { + "service": "com.victronenergy.battery/1", + "name": "FZS 48TL200 x2 (1)" + }, + "pathObj": { + "path": "/TimeToTOCRequest", + "name": "/TimeToTOCRequest", + "type": "number" + }, + "name": "", + "onlyChanges": false, + "x": 580, + "y": 280, + "wires": [ + [ + "b18eaae1b2cf532a" + ] + ] + }, + { + "id": "374a9784b13e6b91", + "type": "ui_switch", + "z": "e2588b9d824334f7", + "name": "Start Calibration Charge Now", + "label": "Start Calibration Charge Now", + "tooltip": "", + "group": "d610b26df84f336e", + "order": 5, + "width": 0, + "height": 0, + "passthru": true, + "decouple": "false", + "topic": "#:(file)::start_calibration_charge_now_button", + "topicType": "global", + "style": "", + "onvalue": "true", + "onvalueType": "bool", + "onicon": "", + "oncolor": "", + "offvalue": "false", + "offvalueType": "bool", + "officon": "", + "offcolor": "", + "animate": false, + "className": "", + "x": 2440, + "y": 100, + "wires": [ + [ + "0eda66dbeeaa1361", + "ff621c398de790e9" + ] + ] + }, + { + "id": "0eda66dbeeaa1361", + "type": "switch", + "z": "e2588b9d824334f7", + "name": "Button is on", + "property": "payload", + "propertyType": "msg", + "rules": [ + { + "t": "true" + } + ], + "checkall": "true", + "repair": false, + "outputs": 1, + "x": 2670, + "y": 100, + "wires": [ + [ + "38a3f85186c86064" + ] + ] + }, + { + "id": "e6c8eb42a10e21a3", + "type": "switch", + "z": "e2588b9d824334f7", + "name": "Need to do calibration charge or not", + "property": "payload", + "propertyType": "msg", + "rules": [ + { + "t": "eq", + "v": "0", + "vt": "num" + }, + { + "t": "eq", + "v": "1", + "vt": "num" + }, + { + "t": "else" + } + ], + "checkall": "true", + "repair": false, + "outputs": 3, + "x": 1620, + "y": 240, + "wires": [ + [ + "a0d686b515f76cae", + "65fc8a93c348bd1e", + "7404973d10f3a10a", + "644fe572f173602e" + ], + [ + "e3e9b1f4b7cabc16", + "8678a63acdb5ee29", + "985f0a278ffd922c" + ], + [ + "0eda2d25df727b9a", + "ce4254f159092244" + ] + ] + }, + { + "id": "3ff4ceaaebe9defb", + "type": "ui_text", + "z": "e2588b9d824334f7", + "group": "d610b26df84f336e", + "order": 2, + "width": 0, + "height": 0, + "name": "Time To Calibration Charge", + "label": "Time To Calibration Charge", + "format": "{{msg.payload}}", + "layout": "row-spread", + "className": "", + "style": false, + "font": "", + "fontSize": 16, + "color": "#000000", + "x": 3360, + "y": 420, + "wires": [] + }, + { + "id": "0b6f77eecb110736", + "type": "ui_text_input", + "z": "e2588b9d824334f7", + "name": "Calibration Charge Start Time (hh:mm)", + "label": "Calibration Charge Start Time (hh:mm:ss.sss)", + "tooltip": "", + "group": "d610b26df84f336e", + "order": 4, + "width": 0, + "height": 0, + "passthru": true, + "mode": "time", + "delay": "0", + "topic": "#:(file)::calibration_charge_start_time", + "sendOnBlur": false, + "className": "", + "topicType": "global", + "x": 510, + "y": 80, + "wires": [ + [ + "f32edc8e22e6c4a6" + ] + ] + }, + { + "id": "ff621c398de790e9", + "type": "change", + "z": "e2588b9d824334f7", + "name": "", + "rules": [ + { + "t": "set", + "p": "#:(file)::start_calibration_charge_now_button", + "pt": "global", + "to": "payload", + "tot": "msg" + } + ], + "action": "", + "property": "", + "from": "", + "to": "", + "reg": false, + "x": 2780, + "y": 40, + "wires": [ + [ + "8cd49df4ce393b99" + ] + ] + }, + { + "id": "8cd49df4ce393b99", + "type": "debug", + "z": "e2588b9d824334f7", + "name": "Debug for calibration button", + "active": false, + "tosidebar": true, + "console": false, + "tostatus": true, + "complete": "payload", + "targetType": "msg", + "statusVal": "payload", + "statusType": "auto", + "x": 3180, + "y": 40, + "wires": [] + }, + { + "id": "f32edc8e22e6c4a6", + "type": "change", + "z": "e2588b9d824334f7", + "name": "", + "rules": [ + { + "t": "set", + "p": "#:(file)::calibration_charge_start_time", + "pt": "global", + "to": "payload", + "tot": "msg" + } + ], + "action": "", + "property": "", + "from": "", + "to": "", + "reg": false, + "x": 900, + "y": 80, + "wires": [ + [ + "c2e5b1ab69e8b817" + ] + ] + }, + { + "id": "38a3f85186c86064", + "type": "change", + "z": "e2588b9d824334f7", + "name": "Set \"Calibration charge now\" to Time To CalibrationCharge", + "rules": [ + { + "t": "set", + "p": "payload", + "pt": "msg", + "to": "Calibration charge now", + "tot": "str" + } + ], + "action": "", + "property": "", + "from": "", + "to": "", + "reg": false, + "x": 3010, + "y": 100, + "wires": [ + [ + "3ff4ceaaebe9defb" + ] + ] + }, + { + "id": "28b4fe5478e59dcc", + "type": "victron-input-custom", + "z": "e2588b9d824334f7", + "service": "com.victronenergy.settings", + "path": "/Settings/Controller/LastEOC", + "serviceObj": { + "service": "com.victronenergy.settings", + "name": "com.victronenergy.settings" + }, + "pathObj": { + "path": "/Settings/Controller/LastEOC", + "name": "/Settings/Controller/LastEOC", + "type": "number" + }, + "name": "", + "onlyChanges": false, + "x": 530, + "y": 360, + "wires": [ + [ + "c08993a9535559b7", + "5909342727c04466" + ] + ] + }, + { + "id": "7404973d10f3a10a", + "type": "change", + "z": "e2588b9d824334f7", + "name": "Get current timestamp to update LastEoc", + "rules": [ + { + "t": "set", + "p": "payload", + "pt": "msg", + "to": "", + "tot": "date" + } + ], + "action": "", + "property": "", + "from": "", + "to": "", + "reg": false, + "x": 2140, + "y": 200, + "wires": [ + [ + "466d0ead739c355d" + ] + ] + }, + { + "id": "f0b91188bb162f98", + "type": "victron-output-custom", + "z": "e2588b9d824334f7", + "service": "com.victronenergy.settings", + "path": "/Settings/Controller/LastEOC", + "serviceObj": { + "service": "com.victronenergy.settings", + "name": "com.victronenergy.settings" + }, + "pathObj": { + "path": "/Settings/Controller/LastEOC", + "name": "/Settings/Controller/LastEOC", + "type": "number" + }, + "name": "", + "onlyChanges": false, + "x": 2790, + "y": 200, + "wires": [] + }, + { + "id": "466d0ead739c355d", + "type": "function", + "z": "e2588b9d824334f7", + "name": "Millisecond_to_second", + "func": "current_timestamp_in_second=Math.floor(msg.payload/1000);\nmsg.payload = current_timestamp_in_second;\nreturn msg;", + "outputs": 1, + "noerr": 0, + "initialize": "", + "finalize": "", + "libs": [], + "x": 2440, + "y": 200, + "wires": [ + [ + "f0b91188bb162f98" + ] + ] + }, + { + "id": "7339dc97983bb77b", + "type": "comment", + "z": "e2588b9d824334f7", + "name": "EOC reached ", + "info": "", + "x": 1890, + "y": 220, + "wires": [] + }, + { + "id": "0fff2085b1eb8dcb", + "type": "comment", + "z": "e2588b9d824334f7", + "name": "Do calibration charge now", + "info": "", + "x": 2230, + "y": 400, + "wires": [] + }, + { + "id": "ed2bb3eadfa27747", + "type": "comment", + "z": "e2588b9d824334f7", + "name": "Still some time left to do calibration charge", + "info": "", + "x": 2160, + "y": 480, + "wires": [] + }, + { + "id": "615bdf17da1a6422", + "type": "debug", + "z": "e2588b9d824334f7", + "name": "Debug for calibration charge function", + "active": false, + "tosidebar": true, + "console": false, + "tostatus": true, + "complete": "payload", + "targetType": "msg", + "statusVal": "payload.count", + "statusType": "auto", + "x": 1630, + "y": 140, + "wires": [] + }, + { + "id": "8678a63acdb5ee29", + "type": "victron-output-custom", + "z": "e2588b9d824334f7", + "service": "com.victronenergy.hub4/0", + "path": "/Overrides/ForceCharge", + "serviceObj": { + "service": "com.victronenergy.hub4/0", + "name": "com.victronenergy.hub4 (0)" + }, + "pathObj": { + "path": "/Overrides/ForceCharge", + "name": "/Overrides/ForceCharge", + "type": "number" + }, + "name": "", + "onlyChanges": false, + "x": 2620, + "y": 460, + "wires": [] + }, + { + "id": "65fc8a93c348bd1e", + "type": "change", + "z": "e2588b9d824334f7", + "name": "EOC reached", + "rules": [ + { + "t": "set", + "p": "payload", + "pt": "msg", + "to": "EOC reached", + "tot": "str" + } + ], + "action": "", + "property": "", + "from": "", + "to": "", + "reg": false, + "x": 2060, + "y": 240, + "wires": [ + [ + "3ff4ceaaebe9defb" + ] + ] + }, + { + "id": "e3e9b1f4b7cabc16", + "type": "change", + "z": "e2588b9d824334f7", + "name": "Calibration charge now", + "rules": [ + { + "t": "set", + "p": "payload", + "pt": "msg", + "to": "Calibration charge now", + "tot": "str" + } + ], + "action": "", + "property": "", + "from": "", + "to": "", + "reg": false, + "x": 2520, + "y": 420, + "wires": [ + [ + "3ff4ceaaebe9defb" + ] + ] + }, + { + "id": "b077a48ff0831b2a", + "type": "ui_dropdown", + "z": "e2588b9d824334f7", + "name": "Calibration Charge Day", + "label": "Calibration Charge Day", + "tooltip": "", + "place": "", + "group": "d610b26df84f336e", + "order": 3, + "width": 0, + "height": 0, + "passthru": true, + "multiple": false, + "options": [ + { + "label": "Sunday", + "value": 0, + "type": "num" + }, + { + "label": "Monday", + "value": 1, + "type": "num" + }, + { + "label": "Tuesday", + "value": 2, + "type": "num" + }, + { + "label": "Wednesday", + "value": 3, + "type": "num" + }, + { + "label": "Thursday", + "value": 4, + "type": "num" + }, + { + "label": "Friday", + "value": 5, + "type": "num" + }, + { + "label": "Saturday", + "value": 6, + "type": "num" + } + ], + "payload": "", + "topic": "#:(file)::calibration_charge_weekday", + "topicType": "global", + "className": "", + "x": 510, + "y": 180, + "wires": [ + [ + "10605f48b99030d0" + ] + ] + }, + { + "id": "10605f48b99030d0", + "type": "change", + "z": "e2588b9d824334f7", + "name": "", + "rules": [ + { + "t": "set", + "p": "#:(file)::calibration_charge_start_weekday", + "pt": "global", + "to": "payload", + "tot": "msg" + } + ], + "action": "", + "property": "", + "from": "", + "to": "", + "reg": false, + "x": 890, + "y": 180, + "wires": [ + [ + "c2e5b1ab69e8b817" + ] + ] + }, + { + "id": "b18eaae1b2cf532a", + "type": "change", + "z": "e2588b9d824334f7", + "name": "", + "rules": [ + { + "t": "set", + "p": "#:(file)::TimeToTOC", + "pt": "global", + "to": "payload", + "tot": "msg" + } + ], + "action": "", + "property": "", + "from": "", + "to": "", + "reg": false, + "x": 960, + "y": 280, + "wires": [ + [ + "c2e5b1ab69e8b817" + ] + ] + }, + { + "id": "c08993a9535559b7", + "type": "debug", + "z": "e2588b9d824334f7", + "name": "Debug for LastEOC", + "active": false, + "tosidebar": true, + "console": false, + "tostatus": false, + "complete": "payload", + "targetType": "msg", + "statusVal": "", + "statusType": "auto", + "x": 1010, + "y": 440, + "wires": [] + }, + { + "id": "6a3d4d1cb2651151", + "type": "inject", + "z": "e2588b9d824334f7", + "name": "", + "props": [ + { + "p": "payload" + }, + { + "p": "topic", + "vt": "str" + } + ], + "repeat": "", + "crontab": "", + "once": true, + "onceDelay": 0.1, + "topic": "", + "payload": "#:(file)::calibration_charge_start_time", + "payloadType": "global", + "x": 150, + "y": 80, + "wires": [ + [ + "0b6f77eecb110736" + ] + ] + }, + { + "id": "fdd85619255f4e81", + "type": "inject", + "z": "e2588b9d824334f7", + "name": "", + "props": [ + { + "p": "payload" + }, + { + "p": "topic", + "vt": "str" + } + ], + "repeat": "", + "crontab": "", + "once": true, + "onceDelay": 0.1, + "topic": "", + "payload": "#:(file)::calibration_charge_start_weekday", + "payloadType": "global", + "x": 160, + "y": 180, + "wires": [ + [ + "b077a48ff0831b2a" + ] + ] + }, + { + "id": "761a8f1f11727873", + "type": "inject", + "z": "e2588b9d824334f7", + "name": "", + "props": [ + { + "p": "payload" + }, + { + "p": "topic", + "vt": "str" + } + ], + "repeat": "5", + "crontab": "", + "once": true, + "onceDelay": "0", + "topic": "", + "payload": "#:(file)::start_calibration_charge_now_button", + "payloadType": "global", + "x": 2030, + "y": 80, + "wires": [ + [ + "374a9784b13e6b91" + ] + ] + }, + { + "id": "c2e5b1ab69e8b817", + "type": "function", + "z": "e2588b9d824334f7", + "name": "Cal time left to do calibration charge", + "func": "// Get minutes per day\nvar minutes_per_day = 1440;\n\n// Battery setting\nmax_day_wihthout_EOC = 7;\nmax_minutes_without_EOC = max_day_wihthout_EOC*minutes_per_day;\n\n// Get TimeToTOC which stores minutes from last EOC reached\ntime_to_TOC=global.get('TimeToTOC','file');\n\nif (time_to_TOC ==0){//EOC reahced\n msg.payload=0;\n return msg;\n}\n\n// Get calibration charge time (hh:mm) from user setting\nif(global.get('calibration_charge_start_time','file')!= null){\n minutes_from_midnight_calibration_charge = Math.floor(global.get('calibration_charge_start_time','file'));\n}else{\n minutes_from_midnight_calibration_charge = 0;//default value from midnight\n}\n\n// Get calibration charge weekday from user setting\nif(global.get('calibration_charge_start_weekday','file')!=null){\n weekday_calibration_charge = global.get('calibration_charge_start_weekday','file');\n}else{\n weekday_calibration_charge = 0;//default value from Sunday\n}\n\nfunction nextScheduleDay(adate, w) {\n var daysToAdd = (w - adate.getDay() + 7) % 7;\n var nextDate = new Date(adate);\n nextDate.setDate(adate.getDate() + daysToAdd);\n nextDate.setHours(0);\n nextDate.setMinutes(0);\n nextDate.setSeconds(0);\n return nextDate;\n}\n\n\nfunction chargeWindows(currentTime, weekday, starttime, timeToTOC) {\n var d1 = nextScheduleDay(currentTime, weekday);\n\n // Convert starttime to a Date object\n var startTime = new Date(starttime);\n\n // Calculate the next ScheduleDay considering if the sum of timeToTOC and timeLeftMinutes is less than 7 days\n var timeLeftMinutes = Math.ceil((d1.getTime() - currentTime.getTime() + starttime) / (1000 * 60));\n\n if (timeToTOC + timeLeftMinutes < max_minutes_without_EOC) {\n // If the sum is less than 7 days, push next ScheduleDay to next week\n d1.setDate(d1.getDate() + 7);\n }\n\n var startDateTimeD1 = new Date(d1);\n startDateTimeD1.setHours(startTime.getUTCHours(), startTime.getUTCMinutes(), 0, 0);\n\n // Check if current time is within the charge window\n if (currentTime < startDateTimeD1) {\n // Calculate time left until the end of the window\n var timeLeftMillis = startDateTimeD1 - currentTime;\n var daysLeft = Math.floor(timeLeftMillis / (1000 * 60 * 60 * 24));\n var hoursLeft = Math.floor((timeLeftMillis % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));\n var minutesLeft = Math.ceil((timeLeftMillis % (1000 * 60 * 60)) / (1000 * 60));\n \n days_str = (daysLeft > 0) ? (daysLeft + \"d\") : \"\";\n hours_str = (hoursLeft > 0) ? (hoursLeft + \"h\") : \"\";\n minutes_str = (minutesLeft > 0) ? (minutesLeft + \"m\") : \"\";\n \n time_to_calibration_str = days_str+hours_str+minutes_str;\n\n return time_to_calibration_str;\n } else {\n return 1;\n }\n}\n\nvar today = new Date(); // Assuming today's date\nvar timeLeft = chargeWindows(today, weekday_calibration_charge, minutes_from_midnight_calibration_charge, time_to_TOC);\n\nmsg.payload = timeLeft;\nreturn msg;", + "outputs": 1, + "timeout": "", + "noerr": 0, + "initialize": "", + "finalize": "", + "libs": [], + "x": 1280, + "y": 200, + "wires": [ + [ + "615bdf17da1a6422", + "e6c8eb42a10e21a3" + ] + ] + }, + { + "id": "a0d686b515f76cae", + "type": "function", + "z": "e2588b9d824334f7", + "name": "Turn off calibration charge now button when EOC", + "func": "if(global.get('start_calibration_charge_now_button','file')==true)\n{\n msg.payload = false;\n}else{\n msg.payload = false;\n}\n\nreturn msg;\n\n", + "outputs": 1, + "timeout": "", + "noerr": 0, + "initialize": "", + "finalize": "", + "libs": [], + "x": 2090, + "y": 140, + "wires": [ + [ + "374a9784b13e6b91" + ] + ] + }, + { + "id": "0eda2d25df727b9a", + "type": "function", + "z": "e2588b9d824334f7", + "name": "Check whether the calibration charge now button is on", + "func": "if(global.get('start_calibration_charge_now_button','file')==true)\n{\n text= \"Calibration charge now\";\n}else{\n text = msg.payload;\n}\nmsg.payload = text;\n\nreturn msg;\n", + "outputs": 1, + "timeout": 0, + "noerr": 0, + "initialize": "", + "finalize": "", + "libs": [], + "x": 2620, + "y": 560, + "wires": [ + [ + "3ff4ceaaebe9defb" + ] + ] + }, + { + "id": "5909342727c04466", + "type": "change", + "z": "e2588b9d824334f7", + "name": "LastEOC", + "rules": [ + { + "t": "set", + "p": "#:(file)::LastEOC", + "pt": "global", + "to": "payload", + "tot": "msg" + } + ], + "action": "", + "property": "", + "from": "", + "to": "", + "reg": false, + "x": 1000, + "y": 360, + "wires": [ + [ + "c2e5b1ab69e8b817" + ] + ] + }, + { + "id": "44264437fe17f23f", + "type": "function", + "z": "e2588b9d824334f7", + "name": "Cal time left to do calibration charge_backup1", + "func": "// Get minutes per day\nvar minutes_per_day = 1440;\n\n// Battery setting\nmax_day_wihthout_EOC = 7;\nmax_minutes_without_EOC = max_day_wihthout_EOC*minutes_per_day;\n\n// Get TimeToTOC which stores minutes from last EOC reached\ntime_to_TOC=global.get('TimeToTOC','file');\n//time_to_TOC=global.get('TimeToTOC');\n\nif (time_to_TOC ==0){//EOC reahced\n msg.payload=0;\n return msg;\n}\n\n// Get calibration charge time (hh:mm) from user setting\nif(global.get('calibration_charge_start_time','file')!= null){\n minutes_from_midnight_calibration_charge = Math.floor(global.get('calibration_charge_start_time','file')/1000/60);\n}else{\n minutes_from_midnight_calibration_charge = 0;//default value from midnight\n}\n\n// Get calibration charge weekday from user setting\nif(global.get('calibration_charge_start_weekday','file')!=null){\n weekday_calibration_charge = global.get('calibration_charge_start_weekday','file');\n}else{\n weekday_calibration_charge = 0;//default value from Sunday\n}\n\n// Get today's date\nvar today = new Date();\n\n// Find the current day of the week (0 = Sunday, 1 = Monday, ..., 6 = Saturday)\nvar currentDay = today.getDay();\nvar minutes_from_today_midnight = today.getHours()*60+today.getMinutes();\n\n// Calculate the number of days and minutes until next calibration weekday\nvar weekday_diff = weekday_calibration_charge - currentDay;\nvar minutes_diff = minutes_from_midnight_calibration_charge - minutes_from_today_midnight;\n\nif (weekday_diff < 0) {\n weekday_diff += 7; \n}\n\nif(weekday_diff==0 && minutes_diff<0){\n weekday_diff += 7;\n}\n\n// Calculate time difference in minutes from now to the set calibration charge time\nminutes_diff_all_from_now_to_calibration=weekday_diff*minutes_per_day+minutes_diff;\n\n// Calculate time difference in minutes from LastEOC to the set calibration charge time\nminutes_diff_all_from_LastEOC_to_calibration = time_to_TOC+ minutes_diff_all_from_now_to_calibration;\n\n// Set the time to next calibration time\nvar nextCalibrationDate = new Date(today);\nvar_setHours = Math.floor(minutes_from_midnight_calibration_charge/60);\nvar_setMinutes = minutes_from_midnight_calibration_charge - var_setHours*60;\n\nif(minutes_diff_all_from_LastEOC_to_calibration=minutes_fromLastEOCtoNextCalibrationTimestamp){// need to do first time calibration charge;if the calibration setting is too close to last EOC time, then skip the first time and do it next week\n msg.payload =1;\n return msg;\n}else{\n time_left_minutes_all = minutes_diff_all_from_now_to_calibration;\n time_left_days = Math.floor(time_left_minutes_all/60/24);\n time_left_days_display = time_left_days + (minutes_diff_all_from_LastEOC_to_calibration 0) ? (time_left_days_display + \"d\") : \"\";\n hours_str = (time_left_hours > 0) ? (time_left_hours + \"h\") : \"\";\n minutes_str = (time_left_minutes > 0) ? (time_left_minutes + \"m\") : \"\";\n \n time_to_calibration_str = days_str+hours_str+minutes_str;\n msg.payload=time_to_calibration_str;\n}\n\nreturn msg;", + "outputs": 1, + "timeout": "", + "noerr": 0, + "initialize": "", + "finalize": "", + "libs": [], + "x": 600, + "y": 560, + "wires": [ + [] + ] + }, + { + "id": "011bad015cb995db", + "type": "function", + "z": "e2588b9d824334f7", + "name": "Cal time left to do calibration charge_backup2", + "func": "// Get minutes per day\nvar minutes_per_day = 1440;\n\n// Battery setting\nmax_day_wihthout_EOC = 7;\nmax_minutes_without_EOC = max_day_wihthout_EOC*minutes_per_day;\n\n// Get TimeToTOC which stores minutes from last EOC reached\ntime_to_TOC=global.get('TimeToTOC','file');\n\nif (time_to_TOC ==0){//EOC reahced\n msg.payload=0;\n return msg;\n}\n\n// Get calibration charge time (hh:mm) from user setting\nif(global.get('calibration_charge_start_time','file')!= null){\n minutes_from_midnight_calibration_charge = Math.floor(global.get('calibration_charge_start_time','file'));\n}else{\n minutes_from_midnight_calibration_charge = 0;//default value from midnight\n}\n\n// Get calibration charge weekday from user setting\nif(global.get('calibration_charge_start_weekday','file')!=null){\n weekday_calibration_charge = global.get('calibration_charge_start_weekday','file');\n}else{\n weekday_calibration_charge = 0;//default value from Sunday\n}\n\nfunction nextScheduleDay(adate, w) {\n w = w % 7;\n var daysToAdd = (w - adate.getDay() - 1 + 7) % 7;\n var nextDate = new Date(adate);\n nextDate.setDate(adate.getDate() + daysToAdd);\n return nextDate;\n}\n\nfunction prevScheduleDay(adate, w) {\n w = w % 7;\n var daysToSubtract = (adate.getDay() + 7 - w) % 7 + 1;\n var prevDate = new Date(adate);\n prevDate.setDate(adate.getDate() - daysToSubtract);\n return prevDate;\n}\n\nfunction chargeWindows(currentTime, weekday, starttime, timeToTOC) {\n var d0 = prevScheduleDay(currentTime, weekday);\n var d1 = nextScheduleDay(currentTime, weekday);\n\n // Convert starttime to a Date object\n var startTime = new Date(starttime);\n\n // Calculate the next ScheduleDay considering if the sum of timeToTOC and timeLeftMinutes is less than 7 days\n var timeLeftMinutes = Math.ceil((d1.getTime() - currentTime.getTime() + starttime) / (1000 * 60));\n\n if (timeToTOC + timeLeftMinutes < max_minutes_without_EOC) {\n // If the sum is less than 7 days, push next ScheduleDay to next week\n d1.setDate(d1.getDate() + 7);\n }\n\n // Set the start time for d0 and d1\n var startDateTimeD0 = new Date(d0);\n startDateTimeD0.setHours(startTime.getUTCHours(), startTime.getUTCMinutes(), 0, 0);\n\n var startDateTimeD1 = new Date(d1);\n startDateTimeD1.setHours(startTime.getUTCHours(), startTime.getUTCMinutes(), 0, 0);\n\n // Check if current time is within the charge window\n if (currentTime >= startDateTimeD0 && currentTime < startDateTimeD1) {\n // Calculate time left until the end of the window\n var timeLeftMillis = startDateTimeD1 - currentTime;\n var daysLeft = Math.floor(timeLeftMillis / (1000 * 60 * 60 * 24));\n var hoursLeft = Math.floor((timeLeftMillis % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));\n var minutesLeft = Math.ceil((timeLeftMillis % (1000 * 60 * 60)) / (1000 * 60));\n\n return daysLeft + 'd' + hoursLeft + 'h' + minutesLeft + 'm';\n } else {\n return 1;\n }\n}\n\nvar today = new Date(); // Assuming today's date\nvar timeLeft = chargeWindows(today, weekday_calibration_charge, minutes_from_midnight_calibration_charge, time_to_TOC);\n\nmsg.payload = timeLeft;\n\nreturn msg;", + "outputs": 1, + "timeout": "", + "noerr": 0, + "initialize": "", + "finalize": "", + "libs": [], + "x": 600, + "y": 640, + "wires": [ + [] + ] + }, + { + "id": "985f0a278ffd922c", + "type": "change", + "z": "e2588b9d824334f7", + "name": "", + "rules": [ + { + "t": "set", + "p": "#:(file)::start_calibration_charge_now", + "pt": "global", + "to": "payload", + "tot": "msg" + } + ], + "action": "", + "property": "", + "from": "", + "to": "", + "reg": false, + "x": 2580, + "y": 500, + "wires": [ + [ + "3dc0dde6cbbd97c0" + ] + ] + }, + { + "id": "de6a4357e8a1f15c", + "type": "change", + "z": "e2588b9d824334f7", + "name": "", + "rules": [ + { + "t": "set", + "p": "#:(file)::start_calibration_charge_now", + "pt": "global", + "to": "payload", + "tot": "msg" + } + ], + "action": "", + "property": "", + "from": "", + "to": "", + "reg": false, + "x": 2900, + "y": 620, + "wires": [ + [ + "3e2692e252d4b7ce" + ] + ] + }, + { + "id": "ce4254f159092244", + "type": "change", + "z": "e2588b9d824334f7", + "name": "set start_calibration_charge_now to 0", + "rules": [ + { + "t": "set", + "p": "payload", + "pt": "msg", + "to": "0", + "tot": "num" + } + ], + "action": "", + "property": "", + "from": "", + "to": "", + "reg": false, + "x": 2570, + "y": 620, + "wires": [ + [ + "de6a4357e8a1f15c" + ] + ] + }, + { + "id": "644fe572f173602e", + "type": "change", + "z": "e2588b9d824334f7", + "name": "", + "rules": [ + { + "t": "set", + "p": "#:(file)::start_calibration_charge_now", + "pt": "global", + "to": "payload", + "tot": "msg" + } + ], + "action": "", + "property": "", + "from": "", + "to": "", + "reg": false, + "x": 2440, + "y": 240, + "wires": [ + [ + "d1f75adc62fbfadb" + ] + ] + }, + { + "id": "d1f75adc62fbfadb", + "type": "debug", + "z": "e2588b9d824334f7", + "name": "Debug for calibration", + "active": false, + "tosidebar": true, + "console": false, + "tostatus": true, + "complete": "payload", + "targetType": "msg", + "statusVal": "payload", + "statusType": "auto", + "x": 2720, + "y": 240, + "wires": [] + }, + { + "id": "3dc0dde6cbbd97c0", + "type": "debug", + "z": "e2588b9d824334f7", + "name": "Debug for calibration", + "active": false, + "tosidebar": true, + "console": false, + "tostatus": true, + "complete": "payload", + "targetType": "msg", + "statusVal": "payload", + "statusType": "auto", + "x": 2860, + "y": 500, + "wires": [] + }, + { + "id": "3e2692e252d4b7ce", + "type": "debug", + "z": "e2588b9d824334f7", + "name": "Debug for calibration", + "active": false, + "tosidebar": true, + "console": false, + "tostatus": true, + "complete": "payload", + "targetType": "msg", + "statusVal": "payload", + "statusType": "auto", + "x": 3180, + "y": 620, + "wires": [] + }, + { + "id": "edf59fb9886b1048", + "type": "victron-input-custom", + "z": "322b256f0daf33ef", + "service": "com.victronenergy.settings", + "path": "/Settings/CGwacs/BatteryLife/MinimumSocLimit", + "serviceObj": { + "service": "com.victronenergy.settings", + "name": "com.victronenergy.settings" + }, + "pathObj": { + "path": "/Settings/CGwacs/BatteryLife/MinimumSocLimit", + "name": "/Settings/CGwacs/BatteryLife/MinimumSocLimit", + "type": "number" + }, + "name": "", + "onlyChanges": false, + "x": 310, + "y": 200, + "wires": [ + [ + "e31bd3d3a1c25da5" + ] + ] + }, + { + "id": "e31bd3d3a1c25da5", + "type": "change", + "z": "322b256f0daf33ef", + "name": "min_soc", + "rules": [ + { + "t": "set", + "p": "topic", + "pt": "msg", + "to": "min_soc", + "tot": "str" + } + ], + "action": "", + "property": "", + "from": "", + "to": "", + "reg": false, + "x": 680, + "y": 200, + "wires": [ + [ + "ec4dfbf95393066c" + ] + ] + }, + { + "id": "e96ae0338cc426e7", + "type": "victron-input-custom", + "z": "322b256f0daf33ef", + "service": "com.victronenergy.battery/1", + "path": "/Dc/0/Power", + "serviceObj": { + "service": "com.victronenergy.battery/1", + "name": "com.victronenergy.battery (1)" + }, + "pathObj": { + "path": "/Dc/0/Power", + "name": "/Dc/0/Power", + "type": "number" + }, + "name": "", + "onlyChanges": false, + "x": 200, + "y": 260, + "wires": [ + [ + "86d2d524dcca3330" + ] + ] + }, + { + "id": "86d2d524dcca3330", + "type": "change", + "z": "322b256f0daf33ef", + "name": "battery_power", + "rules": [ + { + "t": "set", + "p": "topic", + "pt": "msg", + "to": "battery_power", + "tot": "str" + } + ], + "action": "", + "property": "", + "from": "", + "to": "", + "reg": false, + "x": 580, + "y": 260, + "wires": [ + [ + "ec4dfbf95393066c" + ] + ] + }, + { + "id": "c21a992cf80c2d6f", + "type": "function", + "z": "322b256f0daf33ef", + "name": "controller_hold_min_soc_&_charge_to_min_soc&heating", + "func": "// get max charge power\nif(msg.payload.max_configured_charge_power==null ||msg.payload.max_configured_charge_power<0){\n max_charge_power=msg.payload.max_battery_charge_power;\n}else{\n max_charge_power=Math.min(msg.payload.max_configured_charge_power,msg.payload.max_battery_charge_power);\n}\n\nmax_inverter_power = msg.payload.num_phases*msg.payload.inverter_power;\n\n// variables for hold_min_soc controller\nBatterySelfDischargePower=200;//W\nn_batteries=msg.payload.num_batteries;\nHoldSocZone=1;\na=-2*BatterySelfDischargePower*n_batteries/HoldSocZone;\nb=-a*(msg.payload.min_soc+HoldSocZone);\nP_CONST = 0.5;\n// min soc among batteries\nsoc = msg.payload.lowest_soc;\ntarget_dc_power_to_hold_min_soc=soc*a+b;\n\n// current power setpoint\ninverter_power_setpoint= msg.payload.L1_AcPowerSetpoint+msg.payload.L2_AcPowerSetpoint+msg.payload.L3_AcPowerSetpoint;\n\nAC_in = msg.payload.AC_In;\nAC_out = msg.payload.AC_Out;\nPV_production =msg.payload.PVs_Power;\n\nif(global.get('start_calibration_charge_now_button','file') == true || global.get('start_calibration_charge_now','file')==1){\n d_p = max_charge_power-n_batteries*msg.payload.battery_power;\n power = AC_out+d_p;\n msg.payload.ess_mode =3;\n msg.payload.controller_info = \"Calibrtaion charge\";\n powerperphase=power/3;\n powerperphase=Math.max(powerperphase,-max_inverter_power);\n powerperphase=Math.floor(Math.min(powerperphase,max_inverter_power));\n msg.payload.power=powerperphase;\n return msg;\n}\n\nif(msg.payload.min_soc<=soc&&soc<=msg.payload.min_soc+1){\n d_p = target_dc_power_to_hold_min_soc-n_batteries*msg.payload.battery_power;\n delta = d_p*P_CONST;\n if(msg.payload.grid_setpoint>0){\n power = inverter_power_setpoint+delta;\n msg.payload.ess_mode =1;\n msg.payload.controller_info = \"Hold min SOC - ESS control\";\n }else{\n power = AC_out+delta-PV_production;\n msg.payload.ess_mode =3;\n msg.payload.controller_info = \"Hold min SOC - external control\";\n }\n}else if(soc Battery Monitor \n", + "storeOutMessages": true, + "fwdInMessages": true, + "resendOnRefresh": true, + "templateScope": "local", + "className": "", + "x": 200, + "y": 480, + "wires": [ + [] + ], + "icon": "node-red/arrow-in.svg" + } +] \ No newline at end of file diff --git a/NodeRed/rc.local b/NodeRed/rc.local new file mode 100755 index 000000000..c0c2248a8 --- /dev/null +++ b/NodeRed/rc.local @@ -0,0 +1,26 @@ +#!/bin/bash + +mount -o remount,rw / + +# Source directory +source_dir="/data/dbus-fzsonick-48tl" + +# Destination directory +destination_dir_upper="/opt/victronenergy/" +destination_dir="/opt/victronenergy/dbus-fzsonick-48tl/" + +# Check if the destination directory exists +if [ -d "$destination_dir" ]; then + # Remove the destination directory + rm -r "$destination_dir" +fi + +# Copy the contents of the source directory to the destination directory +cp -r "$source_dir" "$destination_dir_upper" + +# Set MPPT network mode to 0 +# sed -i "s|('/Link/NetworkMode', [^)]*)|('/Link/NetworkMode', 0)|g" /opt/victronenergy/dbus-systemcalc-py/delegates/dvcc.py +#sed -i "s|self._get_path('/Settings/BmsPresent') == 1|0|g" /opt/victronenergy/dbus-systemcalc-py/delegates/dvcc.py +sed -i "s/self._set_path('\/Link\/NetworkMode', v)/self._set_path('\/Link\/NetworkMode', 0)\n self._set_path('\/Settings\/BmsPresent',0)/" /opt/victronenergy/dbus-systemcalc-py/delegates/dvcc.py + +exit 0 diff --git a/NodeRed/settings-user.js b/NodeRed/settings-user.js new file mode 100644 index 000000000..d76cdd8ec --- /dev/null +++ b/NodeRed/settings-user.js @@ -0,0 +1,31 @@ +module.exports = { + uiHost:"", + /* To password protect the Node-RED editor and admin API, the following + property can be used. See https://nodered.org/docs/security.html for details. + */ + adminAuth: { + sessionExpiryTime: 86400, + type: "credentials", + users: [{ + username: "admin", + password: "$2b$08$d7A0gwkDh4KtultiCAVH6eQ.tQUwVApq.tDVOOYQ51EpLIMbYy2GW",//salidomo + permissions: "*" + }] + }, + + /* Context Storage + The following property can be used to enable context storage. The configuration + provided here will enable file-based context that flushes to disk every 30 seconds. + Refer to the documentation for further options: https://nodered.org/docs/api/context/ + */ + //contextStorage: { + // default: { + // module:"localfilesystem" + // }, + //}, + contextStorage: { + default: "memoryOnly", + memoryOnly: { module: 'memory' }, + file: { module: 'localfilesystem' } + }, + } diff --git a/csharp/InnovEnergy.sln.DotSettings b/csharp/InnovEnergy.sln.DotSettings index 33953991f..22bbb44ce 100644 --- a/csharp/InnovEnergy.sln.DotSettings +++ b/csharp/InnovEnergy.sln.DotSettings @@ -2,6 +2,8 @@ <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /> False + <Policy><Descriptor Staticness="Any" AccessRightKinds="Any" Description="Interfaces"><ElementKinds><Kind Name="INTERFACE" /></ElementKinds></Descriptor><Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /></Policy> + True True True From 41318805e5cd3924a89868cb125cdff6ee8b1923 Mon Sep 17 00:00:00 2001 From: Noe Date: Tue, 28 May 2024 16:25:22 +0200 Subject: [PATCH 02/25] Added dbus-fzsonic folder --- python/dbus-fzsonick-48tl-nofork/config.py | 55 + python/dbus-fzsonick-48tl-nofork/convert.py | 119 ++ python/dbus-fzsonick-48tl-nofork/data.py | 97 ++ .../dbus-fzsonick-48tl.py | 1056 +++++++++++++++++ .../ext/velib_python/ve_utils.py | 276 +++++ .../ext/velib_python/vedbus.py | 614 ++++++++++ python/dbus-fzsonick-48tl-nofork/start.sh | 7 + .../Information/InformationSalidomo.tsx | 2 +- .../FlatInstallationView.tsx | 6 +- .../InstallationSearch.tsx | 4 +- 10 files changed, 2233 insertions(+), 3 deletions(-) create mode 100644 python/dbus-fzsonick-48tl-nofork/config.py create mode 100644 python/dbus-fzsonick-48tl-nofork/convert.py create mode 100644 python/dbus-fzsonick-48tl-nofork/data.py create mode 100755 python/dbus-fzsonick-48tl-nofork/dbus-fzsonick-48tl.py create mode 100644 python/dbus-fzsonick-48tl-nofork/ext/velib_python/ve_utils.py create mode 100644 python/dbus-fzsonick-48tl-nofork/ext/velib_python/vedbus.py create mode 100755 python/dbus-fzsonick-48tl-nofork/start.sh diff --git a/python/dbus-fzsonick-48tl-nofork/config.py b/python/dbus-fzsonick-48tl-nofork/config.py new file mode 100644 index 000000000..5bccd15c6 --- /dev/null +++ b/python/dbus-fzsonick-48tl-nofork/config.py @@ -0,0 +1,55 @@ +import serial +import logging + +# dbus configuration + +FIRMWARE_VERSION = 1 # value returned by getValue (getText returns string value reported by battery) +HARDWARE_VERSION = 1 # value returned by getValue (getText returns string value reported by battery) + +CONNECTION = 'Modbus RTU' +PRODUCT_NAME = 'FZS 48TL200' +PRODUCT_ID = 0xB012 # assigned by victron +DEVICE_INSTANCE = 1 +SERVICE_NAME_PREFIX = 'com.victronenergy.battery.' + +#s3 configuration +S3BUCKET = "2-c0436b6a-d276-4cd8-9c44-1eae86cf5d0e" +S3KEY = "EXO5b2e35442791260eaaa7bdc8" +S3SECRET = "XFFOVzenDiEQoLPmhK6ML9RfQfsAMhrAs25MfJxi-24" + +# driver configuration + +SOFTWARE_VERSION = '3.0.3' +UPDATE_INTERVAL = 2000 # milliseconds +#LOG_LEVEL = logging.INFO +LOG_LEVEL = logging.DEBUG + +# modbus configuration + +BASE_ADDRESS = 999 +#NO_OF_REGISTERS = 63 +NO_OF_REGISTERS = 64 +MAX_SLAVE_ADDRESS = 10 + + +# RS 485 configuration + +PARITY = serial.PARITY_ODD +TIMEOUT = 0.1 # seconds +BAUD_RATE = 115200 +BYTE_SIZE = 8 +STOP_BITS = 1 +MODE = 'rtu' + + +# battery configuration + +MAX_CHARGE_VOLTAGE = 58 +I_MAX_PER_STRING = 15 +NUM_OF_STRING_PER_BATTERY = 5 +AH_PER_STRING = 40 +V_MAX = 54.2 +R_STRING_MIN = 0.125 +R_STRING_MAX = 0.250 + + diff --git a/python/dbus-fzsonick-48tl-nofork/convert.py b/python/dbus-fzsonick-48tl-nofork/convert.py new file mode 100644 index 000000000..2696f1664 --- /dev/null +++ b/python/dbus-fzsonick-48tl-nofork/convert.py @@ -0,0 +1,119 @@ +from collections import Iterable +from decimal import * + +import config as cfg +from data import LedState, BatteryStatus + +# trick the pycharm type-checker into thinking Callable is in scope, not used at runtime +# noinspection PyUnreachableCode +if False: + from typing import Callable + + +def read_bool(register, bit): + # type: (int, int) -> Callable[[BatteryStatus], bool] + + def get_value(status): + # type: (BatteryStatus) -> bool + value = status.modbus_data[register - cfg.BASE_ADDRESS] + return value & (1 << bit) > 0 + + return get_value + + +def read_float(register, scale_factor=1.0, offset=0.0, places=2): + # type: (int, float, float) -> Callable[[BatteryStatus], float] + + def get_value(status): + # type: (BatteryStatus) -> float + value = status.modbus_data[register - cfg.BASE_ADDRESS] + + if value >= 0x8000: # convert to signed int16 + value -= 0x10000 # fiamm stores their integers signed AND with sign-offset @#%^&! + + result = (value+offset)*scale_factor + return round(result,places) + + return get_value + + +def read_hex_string(register, count): + # type: (int, int) -> Callable[[BatteryStatus], str] + """ + reads count consecutive modbus registers from start_address, + and returns a hex representation of it: + e.g. for count=4: DEAD BEEF DEAD BEEF. + """ + start = register - cfg.BASE_ADDRESS + end = start + count + + def get_value(status): + # type: (BatteryStatus) -> str + return ' '.join(['{0:0>4X}'.format(x) for x in status.modbus_data[start:end]]) + + return get_value + + +def read_led_state(register, led): + # type: (int, int) -> Callable[[BatteryStatus], int] + + read_lo = read_bool(register, led * 2) + read_hi = read_bool(register, led * 2 + 1) + + def get_value(status): + # type: (BatteryStatus) -> int + + lo = read_lo(status) + hi = read_hi(status) + + if hi: + if lo: + return LedState.blinking_fast + else: + return LedState.blinking_slow + else: + if lo: + return LedState.on + else: + return LedState.off + + return get_value + + +def read_bitmap(register): + # type: (int) -> Callable[[BatteryStatus], bitmap] + + def get_value(status): + # type: (BatteryStatus) -> bitmap + value = status.modbus_data[register - cfg.BASE_ADDRESS] + return value + + return get_value + + +def append_unit(unit): + # type: (unicode) -> Callable[[unicode], unicode] + + def get_text(v): + # type: (unicode) -> unicode + return "{0}{1}".format(str(v), unit) + + return get_text + + +def mean(numbers): + # type: (Iterable[float] | Iterable[int]) -> float + return float("{:.2f}".format(float(sum(numbers)) / len(numbers))) + +def ssum(numbers): + # type: (Iterable[float] | Iterable[int]) -> float + return float("{:.2f}".format(float(sum(numbers)))) + + +def first(ts): + return next(t for t in ts) + +def return_in_list(ts): + return ts + + diff --git a/python/dbus-fzsonick-48tl-nofork/data.py b/python/dbus-fzsonick-48tl-nofork/data.py new file mode 100644 index 000000000..05cdd1aa7 --- /dev/null +++ b/python/dbus-fzsonick-48tl-nofork/data.py @@ -0,0 +1,97 @@ +import config as cfg +from collections import Iterable + +# trick the pycharm type-checker into thinking Callable is in scope, not used at runtime +# noinspection PyUnreachableCode +if False: + from typing import Callable + + +class LedState(object): + """ + from page 6 of the '48TLxxx ModBus Protocol doc' + """ + off = 0 + on = 1 + blinking_slow = 2 + blinking_fast = 3 + + +class LedColor(object): + green = 0 + amber = 1 + blue = 2 + red = 3 + + + +class CsvSignal(object): + def __init__(self, name, get_value, get_text = None): + self.name = name + self.get_value = get_value if callable(get_value) else lambda _: get_value + self.get_text = get_text + + if get_text is None: + self.get_text = "" + +class Signal(object): + + def __init__(self, dbus_path, aggregate, get_value, get_text=None): + # type: (str, Callable[[Iterable[object]],object], Callable[[BatteryStatus],object] | object, Callable[[object],unicode] | object)->None + """ + A Signal holds all information necessary for the handling of a + certain datum (e.g. voltage) published by the battery. + + :param dbus_path: str + object_path on DBus where the datum needs to be published + + :param aggregate: Iterable[object] -> object + function that combines the values of multiple batteries into one. + e.g. sum for currents, or mean for voltages + + :param get_value: (BatteryStatus) -> object + function to extract the datum from the modbus record, + alternatively: a constant + + :param get_text: (object) -> unicode [optional] + function to render datum to text, needed by DBus + alternatively: a constant + """ + + self.dbus_path = dbus_path + self.aggregate = aggregate + self.get_value = get_value if callable(get_value) else lambda _: get_value + self.get_text = get_text if callable(get_text) else lambda _: str(get_text) + + # if no 'get_text' provided use 'default_text' if available, otherwise str() + if get_text is None: + self.get_text = str + + +class Battery(object): + + """ Data record to hold hardware and firmware specs of the battery """ + + def __init__(self, slave_address, hardware_version, firmware_version, bms_version, ampere_hours): + # type: (int, str, str, str, int) -> None + self.slave_address = slave_address + self.hardware_version = hardware_version + self.firmware_version = firmware_version + self.bms_version = bms_version + self.ampere_hours = ampere_hours + + + def __str__(self): + return 'slave address = {0}\nhardware version = {1}\nfirmware version = {2}\nbms version = {3}\nampere hours = {4}'.format( + self.slave_address, self.hardware_version, self.firmware_version, self.bms_version, str(self.ampere_hours)) + + +class BatteryStatus(object): + """ + record holding the current status of a battery + """ + def __init__(self, battery, modbus_data): + # type: (Battery, list[int]) -> None + + self.battery = battery + self.modbus_data = modbus_data diff --git a/python/dbus-fzsonick-48tl-nofork/dbus-fzsonick-48tl.py b/python/dbus-fzsonick-48tl-nofork/dbus-fzsonick-48tl.py new file mode 100755 index 000000000..ad017c7b1 --- /dev/null +++ b/python/dbus-fzsonick-48tl-nofork/dbus-fzsonick-48tl.py @@ -0,0 +1,1056 @@ +#!/usr/bin/python3 -u +# coding=utf-8 + +import re +import sys +import logging +from gi.repository import GLib + +import config as cfg +import convert as c + +from pymodbus.register_read_message import ReadInputRegistersResponse +from pymodbus.client.sync import ModbusSerialClient as Modbus +from pymodbus.other_message import ReportSlaveIdRequest +from pymodbus.exceptions import ModbusException +from pymodbus.pdu import ExceptionResponse + +from dbus.mainloop.glib import DBusGMainLoop +from data import BatteryStatus, Signal, Battery, LedColor, CsvSignal, LedState + +from collections import Iterable +from os import path + +app_dir = path.dirname(path.realpath(__file__)) +sys.path.insert(1, path.join(app_dir, 'ext', 'velib_python')) + +from vedbus import VeDbusService as DBus + +import time +import os +import csv + +import requests +import hmac +import hashlib +import base64 +from datetime import datetime +import io +import json + +import requests +import hmac +import hashlib +import base64 +from datetime import datetime +import pika +import time + + +# zip-comp additions +import zipfile +import io + +def compress_csv_data(csv_data, file_name="data.csv"): + + memory_stream = io.BytesIO() + + # Create a zip archive in the memory buffer + with zipfile.ZipFile(memory_stream, 'w', zipfile.ZIP_DEFLATED) as archive: + # Add CSV data to the ZIP archive + with archive.open('data.csv', 'w') as entry_stream: + entry_stream.write(csv_data.encode('utf-8')) + + # Get the compressed byte array from the memory buffer + compressed_bytes = memory_stream.getvalue() + + # Encode the compressed byte array as a Base64 string + base64_string = base64.b64encode(compressed_bytes).decode('utf-8') + + return base64_string + +class S3config: + def __init__(self): + self.bucket = cfg.S3BUCKET + self.region = "sos-ch-dk-2" + self.provider = "exo.io" + self.key = cfg.S3KEY + self.secret = cfg.S3SECRET + self.content_type = "application/base64; charset=utf-8" + + @property + def host(self): + return f"{self.bucket}.{self.region}.{self.provider}" + + @property + def url(self): + return f"https://{self.host}" + + def create_put_request(self, s3_path, data): + headers = self._create_request("PUT", s3_path) + url = f"{self.url}/{s3_path}" + response = requests.put(url, headers=headers, data=data) + return response + + def _create_request(self, method, s3_path): + date = datetime.utcnow().strftime('%a, %d %b %Y %H:%M:%S GMT') + auth = self._create_authorization(method, self.bucket, s3_path, date, self.key, self.secret, self.content_type) + headers = { + "Host": self.host, + "Date": date, + "Authorization": auth, + "Content-Type": self.content_type + } + return headers + + @staticmethod + def _create_authorization(method, bucket, s3_path, date, s3_key, s3_secret, content_type="", md5_hash=""): + payload = f"{method}\n{md5_hash}\n{content_type}\n{date}\n/{bucket.strip('/')}/{s3_path.strip('/')}" + signature = base64.b64encode( + hmac.new(s3_secret.encode(), payload.encode(), hashlib.sha1).digest() + ).decode() + return f"AWS {s3_key}:{signature}" + + @staticmethod + def _create_authorization(method, bucket, s3_path, date, s3_key, s3_secret, content_type="", md5_hash=""): + payload = f"{method}\n{md5_hash}\n{content_type}\n{date}\n/{bucket.strip('/')}/{s3_path.strip('/')}" + signature = base64.b64encode( + hmac.new(s3_secret.encode(), payload.encode(), hashlib.sha1).digest() + ).decode() + return f"AWS {s3_key}:{signature}" + +def read_csv_as_string(file_path): + """ + Reads a CSV file from the given path and returns its content as a single string. + """ + try: + with open(file_path, 'r', encoding='utf-8') as file: + return file.read() + except FileNotFoundError: + print(f"Error: The file {file_path} does not exist.") + return None + except IOError as e: + print(f"IO error occurred: {str(e)}") + return None + +CSV_DIR = "/data/csv_files/" +#CSV_DIR = "csv_files/" + +# Define the path to the file containing the installation name +INSTALLATION_NAME_FILE = '/data/innovenergy/openvpn/installation-name' + + +# trick the pycharm type-checker into thinking Callable is in scope, not used at runtime +# noinspection PyUnreachableCode +if False: + from typing import Callable + +def interpret_limb_bitmap(bitmap_value): + # The bit for string 1 also monitors all 5 strings: 0000 0000 means All 5 strings activated. 0000 0001 means string 1 disabled. + string1_disabled = int((bitmap_value & 0b00001) != 0) + string2_disabled = int((bitmap_value & 0b00010) != 0) + string3_disabled = int((bitmap_value & 0b00100) != 0) + string4_disabled = int((bitmap_value & 0b01000) != 0) + string5_disabled = int((bitmap_value & 0b10000) != 0) + n_limb_strings = string1_disabled+string2_disabled+string3_disabled+string4_disabled+string5_disabled + return n_limb_strings + +def calc_power_limit_imposed_by_voltage_limit(v, i, v_limit, r_int): + # type: (float, float, float, float) -> float + dv = v_limit - v + di = dv / r_int + p_limit = v_limit * (i + di) + return p_limit + +def calc_power_limit_imposed_by_current_limit(v, i, i_limit, r_int): + # type: (float, float, float, float) -> float + di = i_limit - i + dv = di * r_int + p_limit = i_limit * (v + dv) + return p_limit + +def read_switch_closed(status): + value = c.read_bool(register=1013, bit=0)(status) + if value: + return False + return True + +def read_alarm_out_active(status): + value = c.read_bool(register=1013, bit=1)(status) + if value: + return False + return True + +def read_aux_relay(status): + value = c.read_bool(register=1013, bit=4)(status) + if value: + return False + return True + +def hex_string_to_ascii(hex_string): + # Ensure the hex_string is correctly formatted without spaces + hex_string = hex_string.replace(" ", "") + # Convert every two characters (a byte) in the hex string to ASCII + ascii_string = ''.join([chr(int(hex_string[i:i+2], 16)) for i in range(0, len(hex_string), 2)]) + return ascii_string + +battery_status_reader = c.read_hex_string(1060,2) + +def read_eoc_reached(status): + battery_status_string = battery_status_reader(status) + return hex_string_to_ascii(battery_status_string) == "EOC_" + +def return_led_state(status, color): + led_state = c.read_led_state(register=1004, led=color)(status) + if led_state == LedState.blinking_fast or led_state == LedState.blinking_slow: + return "Blinking" + elif led_state == LedState.on: + return "On" + elif led_state == LedState.off: + return "Off" + return "Unknown" + +def return_led_state_blue(status): + return return_led_state(status, LedColor.blue) + +def return_led_state_red(status): + return return_led_state(status, LedColor.red) + +def return_led_state_green(status): + return return_led_state(status, LedColor.green) + +def return_led_state_amber(status): + return return_led_state(status, LedColor.amber) + +def read_serial_number(status): + serial_regs = [1055, 1056, 1057, 1058] + serial_parts = [] + for reg in serial_regs: + # reading each register as a single hex value + hex_value_fun = c.read_hex_string(reg, 1) + hex_value = hex_value_fun(status) + # append without spaces and leading zeros stripped if any + serial_parts.append(hex_value.replace(' ', '')) + # concatenate all parts to form the full serial number + serial_number = ''.join(serial_parts).rstrip('0') + return serial_number + +def time_since_toc_in_time_format(status): + time_in_minutes = c.read_float(register=1052)(status) + # Convert minutes to total seconds + total_seconds = int(time_in_minutes * 60) + # Calculate days, hours, minutes, and seconds + days = total_seconds // (24 * 3600) + total_seconds = total_seconds % (24 * 3600) + hours = total_seconds // 3600 + total_seconds %= 3600 + minutes = total_seconds // 60 + seconds = total_seconds % 60 + # Format the string to show days.hours:minutes:seconds + return f"{days}.{hours:02}:{minutes:02}:{seconds:02}" + +def create_csv_signals(firmware_version): + read_voltage = c.read_float(register=999, scale_factor=0.01, offset=0, places=2) + read_current = c.read_float(register=1000, scale_factor=0.01, offset=-10000, places=2) + read_limb_bitmap = c.read_bitmap(1059) + + def read_power(status): + return int(read_current(status) * read_voltage(status)) + + def string1_disabled(status): + bitmap_value = read_limb_bitmap(status) + return int((bitmap_value & 0b00001) != 0) + + def string2_disabled(status): + bitmap_value = read_limb_bitmap(status) + return int((bitmap_value & 0b00010) != 0) + + def string3_disabled(status): + bitmap_value = read_limb_bitmap(status) + return int((bitmap_value & 0b00100) != 0) + + def string4_disabled(status): + bitmap_value = read_limb_bitmap(status) + return int((bitmap_value & 0b01000) != 0) + + def string5_disabled(status): + bitmap_value = read_limb_bitmap(status) + return int((bitmap_value & 0b10000) != 0) + + def limp_strings_value(status): + return interpret_limb_bitmap(read_limb_bitmap(status)) + + def calc_max_charge_power(status): + # type: (BatteryStatus) -> int + n_strings = cfg.NUM_OF_STRING_PER_BATTERY-limp_strings_value(status) + i_max = n_strings * cfg.I_MAX_PER_STRING + v_max = cfg.V_MAX + r_int_min = cfg.R_STRING_MIN / n_strings + r_int_max = cfg.R_STRING_MAX / n_strings + + v = read_voltage(status) + i = read_current(status) + + p_limits = [ + calc_power_limit_imposed_by_voltage_limit(v, i, v_max, r_int_min), + calc_power_limit_imposed_by_voltage_limit(v, i, v_max, r_int_max), + calc_power_limit_imposed_by_current_limit(v, i, i_max, r_int_min), + calc_power_limit_imposed_by_current_limit(v, i, i_max, r_int_max), + ] + + p_limit = min(p_limits) # p_limit is normally positive here (signed) + p_limit = max(p_limit, 0) # charge power must not become negative + + return int(p_limit) + + def calc_max_discharge_power(status): + n_strings = cfg.NUM_OF_STRING_PER_BATTERY-limp_strings_value(status) + max_discharge_current = n_strings*cfg.I_MAX_PER_STRING + return int(max_discharge_current*read_voltage(status)) + + total_current = c.read_float(register=1062, scale_factor=0.01, offset=-10000, places=1) + + def read_total_current(status): + return total_current(status) + + def read_heating_current(status): + return total_current(status) - read_current(status) + + def read_heating_power(status): + return read_voltage(status) * read_heating_current(status) + + soc_ah = c.read_float(register=1002, scale_factor=0.1, offset=-10000, places=1) + + def read_soc_ah(status): + return soc_ah(status) + + return [ + CsvSignal('/Battery/Devices/FwVersion', firmware_version), + CsvSignal('/Battery/Devices/Dc/Power', read_power, 'W'), + CsvSignal('/Battery/Devices/Dc/Voltage', read_voltage, 'V'), + CsvSignal('/Battery/Devices/Soc', c.read_float(register=1053, scale_factor=0.1, offset=0, places=1), '%'), + CsvSignal('/Battery/Devices/Temperatures/Cells/Average', c.read_float(register=1003, scale_factor=0.1, offset=-400, places=1), 'C'), + CsvSignal('/Battery/Devices/Dc/Current', read_current, 'A'), + CsvSignal('/Battery/Devices/BusCurrent', read_total_current, 'A'), + CsvSignal('/Battery/Devices/CellsCurrent', read_current, 'A'), + CsvSignal('/Battery/Devices/HeatingCurrent', read_heating_current, 'A'), + CsvSignal('/Battery/Devices/HeatingPower', read_heating_power, 'W'), + CsvSignal('/Battery/Devices/SOCAh', read_soc_ah), + CsvSignal('/Battery/Devices/Leds/Blue', return_led_state_blue), + CsvSignal('/Battery/Devices/Leds/Red', return_led_state_red), + CsvSignal('/Battery/Devices/Leds/Green', return_led_state_green), + CsvSignal('/Battery/Devices/Leds/Amber', return_led_state_amber), + CsvSignal('/Battery/Devices/BatteryStrings/String1Active', string1_disabled), + CsvSignal('/Battery/Devices/BatteryStrings/String2Active', string2_disabled), + CsvSignal('/Battery/Devices/BatteryStrings/String3Active', string3_disabled), + CsvSignal('/Battery/Devices/BatteryStrings/String4Active', string4_disabled), + CsvSignal('/Battery/Devices/BatteryStrings/String5Active', string5_disabled), + CsvSignal('/Battery/Devices/IoStatus/ConnectedToDcBus', read_switch_closed), + CsvSignal('/Battery/Devices/IoStatus/AlarmOutActive', read_alarm_out_active), + CsvSignal('/Battery/Devices/IoStatus/InternalFanActive', c.read_bool(register=1013, bit=2)), + CsvSignal('/Battery/Devices/IoStatus/VoltMeasurementAllowed', c.read_bool(register=1013, bit=3)), + CsvSignal('/Battery/Devices/IoStatus/AuxRelayBus', read_aux_relay), + CsvSignal('/Battery/Devices/IoStatus/RemoteStateActive', c.read_bool(register=1013, bit=5)), + CsvSignal('/Battery/Devices/IoStatus/RiscActive', c.read_bool(register=1013, bit=6)), + CsvSignal('/Battery/Devices/Eoc', read_eoc_reached), + CsvSignal('/Battery/Devices/SerialNumber', read_serial_number), + CsvSignal('/Battery/Devices/TimeSinceTOC', time_since_toc_in_time_format), + CsvSignal('/Battery/Devices/MaxChargePower', calc_max_charge_power), + CsvSignal('/Battery/Devices/MaxDischargePower', calc_max_discharge_power), + ] + +def init_signals(hardware_version, firmware_version, n_batteries): + # type: (str,str,int) -> Iterable[Signal] + """ + A Signal holds all information necessary for the handling of a + certain datum (e.g. voltage) published by the battery. + + Signal(dbus_path, aggregate, get_value, get_text = str) + + dbus_path: str + object_path on DBus where the datum needs to be published + + aggregate: Iterable[object] -> object + function that combines the values of multiple batteries into one. + e.g. sum for currents, or mean for voltages + + get_value: (BatteryStatus) -> object [optional] + function to extract the datum from the modbus record, + alternatively: a constant + + get_text: (object) -> unicode [optional] + function to render datum to text, needed by DBus + alternatively: a constant + + The conversion functions use the same parameters (e.g scale_factor, offset) + as described in the document 'T48TLxxx ModBus Protocol Rev.7.1' which can + be found in the /doc folder + """ + + product_id_hex = '0x{0:04x}'.format(cfg.PRODUCT_ID) + + read_voltage = c.read_float(register=999, scale_factor=0.01, offset=0, places=2) + read_current = c.read_float(register=1000, scale_factor=0.01, offset=-10000, places=2) + read_limb_bitmap = c.read_bitmap(1059) + + def read_power(status): + return int(read_current(status) * read_voltage(status)) + + def limp_strings_value(status): + return interpret_limb_bitmap(read_limb_bitmap(status)) + + def max_discharge_current(status): + return (cfg.NUM_OF_STRING_PER_BATTERY-limp_strings_value(status))*cfg.I_MAX_PER_STRING + + def max_charge_current(status): + return status.battery.ampere_hours/2 + + def calc_max_charge_power(status): + # type: (BatteryStatus) -> int + n_strings = cfg.NUM_OF_STRING_PER_BATTERY-limp_strings_value(status) + i_max = n_strings * cfg.I_MAX_PER_STRING + v_max = cfg.V_MAX + r_int_min = cfg.R_STRING_MIN / n_strings + r_int_max = cfg.R_STRING_MAX / n_strings + + v = read_voltage(status) + i = read_current(status) + + p_limits = [ + calc_power_limit_imposed_by_voltage_limit(v, i, v_max, r_int_min), + calc_power_limit_imposed_by_voltage_limit(v, i, v_max, r_int_max), + calc_power_limit_imposed_by_current_limit(v, i, i_max, r_int_min), + calc_power_limit_imposed_by_current_limit(v, i, i_max, r_int_max), + ] + + p_limit = min(p_limits) # p_limit is normally positive here (signed) + p_limit = max(p_limit, 0) # charge power must not become negative + + return int(p_limit) + + product_name = cfg.PRODUCT_NAME + if n_batteries > 1: + product_name = cfg.PRODUCT_NAME + ' x' + str(n_batteries) + + return [ + # Node Red related dbus paths + Signal('/TimeToTOCRequest', max, c.read_float(register=1052)), + Signal('/EOCReached', c.return_in_list, read_eoc_reached), + Signal('/NumOfLimbStrings', c.return_in_list, get_value=limp_strings_value), + Signal('/NumOfBatteries', max, get_value=n_batteries), + Signal('/Dc/0/Voltage', c.mean, get_value=read_voltage, get_text=c.append_unit('V')), + Signal('/Dc/0/Current', c.ssum, get_value=read_current, get_text=c.append_unit('A')), + Signal('/Dc/0/Power', c.ssum, get_value=read_power, get_text=c.append_unit('W')), + Signal('/BussVoltage', c.mean, c.read_float(register=1001, scale_factor=0.01, offset=0, places=2), c.append_unit('V')), + Signal('/Soc', min, c.read_float(register=1053, scale_factor=0.1, offset=0, places=1), c.append_unit('%')), + Signal('/LowestSoc', min, c.read_float(register=1053, scale_factor=0.1, offset=0, places=1), c.append_unit('%')), + Signal('/Dc/0/Temperature', c.mean, c.read_float(register=1003, scale_factor=0.1, offset=-400, places=1), c.append_unit(u'°C')), + Signal('/Dc/0/LowestTemperature', min, c.read_float(register=1003, scale_factor=0.1, offset=-400, places=1), c.append_unit(u'°C')), + # Charge/Discharge current, voltage and power + Signal('/Info/MaxDischargeCurrent', c.ssum, max_discharge_current,c.append_unit('A')), + Signal('/Info/MaxChargeCurrent', c.ssum, max_charge_current, c.append_unit('A')), + Signal('/Info/MaxChargeVoltage', min, cfg.MAX_CHARGE_VOLTAGE, c.append_unit('V')), + Signal('/Info/MaxChargePower', c.ssum, calc_max_charge_power), + # Victron mandatory dbus paths + Signal('/Mgmt/ProcessName', c.first, __file__), + Signal('/Mgmt/ProcessVersion', c.first, cfg.SOFTWARE_VERSION), + Signal('/Mgmt/Connection', c.first, cfg.CONNECTION), + Signal('/DeviceInstance', c.first, cfg.DEVICE_INSTANCE), + Signal('/ProductName', c.first, product_name), + Signal('/ProductId', c.first, cfg.PRODUCT_ID, product_id_hex), + Signal('/Connected', c.first, 1), + Signal('/FirmwareVersion', c.return_in_list, firmware_version), + Signal('/HardwareVersion', c.first, cfg.HARDWARE_VERSION, hardware_version), + # Diagnostics + Signal('/Diagnostics/BmsVersion', c.first, lambda s: s.battery.bms_version), + # Warnings + Signal('/WarningFlags/TaM1', c.return_in_list, c.read_bool(register=1005, bit=1)), + Signal('/WarningFlags/TbM1', c.return_in_list, c.read_bool(register=1005, bit=4)), + Signal('/WarningFlags/VBm1', c.return_in_list, c.read_bool(register=1005, bit=6)), + Signal('/WarningFlags/VBM1', c.return_in_list, c.read_bool(register=1005, bit=8)), + Signal('/WarningFlags/IDM1', c.return_in_list, c.read_bool(register=1005, bit=10)), + Signal('/WarningFlags/vsm1', c.return_in_list, c.read_bool(register=1005, bit=22)), + Signal('/WarningFlags/vsM1', c.return_in_list, c.read_bool(register=1005, bit=24)), + Signal('/WarningFlags/iCM1', c.return_in_list, c.read_bool(register=1005, bit=26)), + Signal('/WarningFlags/iDM1', c.return_in_list, c.read_bool(register=1005, bit=28)), + Signal('/WarningFlags/MID1', c.return_in_list, c.read_bool(register=1005, bit=30)), + Signal('/WarningFlags/BLPW', c.return_in_list, c.read_bool(register=1005, bit=32)), + Signal('/WarningFlags/CCBF', c.return_in_list, c.read_bool(register=1005, bit=33)), + Signal('/WarningFlags/Ah_W', c.return_in_list, c.read_bool(register=1005, bit=35)), + Signal('/WarningFlags/MPMM', c.return_in_list, c.read_bool(register=1005, bit=38)), + Signal('/WarningFlags/TCdi', c.return_in_list, c.read_bool(register=1005, bit=40)), + Signal('/WarningFlags/LMPW', c.return_in_list, c.read_bool(register=1005, bit=44)), + Signal('/WarningFlags/TOCW', c.return_in_list, c.read_bool(register=1005, bit=47)), + Signal('/WarningFlags/BUSL', c.return_in_list, c.read_bool(register=1005, bit=49)), + # Alarms + Signal('/AlarmFlags/Tam', c.return_in_list, c.read_bool(register=1005, bit=0)), + Signal('/AlarmFlags/TaM2', c.return_in_list, c.read_bool(register=1005, bit=2)), + Signal('/AlarmFlags/Tbm', c.return_in_list, c.read_bool(register=1005, bit=3)), + Signal('/AlarmFlags/TbM2', c.return_in_list, c.read_bool(register=1005, bit=5)), + Signal('/AlarmFlags/VBm2', c.return_in_list, c.read_bool(register=1005, bit=7)), + Signal('/AlarmFlags/VBM2', c.return_in_list, c.read_bool(register=1005, bit=9)), + Signal('/AlarmFlags/IDM2', c.return_in_list, c.read_bool(register=1005, bit=11)), + Signal('/AlarmFlags/ISOB', c.return_in_list, c.read_bool(register=1005, bit=12)), + Signal('/AlarmFlags/MSWE', c.return_in_list, c.read_bool(register=1005, bit=13)), + Signal('/AlarmFlags/FUSE', c.return_in_list, c.read_bool(register=1005, bit=14)), + Signal('/AlarmFlags/HTRE', c.return_in_list, c.read_bool(register=1005, bit=15)), + Signal('/AlarmFlags/TCPE', c.return_in_list, c.read_bool(register=1005, bit=16)), + Signal('/AlarmFlags/STRE', c.return_in_list, c.read_bool(register=1005, bit=17)), + Signal('/AlarmFlags/CME', c.return_in_list, c.read_bool(register=1005, bit=18)), + Signal('/AlarmFlags/HWFL', c.return_in_list, c.read_bool(register=1005, bit=19)), + Signal('/AlarmFlags/HWEM', c.return_in_list, c.read_bool(register=1005, bit=20)), + Signal('/AlarmFlags/ThM', c.return_in_list, c.read_bool(register=1005, bit=21)), + Signal('/AlarmFlags/vsm2', c.return_in_list, c.read_bool(register=1005, bit=23)), + Signal('/AlarmFlags/vsM2', c.return_in_list, c.read_bool(register=1005, bit=25)), + Signal('/AlarmFlags/iCM2', c.return_in_list, c.read_bool(register=1005, bit=27)), + Signal('/AlarmFlags/iDM2', c.return_in_list, c.read_bool(register=1005, bit=29)), + Signal('/AlarmFlags/MID2', c.return_in_list, c.read_bool(register=1005, bit=31)), + Signal('/AlarmFlags/HTFS', c.return_in_list, c.read_bool(register=1005, bit=42)), + Signal('/AlarmFlags/DATA', c.return_in_list, c.read_bool(register=1005, bit=43)), + Signal('/AlarmFlags/LMPA', c.return_in_list, c.read_bool(register=1005, bit=45)), + Signal('/AlarmFlags/HEBT', c.return_in_list, c.read_bool(register=1005, bit=46)), + Signal('/AlarmFlags/CURM', c.return_in_list, c.read_bool(register=1005, bit=48)), + # LedStatus + Signal('/Diagnostics/LedStatus/Red', c.first, c.read_led_state(register=1004, led=LedColor.red)), + Signal('/Diagnostics/LedStatus/Blue', c.first, c.read_led_state(register=1004, led=LedColor.blue)), + Signal('/Diagnostics/LedStatus/Green', c.first, c.read_led_state(register=1004, led=LedColor.green)), + Signal('/Diagnostics/LedStatus/Amber', c.first, c.read_led_state(register=1004, led=LedColor.amber)), + # IO Status + Signal('/Diagnostics/IoStatus/MainSwitchClosed', c.return_in_list, read_switch_closed), + Signal('/Diagnostics/IoStatus/AlarmOutActive', c.return_in_list, read_alarm_out_active), + Signal('/Diagnostics/IoStatus/InternalFanActive', c.return_in_list, c.read_bool(register=1013, bit=2)), + Signal('/Diagnostics/IoStatus/VoltMeasurementAllowed', c.return_in_list, c.read_bool(register=1013, bit=3)), + Signal('/Diagnostics/IoStatus/AuxRelay', c.return_in_list, read_aux_relay), + Signal('/Diagnostics/IoStatus/RemoteState', c.return_in_list, c.read_bool(register=1013, bit=5)), + Signal('/Diagnostics/IoStatus/RiscOn', c.return_in_list, c.read_bool(register=1013, bit=6)), + ] + +def init_modbus(tty): + # type: (str) -> Modbus + logging.debug('initializing Modbus') + return Modbus( + port='/dev/' + tty, + method=cfg.MODE, + baudrate=cfg.BAUD_RATE, + stopbits=cfg.STOP_BITS, + bytesize=cfg.BYTE_SIZE, + timeout=cfg.TIMEOUT, + parity=cfg.PARITY) + +def init_dbus(tty, signals): + # type: (str, Iterable[Signal]) -> DBus + logging.debug('initializing DBus service') + dbus = DBus(servicename=cfg.SERVICE_NAME_PREFIX + tty) + logging.debug('initializing DBus paths') + for signal in signals: + init_dbus_path(dbus, signal) + return dbus + +# noinspection PyBroadException +def try_get_value(sig): + # type: (Signal) -> object + try: + return sig.get_value(None) + except: + return None + +def init_dbus_path(dbus, sig): + # type: (DBus, Signal) -> () + dbus.add_path( + sig.dbus_path, + try_get_value(sig), + gettextcallback=lambda _, v: sig.get_text(v)) + +def init_main_loop(): + # type: () -> DBusGMainLoop + logging.debug('initializing DBusGMainLoop Loop') + DBusGMainLoop(set_as_default=True) + return GLib.MainLoop() + +def report_slave_id(modbus, slave_address): + # type: (Modbus, int) -> str + slave = str(slave_address) + logging.debug('requesting slave id from node ' + slave) + try: + modbus.connect() + request = ReportSlaveIdRequest(unit=slave_address) + response = modbus.execute(request) + if response is ExceptionResponse or issubclass(type(response), ModbusException): + raise Exception('failed to get slave id from ' + slave + ' : ' + str(response)) + return response.identifier + finally: + modbus.close() + +def identify_battery(modbus, slave_address): + # type: (Modbus, int) -> Battery + logging.info('identifying battery...') + hardware_version, bms_version, ampere_hours = parse_slave_id(modbus, slave_address) + firmware_version = read_firmware_version(modbus, slave_address) + specs = Battery( + slave_address=slave_address, + hardware_version=hardware_version, + firmware_version=firmware_version, + bms_version=bms_version, + ampere_hours=ampere_hours) + logging.info('battery identified:\n{0}'.format(str(specs))) + return specs + +def identify_batteries(modbus): + # type: (Modbus) -> list[Battery] + def _identify_batteries(): + address_range = range(1, cfg.MAX_SLAVE_ADDRESS + 1) + for slave_address in address_range: + try: + yield identify_battery(modbus, slave_address) + except Exception as e: + logging.info('failed to identify battery at {0} : {1}'.format(str(slave_address), str(e))) + return list(_identify_batteries()) # force that lazy iterable! + +def parse_slave_id(modbus, slave_address): + # type: (Modbus, int) -> (str, str, int) + slave_id = report_slave_id(modbus, slave_address) + sid = re.sub(b'[^\x20-\x7E]', b'', slave_id) # remove weird special chars + match = re.match('(?P48TL(?P\d+)) *(?P.*)', sid.decode('ascii')) + if match is None: + raise Exception('no known battery found') + return match.group('hw'), match.group('bms'), int(match.group('ah')) + +def read_firmware_version(modbus, slave_address): + # type: (Modbus, int) -> str + logging.debug('reading firmware version') + try: + modbus.connect() + response = read_modbus_registers(modbus, slave_address, base_address=1054, count=1) + register = response.registers[0] + return '{0:0>4X}'.format(register) + finally: + modbus.close() # close in any case + +def read_modbus_registers(modbus, slave_address, base_address=cfg.BASE_ADDRESS, count=cfg.NO_OF_REGISTERS): + # type: (Modbus, int) -> ReadInputRegistersResponse + logging.debug('requesting modbus registers {0}-{1}'.format(base_address, base_address + count)) + return modbus.read_input_registers( + address=base_address, + count=count, + unit=slave_address) + +def read_battery_status(modbus, battery): + # type: (Modbus, Battery) -> BatteryStatus + """ + Read the modbus registers containing the battery's status info. + """ + logging.debug('reading battery status') + try: + modbus.connect() + data = read_modbus_registers(modbus, battery.slave_address) + return BatteryStatus(battery, data.registers) + finally: + modbus.close() # close in any case + +def publish_values(dbus, signals, statuses): + # type: (DBus, Iterable[Signal], Iterable[BatteryStatus]) -> () + for s in signals: + values = [s.get_value(status) for status in statuses] + with dbus as srv: + srv[s.dbus_path] = s.aggregate(values) + +previous_warnings = {} +previous_alarms = {} + +class MessageType: + ALARM_OR_WARNING = "AlarmOrWarning" + HEARTBEAT = "Heartbeat" + +class AlarmOrWarning: + def __init__(self, description, created_by): + self.date = datetime.now().strftime('%Y-%m-%d') + self.time = datetime.now().strftime('%H:%M:%S') + self.description = description + self.created_by = created_by + + def to_dict(self): + return { + "Date": self.date, + "Time": self.time, + "Description": self.description, + "CreatedBy": self.created_by + } + +def SubscribeToQueue(): + try: + connection = pika.BlockingConnection(pika.ConnectionParameters(host="10.2.0.11", + port=5672, + virtual_host="/", + credentials=pika.PlainCredentials("producer", "b187ceaddb54d5485063ddc1d41af66f"))) + channel = connection.channel() + channel.queue_declare(queue="statusQueue", durable=True) + print("Subscribed to queue") + except Exception as ex: + print("An error occurred while connecting to the RabbitMQ queue:", ex) + return channel + +is_first_update = True +first_subscribe = False +prev_status=0 +subscribed_to_queue_first_time=False +channel = SubscribeToQueue() +heartbit_interval = 0 +# Create an S3config instance +s3_config = S3config() +INSTALLATION_ID=int(s3_config.bucket.split('-')[0]) +PRODUCT_ID = 1 + +def update_state_from_dictionaries(current_warnings, current_alarms): + global previous_warnings, previous_alarms, INSTALLATION_ID, PRODUCT_ID, is_first_update, first_subscribe, channel,prev_status,heartbit_interval,subscribed_to_queue_first_time + + heartbit_interval+=1 + + if is_first_update: + changed_warnings = current_warnings + changed_alarms = current_alarms + is_first_update = False + else: + changed_alarms={} + changed_warnings={} + # calculate the diff in warnings and alarms + prev_alarm_value_list=list(previous_alarms.values()) + alarm_keys=list(previous_alarms.keys()) + + for i, alarm in enumerate(current_alarms.values()): + if alarm!=prev_alarm_value_list[i]: + changed_alarms[alarm_keys[i]]=True + else: + changed_alarms[alarm_keys[i]]=False + + prev_warning_value_list=list(previous_warnings.values()) + warning_keys=list(previous_warnings.keys()) + + for i, warning in enumerate(current_warnings.values()): + if warning!=prev_warning_value_list[i]: + changed_warnings[warning_keys[i]]=True + else: + changed_warnings[warning_keys[i]]=False + + status_message = { + "InstallationId": INSTALLATION_ID, + "Product": PRODUCT_ID, + "Status": 0, + "Type": 1, + "Warnings": [], + "Alarms": [] + } + + # 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()) + + 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()) + + if any(current_alarms.values()): + status_message["Status"]=2 + + if not any(current_alarms.values()) and any(current_warnings.values()): + status_message["Status"]=1 + + if not any(current_alarms.values()) and not any(current_warnings.values()): + status_message["Status"]=0 + + if status_message["Status"]!=prev_status or len(status_message["Warnings"])>0 or len(status_message["Alarms"])>0: + prev_status=status_message["Status"] + status_message["Type"]=0 + status_message = json.dumps(status_message) + channel.basic_publish(exchange="", routing_key="statusQueue", body=status_message) + print(status_message) + print("Message sent successfully") + elif heartbit_interval>=15 or not subscribed_to_queue_first_time: + print("Send heartbit message to rabbitmq") + heartbit_interval=0 + subscribed_to_queue_first_time=True + status_message = json.dumps(status_message) + channel.basic_publish(exchange="", routing_key="statusQueue", body=status_message) + + previous_warnings = current_warnings.copy() + previous_alarms = current_alarms.copy() + + return status_message + +def read_warning_and_alarm_flags(): + return [ + # Warnings + CsvSignal('/Battery/Devices/WarningFlags/TaM1', c.read_bool(register=1005, bit=1)), + CsvSignal('/Battery/Devices/WarningFlags/TbM1', c.read_bool(register=1005, bit=4)), + CsvSignal('/Battery/Devices/WarningFlags/VBm1', c.read_bool(register=1005, bit=6)), + CsvSignal('/Battery/Devices/WarningFlags/VBM1', c.read_bool(register=1005, bit=8)), + CsvSignal('/Battery/Devices/WarningFlags/IDM1', c.read_bool(register=1005, bit=10)), + CsvSignal('/Battery/Devices/WarningFlags/vsm1', c.read_bool(register=1005, bit=22)), + CsvSignal('/Battery/Devices/WarningFlags/vsM1', c.read_bool(register=1005, bit=24)), + CsvSignal('/Battery/Devices/WarningFlags/iCM1', c.read_bool(register=1005, bit=26)), + CsvSignal('/Battery/Devices/WarningFlags/iDM1', c.read_bool(register=1005, bit=28)), + CsvSignal('/Battery/Devices/WarningFlags/MID1', c.read_bool(register=1005, bit=30)), + CsvSignal('/Battery/Devices/WarningFlags/BLPW', c.read_bool(register=1005, bit=32)), + CsvSignal('/Battery/Devices/WarningFlags/CCBF', c.read_bool(register=1005, bit=33)), + CsvSignal('/Battery/Devices/WarningFlags/Ah_W', c.read_bool(register=1005, bit=35)), + CsvSignal('/Battery/Devices/WarningFlags/MPMM', c.read_bool(register=1005, bit=38)), + CsvSignal('/Battery/Devices/WarningFlags/TCdi', c.read_bool(register=1005, bit=40)), + CsvSignal('/Battery/Devices/WarningFlags/LMPW', c.read_bool(register=1005, bit=44)), + CsvSignal('/Battery/Devices/WarningFlags/TOCW', c.read_bool(register=1005, bit=47)), + CsvSignal('/Battery/Devices/WarningFlags/BUSL', c.read_bool(register=1005, bit=49)), + ], [ + # Alarms + CsvSignal('/Battery/Devices/AlarmFlags/Tam', c.read_bool(register=1005, bit=0)), + CsvSignal('/Battery/Devices/AlarmFlags/TaM2', c.read_bool(register=1005, bit=2)), + CsvSignal('/Battery/Devices/AlarmFlags/Tbm', c.read_bool(register=1005, bit=3)), + CsvSignal('/Battery/Devices/AlarmFlags/TbM2', c.read_bool(register=1005, bit=5)), + CsvSignal('/Battery/Devices/AlarmFlags/VBm2', c.read_bool(register=1005, bit=7)), + CsvSignal('/Battery/Devices/AlarmFlags/VBM2', c.read_bool(register=1005, bit=9)), + CsvSignal('/Battery/Devices/AlarmFlags/IDM2', c.read_bool(register=1005, bit=11)), + CsvSignal('/Battery/Devices/AlarmFlags/ISOB', c.read_bool(register=1005, bit=12)), + CsvSignal('/Battery/Devices/AlarmFlags/MSWE', c.read_bool(register=1005, bit=13)), + CsvSignal('/Battery/Devices/AlarmFlags/FUSE', c.read_bool(register=1005, bit=14)), + CsvSignal('/Battery/Devices/AlarmFlags/HTRE', c.read_bool(register=1005, bit=15)), + CsvSignal('/Battery/Devices/AlarmFlags/TCPE', c.read_bool(register=1005, bit=16)), + CsvSignal('/Battery/Devices/AlarmFlags/STRE', c.read_bool(register=1005, bit=17)), + CsvSignal('/Battery/Devices/AlarmFlags/CME', c.read_bool(register=1005, bit=18)), + CsvSignal('/Battery/Devices/AlarmFlags/HWFL', c.read_bool(register=1005, bit=19)), + CsvSignal('/Battery/Devices/AlarmFlags/HWEM', c.read_bool(register=1005, bit=20)), + CsvSignal('/Battery/Devices/AlarmFlags/ThM', c.read_bool(register=1005, bit=21)), + CsvSignal('/Battery/Devices/AlarmFlags/vsm2', c.read_bool(register=1005, bit=23)), + CsvSignal('/Battery/Devices/AlarmFlags/vsM2', c.read_bool(register=1005, bit=25)), + CsvSignal('/Battery/Devices/AlarmFlags/iCM2', c.read_bool(register=1005, bit=27)), + CsvSignal('/Battery/Devices/AlarmFlags/iDM2', c.read_bool(register=1005, bit=29)), + CsvSignal('/Battery/Devices/AlarmFlags/MID2', c.read_bool(register=1005, bit=31)), + CsvSignal('/Battery/Devices/AlarmFlags/HTFS', c.read_bool(register=1005, bit=42)), + CsvSignal('/Battery/Devices/AlarmFlags/DATA', c.read_bool(register=1005, bit=43)), + CsvSignal('/Battery/Devices/AlarmFlags/LMPA', c.read_bool(register=1005, bit=45)), + CsvSignal('/Battery/Devices/AlarmFlags/HEBT', c.read_bool(register=1005, bit=46)), + CsvSignal('/Battery/Devices/AlarmFlags/CURM', c.read_bool(register=1005, bit=48)), + ] + +import random + +def update_for_testing(modbus, batteries, dbus, signals, csv_signals): + global ALLOW + logging.debug('starting testing update cycle') + warning_signals, alarm_signals = read_warning_and_alarm_flags() + current_warnings = {} + current_alarms = {} + statuses = [read_battery_status(modbus, battery) for battery in batteries] + node_numbers = [battery.slave_address for battery in batteries] + if ALLOW: + any_warning_active = False + any_alarm_active = False + for i, node in enumerate(node_numbers): + for s in warning_signals: + signal_name = insert_id(s.name, i+1) + value = s.get_value(statuses[i]) + current_warnings[signal_name] = value + if ALLOW and value: + any_warning_active = True + for s in alarm_signals: + signal_name = insert_id(s.name, i+1) + value = random.choice([True, False]) + current_alarms[signal_name] = value + if ALLOW and value: + any_alarm_active = True + print(update_state_from_dictionaries(current_warnings, current_alarms)) + publish_values(dbus, signals, statuses) + create_csv_files(csv_signals, statuses, node_numbers) + logging.debug('finished update cycle\n') + return True + +def update(modbus, batteries, dbus, signals, csv_signals): + # type: (Modbus, Iterable[Battery], DBus, Iterable[Signal]) -> bool + """ + Main update function + + 1. requests status record each battery via modbus, + 2. parses the data using Signal.get_value + 3. aggregates the data from all batteries into one datum using Signal.aggregate + 4. publishes the data on the dbus + """ + logging.debug('starting update cycle') + warnings_signals, alarm_signals = read_warning_and_alarm_flags() + current_warnings = {} + current_alarms= {} + statuses = [read_battery_status(modbus, battery) for battery in batteries] + node_numbers = [battery.slave_address for battery in 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) + value = s.get_value(statuses[i]) + current_warnings[signal_name] = value + for s in alarm_signals: + signal_name = insert_id(s.name, i+1) + value = s.get_value(statuses[i]) + current_alarms[signal_name] = value + print(update_state_from_dictionaries(current_warnings, current_alarms)) + publish_values(dbus, signals, statuses) + create_csv_files(csv_signals, statuses, node_numbers) + logging.debug('finished update cycle\n') + return True + +def print_usage(): + print('Usage: ' + __file__ + ' ') + print('Example: ' + __file__ + ' ttyUSB0') + +def parse_cmdline_args(argv): + # type: (list[str]) -> str + if len(argv) == 0: + logging.info('missing command line argument for tty device') + print_usage() + sys.exit(1) + return argv[0] + +alive = True # global alive flag, watchdog_task clears it, update_task sets it +ALLOW = False + +def create_update_task(modbus, dbus, batteries, signals, csv_signals, main_loop): + # type: (Modbus, DBus, Iterable[Battery], Iterable[Signal], DBusGMainLoop) -> Callable[[],bool] + """ + Creates an update task which runs the main update function + and resets the alive flag + """ + def update_task(): + # type: () -> bool + global alive, ALLOW + if ALLOW: + ALLOW = False + else: + ALLOW = True + alive = update(modbus, batteries, dbus, signals, csv_signals) + #alive = update_for_testing(modbus, batteries, dbus, signals, csv_signals) + if not alive: + logging.info('update_task: quitting main loop because of error') + main_loop.quit() + return alive + return update_task + +def create_watchdog_task(main_loop): + # type: (DBusGMainLoop) -> Callable[[],bool] + """ + Creates a Watchdog task that monitors the alive flag. + The watchdog kills the main loop if the alive flag is not periodically reset by the update task. + Who watches the watchdog? + """ + def watchdog_task(): + # type: () -> bool + global alive + if alive: + logging.debug('watchdog_task: update_task is alive') + alive = False + return True + else: + logging.info('watchdog_task: killing main loop because update_task is no longer alive') + main_loop.quit() + return False + return watchdog_task + +def get_installation_name(file_path): + with open(file_path, 'r') as file: + return file.read().strip() + +def manage_csv_files(directory_path, max_files=20): + csv_files = [f for f in os.listdir(directory_path)] + 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: + file_to_delete = os.path.join(directory_path, csv_files.pop(0)) + os.remove(file_to_delete) + +def serialize_for_csv(value): + if isinstance(value, (dict, list, tuple)): + return json.dumps(value, ensure_ascii=False) + return str(value) + +def insert_id(path, id_number): + parts = path.split("/") + insert_position = parts.index("Devices") + 1 + parts.insert(insert_position, str(id_number)) + return "/".join(parts) + +def create_csv_files(signals, statuses, node_numbers): + global s3_config + timestamp = int(time.time()) + if timestamp % 2 != 0: + timestamp -= 1 + # Create CSV directory if it doesn't exist + if not os.path.exists(CSV_DIR): + os.makedirs(CSV_DIR) + csv_filename = f"{timestamp}.csv" + csv_path = os.path.join(CSV_DIR, csv_filename) + # Append values to the CSV file + with open(csv_path, 'a', newline='') as csvfile: + csv_writer = csv.writer(csvfile, delimiter=';') + # Add a special row for the nodes configuration + nodes_config_path = "/Config/Devices/BatteryNodes" + nodes_list = ",".join(str(node) for node in node_numbers) + config_row = [nodes_config_path, nodes_list, ""] + csv_writer.writerow(config_row) + # Iterate over each node and signal to create rows in the new format + for i, node in enumerate(node_numbers): + for s in signals: + signal_name = insert_id(s.name, i+1) + value = s.get_value(statuses[i]) + row_values = [signal_name, value, s.get_text] + csv_writer.writerow(row_values) + # Manage CSV files, keep a limited number of files + # Create the CSV as a string + csv_data = read_csv_as_string(csv_path) + + if csv_data is None: + print(" error while reading csv as string") + return + + # zip-comp additions + compressed_csv = compress_csv_data(csv_data) + compressed_filename = f"{timestamp}.csv" + + + + response = s3_config.create_put_request(compressed_filename, compressed_csv) + if response.status_code == 200: + os.remove(csv_path) + print("Success") + else: + failed_dir = os.path.join(CSV_DIR, "failed") + if not os.path.exists(failed_dir): + os.makedirs(failed_dir) + failed_path = os.path.join(failed_dir, csv_filename) + os.rename(csv_path, failed_path) + print("Uploading failed") + manage_csv_files(failed_dir, 10) + manage_csv_files(CSV_DIR) + +def main(argv): + # type: (list[str]) -> () + logging.basicConfig(level=cfg.LOG_LEVEL) + logging.info('starting ' + __file__) + tty = parse_cmdline_args(argv) + modbus = init_modbus(tty) + batteries = identify_batteries(modbus) + n = len(batteries) + logging.info('found ' + str(n) + (' battery' if n == 1 else ' batteries')) + if n <= 0: + sys.exit(2) + bat = c.first(batteries) # report hw and fw version of first battery found + signals = init_signals(bat.hardware_version, bat.firmware_version, n) + csv_signals = create_csv_signals(bat.firmware_version) + main_loop = init_main_loop() # must run before init_dbus because gobject does some global magic + dbus = init_dbus(tty, signals) + update_task = create_update_task(modbus, dbus, batteries, signals, csv_signals, main_loop) + watchdog_task = create_watchdog_task(main_loop) + GLib.timeout_add(cfg.UPDATE_INTERVAL * 2, watchdog_task) # add watchdog first + GLib.timeout_add(cfg.UPDATE_INTERVAL, update_task) # call update once every update_interval + logging.info('starting GLib.MainLoop') + main_loop.run() + logging.info('GLib.MainLoop was shut down') + sys.exit(0xFF) # reaches this only on error + +if __name__ == "__main__": + main(sys.argv[1:]) diff --git a/python/dbus-fzsonick-48tl-nofork/ext/velib_python/ve_utils.py b/python/dbus-fzsonick-48tl-nofork/ext/velib_python/ve_utils.py new file mode 100644 index 000000000..f5a2f85a0 --- /dev/null +++ b/python/dbus-fzsonick-48tl-nofork/ext/velib_python/ve_utils.py @@ -0,0 +1,276 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +import sys +from traceback import print_exc +from os import _exit as os_exit +from os import statvfs +from subprocess import check_output, CalledProcessError +import logging +import dbus +logger = logging.getLogger(__name__) + +VEDBUS_INVALID = dbus.Array([], signature=dbus.Signature('i'), variant_level=1) + +class NoVrmPortalIdError(Exception): + pass + +# Use this function to make sure the code quits on an unexpected exception. Make sure to use it +# when using GLib.idle_add and also GLib.timeout_add. +# Without this, the code will just keep running, since GLib does not stop the mainloop on an +# exception. +# Example: GLib.idle_add(exit_on_error, myfunc, arg1, arg2) +def exit_on_error(func, *args, **kwargs): + try: + return func(*args, **kwargs) + except: + try: + print ('exit_on_error: there was an exception. Printing stacktrace will be tried and then exit') + print_exc() + except: + pass + + # sys.exit() is not used, since that throws an exception, which does not lead to a program + # halt when used in a dbus callback, see connection.py in the Python/Dbus libraries, line 230. + os_exit(1) + + +__vrm_portal_id = None +def get_vrm_portal_id(): + # The original definition of the VRM Portal ID is that it is the mac + # address of the onboard- ethernet port (eth0), stripped from its colons + # (:) and lower case. This may however differ between platforms. On Venus + # the task is therefore deferred to /sbin/get-unique-id so that a + # platform specific method can be easily defined. + # + # If /sbin/get-unique-id does not exist, then use the ethernet address + # of eth0. This also handles the case where velib_python is used as a + # package install on a Raspberry Pi. + # + # On a Linux host where the network interface may not be eth0, you can set + # the VRM_IFACE environment variable to the correct name. + + global __vrm_portal_id + + if __vrm_portal_id: + return __vrm_portal_id + + portal_id = None + + # First try the method that works if we don't have a data partition. This + # will fail when the current user is not root. + try: + portal_id = check_output("/sbin/get-unique-id").decode("utf-8", "ignore").strip() + if not portal_id: + raise NoVrmPortalIdError("get-unique-id returned blank") + __vrm_portal_id = portal_id + return portal_id + except CalledProcessError: + # get-unique-id returned non-zero + raise NoVrmPortalIdError("get-unique-id returned non-zero") + except OSError: + # File doesn't exist, use fallback + pass + + # Fall back to getting our id using a syscall. Assume we are on linux. + # Allow the user to override what interface is used using an environment + # variable. + import fcntl, socket, struct, os + + iface = os.environ.get('VRM_IFACE', 'eth0').encode('ascii') + s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + try: + info = fcntl.ioctl(s.fileno(), 0x8927, struct.pack('256s', iface[:15])) + except IOError: + raise NoVrmPortalIdError("ioctl failed for eth0") + + __vrm_portal_id = info[18:24].hex() + return __vrm_portal_id + + +# See VE.Can registers - public.docx for definition of this conversion +def convert_vreg_version_to_readable(version): + def str_to_arr(x, length): + a = [] + for i in range(0, len(x), length): + a.append(x[i:i+length]) + return a + + x = "%x" % version + x = x.upper() + + if len(x) == 5 or len(x) == 3 or len(x) == 1: + x = '0' + x + + a = str_to_arr(x, 2); + + # remove the first 00 if there are three bytes and it is 00 + if len(a) == 3 and a[0] == '00': + a.remove(0); + + # if we have two or three bytes now, and the first character is a 0, remove it + if len(a) >= 2 and a[0][0:1] == '0': + a[0] = a[0][1]; + + result = '' + for item in a: + result += ('.' if result != '' else '') + item + + + result = 'v' + result + + return result + + +def get_free_space(path): + result = -1 + + try: + s = statvfs(path) + result = s.f_frsize * s.f_bavail # Number of free bytes that ordinary users + except Exception as ex: + logger.info("Error while retrieving free space for path %s: %s" % (path, ex)) + + return result + + +def _get_sysfs_machine_name(): + try: + with open('/sys/firmware/devicetree/base/model', 'r') as f: + return f.read().rstrip('\x00') + except IOError: + pass + + return None + +# Returns None if it cannot find a machine name. Otherwise returns the string +# containing the name +def get_machine_name(): + # First try calling the venus utility script + try: + return check_output("/usr/bin/product-name").strip().decode('UTF-8') + except (CalledProcessError, OSError): + pass + + # Fall back to sysfs + name = _get_sysfs_machine_name() + if name is not None: + return name + + # Fall back to venus build machine name + try: + with open('/etc/venus/machine', 'r', encoding='UTF-8') as f: + return f.read().strip() + except IOError: + pass + + return None + + +def get_product_id(): + """ Find the machine ID and return it. """ + + # First try calling the venus utility script + try: + return check_output("/usr/bin/product-id").strip().decode('UTF-8') + except (CalledProcessError, OSError): + pass + + # Fall back machine name mechanism + name = _get_sysfs_machine_name() + return { + 'Color Control GX': 'C001', + 'Venus GX': 'C002', + 'Octo GX': 'C006', + 'EasySolar-II': 'C007', + 'MultiPlus-II': 'C008', + 'Maxi GX': 'C009', + 'Cerbo GX': 'C00A' + }.get(name, 'C003') # C003 is Generic + + +# Returns False if it cannot open the file. Otherwise returns its rstripped contents +def read_file(path): + content = False + + try: + with open(path, 'r') as f: + content = f.read().rstrip() + except Exception as ex: + logger.debug("Error while reading %s: %s" % (path, ex)) + + return content + + +def wrap_dbus_value(value): + if value is None: + return VEDBUS_INVALID + if isinstance(value, float): + return dbus.Double(value, variant_level=1) + if isinstance(value, bool): + return dbus.Boolean(value, variant_level=1) + if isinstance(value, int): + try: + return dbus.Int32(value, variant_level=1) + except OverflowError: + return dbus.Int64(value, variant_level=1) + if isinstance(value, str): + return dbus.String(value, variant_level=1) + if isinstance(value, list): + if len(value) == 0: + # If the list is empty we cannot infer the type of the contents. So assume unsigned integer. + # A (signed) integer is dangerous, because an empty list of signed integers is used to encode + # an invalid value. + return dbus.Array([], signature=dbus.Signature('u'), variant_level=1) + return dbus.Array([wrap_dbus_value(x) for x in value], variant_level=1) + if isinstance(value, dict): + # Wrapping the keys of the dictionary causes D-Bus errors like: + # 'arguments to dbus_message_iter_open_container() were incorrect, + # assertion "(type == DBUS_TYPE_ARRAY && contained_signature && + # *contained_signature == DBUS_DICT_ENTRY_BEGIN_CHAR) || (contained_signature == NULL || + # _dbus_check_is_valid_signature (contained_signature))" failed in file ...' + return dbus.Dictionary({(k, wrap_dbus_value(v)) for k, v in value.items()}, variant_level=1) + return value + + +dbus_int_types = (dbus.Int32, dbus.UInt32, dbus.Byte, dbus.Int16, dbus.UInt16, dbus.UInt32, dbus.Int64, dbus.UInt64) + + +def unwrap_dbus_value(val): + """Converts D-Bus values back to the original type. For example if val is of type DBus.Double, + a float will be returned.""" + if isinstance(val, dbus_int_types): + return int(val) + if isinstance(val, dbus.Double): + return float(val) + if isinstance(val, dbus.Array): + v = [unwrap_dbus_value(x) for x in val] + return None if len(v) == 0 else v + if isinstance(val, (dbus.Signature, dbus.String)): + return str(val) + # Python has no byte type, so we convert to an integer. + if isinstance(val, dbus.Byte): + return int(val) + if isinstance(val, dbus.ByteArray): + return "".join([bytes(x) for x in val]) + if isinstance(val, (list, tuple)): + return [unwrap_dbus_value(x) for x in val] + if isinstance(val, (dbus.Dictionary, dict)): + # Do not unwrap the keys, see comment in wrap_dbus_value + return dict([(x, unwrap_dbus_value(y)) for x, y in val.items()]) + if isinstance(val, dbus.Boolean): + return bool(val) + return val + +# When supported, only name owner changes for the the given namespace are reported. This +# prevents spending cpu time at irrelevant changes, like scripts accessing the bus temporarily. +def add_name_owner_changed_receiver(dbus, name_owner_changed, namespace="com.victronenergy"): + # support for arg0namespace is submitted upstream, but not included at the time of + # writing, Venus OS does support it, so try if it works. + if namespace is None: + dbus.add_signal_receiver(name_owner_changed, signal_name='NameOwnerChanged') + else: + try: + dbus.add_signal_receiver(name_owner_changed, + signal_name='NameOwnerChanged', arg0namespace=namespace) + except TypeError: + dbus.add_signal_receiver(name_owner_changed, signal_name='NameOwnerChanged') diff --git a/python/dbus-fzsonick-48tl-nofork/ext/velib_python/vedbus.py b/python/dbus-fzsonick-48tl-nofork/ext/velib_python/vedbus.py new file mode 100644 index 000000000..6171a2101 --- /dev/null +++ b/python/dbus-fzsonick-48tl-nofork/ext/velib_python/vedbus.py @@ -0,0 +1,614 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +import dbus.service +import logging +import traceback +import os +import weakref +from collections import defaultdict +from ve_utils import wrap_dbus_value, unwrap_dbus_value + +# vedbus contains three classes: +# VeDbusItemImport -> use this to read data from the dbus, ie import +# VeDbusItemExport -> use this to export data to the dbus (one value) +# VeDbusService -> use that to create a service and export several values to the dbus + +# Code for VeDbusItemImport is copied from busitem.py and thereafter modified. +# All projects that used busitem.py need to migrate to this package. And some +# projects used to define there own equivalent of VeDbusItemExport. Better to +# use VeDbusItemExport, or even better the VeDbusService class that does it all for you. + +# TODOS +# 1 check for datatypes, it works now, but not sure if all is compliant with +# com.victronenergy.BusItem interface definition. See also the files in +# tests_and_examples. And see 'if type(v) == dbus.Byte:' on line 102. Perhaps +# something similar should also be done in VeDbusBusItemExport? +# 2 Shouldn't VeDbusBusItemExport inherit dbus.service.Object? +# 7 Make hard rules for services exporting data to the D-Bus, in order to make tracking +# changes possible. Does everybody first invalidate its data before leaving the bus? +# And what about before taking one object away from the bus, instead of taking the +# whole service offline? +# They should! And after taking one value away, do we need to know that someone left +# the bus? Or we just keep that value in invalidated for ever? Result is that we can't +# see the difference anymore between an invalidated value and a value that was first on +# the bus and later not anymore. See comments above VeDbusItemImport as well. +# 9 there are probably more todos in the code below. + +# Some thoughts with regards to the data types: +# +# Text from: http://dbus.freedesktop.org/doc/dbus-python/doc/tutorial.html#data-types +# --- +# Variants are represented by setting the variant_level keyword argument in the +# constructor of any D-Bus data type to a value greater than 0 (variant_level 1 +# means a variant containing some other data type, variant_level 2 means a variant +# containing a variant containing some other data type, and so on). If a non-variant +# is passed as an argument but introspection indicates that a variant is expected, +# it'll automatically be wrapped in a variant. +# --- +# +# Also the different dbus datatypes, such as dbus.Int32, and dbus.UInt32 are a subclass +# of Python int. dbus.String is a subclass of Python standard class unicode, etcetera +# +# So all together that explains why we don't need to explicitly convert back and forth +# between the dbus datatypes and the standard python datatypes. Note that all datatypes +# in python are objects. Even an int is an object. + +# The signature of a variant is 'v'. + +# Export ourselves as a D-Bus service. +class VeDbusService(object): + def __init__(self, servicename, bus=None): + # dict containing the VeDbusItemExport objects, with their path as the key. + self._dbusobjects = {} + self._dbusnodes = {} + self._ratelimiters = [] + self._dbusname = None + + # dict containing the onchange callbacks, for each object. Object path is the key + self._onchangecallbacks = {} + + # Connect to session bus whenever present, else use the system bus + self._dbusconn = bus or (dbus.SessionBus() if 'DBUS_SESSION_BUS_ADDRESS' in os.environ else dbus.SystemBus()) + + # make the dbus connection available to outside, could make this a true property instead, but ach.. + self.dbusconn = self._dbusconn + + # Register ourselves on the dbus, trigger an error if already in use (do_not_queue) + self._dbusname = dbus.service.BusName(servicename, self._dbusconn, do_not_queue=True) + + # Add the root item that will return all items as a tree + self._dbusnodes['/'] = VeDbusRootExport(self._dbusconn, '/', self) + + logging.info("registered ourselves on D-Bus as %s" % servicename) + + # To force immediate deregistering of this dbus service and all its object paths, explicitly + # call __del__(). + def __del__(self): + for node in list(self._dbusnodes.values()): + node.__del__() + self._dbusnodes.clear() + for item in list(self._dbusobjects.values()): + item.__del__() + self._dbusobjects.clear() + if self._dbusname: + self._dbusname.__del__() # Forces call to self._bus.release_name(self._name), see source code + self._dbusname = None + + def get_name(self): + return self._dbusname.get_name() + + # @param callbackonchange function that will be called when this value is changed. First parameter will + # be the path of the object, second the new value. This callback should return + # True to accept the change, False to reject it. + def add_path(self, path, value, description="", writeable=False, + onchangecallback=None, gettextcallback=None, valuetype=None, itemtype=None): + + if onchangecallback is not None: + self._onchangecallbacks[path] = onchangecallback + + itemtype = itemtype or VeDbusItemExport + item = itemtype(self._dbusconn, path, value, description, writeable, + self._value_changed, gettextcallback, deletecallback=self._item_deleted, valuetype=valuetype) + + spl = path.split('/') + for i in range(2, len(spl)): + subPath = '/'.join(spl[:i]) + if subPath not in self._dbusnodes and subPath not in self._dbusobjects: + self._dbusnodes[subPath] = VeDbusTreeExport(self._dbusconn, subPath, self) + self._dbusobjects[path] = item + logging.debug('added %s with start value %s. Writeable is %s' % (path, value, writeable)) + + # Add the mandatory paths, as per victron dbus api doc + def add_mandatory_paths(self, processname, processversion, connection, + deviceinstance, productid, productname, firmwareversion, hardwareversion, connected): + self.add_path('/Mgmt/ProcessName', processname) + self.add_path('/Mgmt/ProcessVersion', processversion) + self.add_path('/Mgmt/Connection', connection) + + # Create rest of the mandatory objects + self.add_path('/DeviceInstance', deviceinstance) + self.add_path('/ProductId', productid) + self.add_path('/ProductName', productname) + self.add_path('/FirmwareVersion', firmwareversion) + self.add_path('/HardwareVersion', hardwareversion) + self.add_path('/Connected', connected) + + # Callback function that is called from the VeDbusItemExport objects when a value changes. This function + # maps the change-request to the onchangecallback given to us for this specific path. + def _value_changed(self, path, newvalue): + if path not in self._onchangecallbacks: + return True + + return self._onchangecallbacks[path](path, newvalue) + + def _item_deleted(self, path): + self._dbusobjects.pop(path) + for np in list(self._dbusnodes.keys()): + if np != '/': + for ip in self._dbusobjects: + if ip.startswith(np + '/'): + break + else: + self._dbusnodes[np].__del__() + self._dbusnodes.pop(np) + + def __getitem__(self, path): + return self._dbusobjects[path].local_get_value() + + def __setitem__(self, path, newvalue): + self._dbusobjects[path].local_set_value(newvalue) + + def __delitem__(self, path): + self._dbusobjects[path].__del__() # Invalidates and then removes the object path + assert path not in self._dbusobjects + + def __contains__(self, path): + return path in self._dbusobjects + + def __enter__(self): + l = ServiceContext(self) + self._ratelimiters.append(l) + return l + + def __exit__(self, *exc): + # pop off the top one and flush it. If with statements are nested + # then each exit flushes its own part. + if self._ratelimiters: + self._ratelimiters.pop().flush() + +class ServiceContext(object): + def __init__(self, parent): + self.parent = parent + self.changes = {} + + def __getitem__(self, path): + return self.parent[path] + + def __setitem__(self, path, newvalue): + c = self.parent._dbusobjects[path]._local_set_value(newvalue) + if c is not None: + self.changes[path] = c + + def flush(self): + if self.changes: + self.parent._dbusnodes['/'].ItemsChanged(self.changes) + +class TrackerDict(defaultdict): + """ Same as defaultdict, but passes the key to default_factory. """ + def __missing__(self, key): + self[key] = x = self.default_factory(key) + return x + +class VeDbusRootTracker(object): + """ This tracks the root of a dbus path and listens for PropertiesChanged + signals. When a signal arrives, parse it and unpack the key/value changes + into traditional events, then pass it to the original eventCallback + method. """ + def __init__(self, bus, serviceName): + self.importers = defaultdict(weakref.WeakSet) + self.serviceName = serviceName + self._match = bus.get_object(serviceName, '/', introspect=False).connect_to_signal( + "ItemsChanged", weak_functor(self._items_changed_handler)) + + def __del__(self): + self._match.remove() + self._match = None + + def add(self, i): + self.importers[i.path].add(i) + + def _items_changed_handler(self, items): + if not isinstance(items, dict): + return + + for path, changes in items.items(): + try: + v = changes['Value'] + except KeyError: + continue + + try: + t = changes['Text'] + except KeyError: + t = str(unwrap_dbus_value(v)) + + for i in self.importers.get(path, ()): + i._properties_changed_handler({'Value': v, 'Text': t}) + +""" +Importing basics: + - If when we power up, the D-Bus service does not exist, or it does exist and the path does not + yet exist, still subscribe to a signal: as soon as it comes online it will send a signal with its + initial value, which VeDbusItemImport will receive and use to update local cache. And, when set, + call the eventCallback. + - If when we power up, save it + - When using get_value, know that there is no difference between services (or object paths) that don't + exist and paths that are invalid (= empty array, see above). Both will return None. In case you do + really want to know ifa path exists or not, use the exists property. + - When a D-Bus service leaves the D-Bus, it will first invalidate all its values, and send signals + with that update, and only then leave the D-Bus. (or do we need to subscribe to the NameOwnerChanged- + signal!?!) To be discussed and make sure. Not really urgent, since all existing code that uses this + class already subscribes to the NameOwnerChanged signal, and subsequently removes instances of this + class. + +Read when using this class: +Note that when a service leaves that D-Bus without invalidating all its exported objects first, for +example because it is killed, VeDbusItemImport doesn't have a clue. So when using VeDbusItemImport, +make sure to also subscribe to the NamerOwnerChanged signal on bus-level. Or just use dbusmonitor, +because that takes care of all of that for you. +""" +class VeDbusItemImport(object): + def __new__(cls, bus, serviceName, path, eventCallback=None, createsignal=True): + instance = object.__new__(cls) + + # If signal tracking should be done, also add to root tracker + if createsignal: + if "_roots" not in cls.__dict__: + cls._roots = TrackerDict(lambda k: VeDbusRootTracker(bus, k)) + + return instance + + ## Constructor + # @param bus the bus-object (SESSION or SYSTEM). + # @param serviceName the dbus-service-name (string), for example 'com.victronenergy.battery.ttyO1' + # @param path the object-path, for example '/Dc/V' + # @param eventCallback function that you want to be called on a value change + # @param createSignal only set this to False if you use this function to one time read a value. When + # leaving it to True, make sure to also subscribe to the NameOwnerChanged signal + # elsewhere. See also note some 15 lines up. + def __init__(self, bus, serviceName, path, eventCallback=None, createsignal=True): + # TODO: is it necessary to store _serviceName and _path? Isn't it + # stored in the bus_getobjectsomewhere? + self._serviceName = serviceName + self._path = path + self._match = None + # TODO: _proxy is being used in settingsdevice.py, make a getter for that + self._proxy = bus.get_object(serviceName, path, introspect=False) + self.eventCallback = eventCallback + + assert eventCallback is None or createsignal == True + if createsignal: + self._match = self._proxy.connect_to_signal( + "PropertiesChanged", weak_functor(self._properties_changed_handler)) + self._roots[serviceName].add(self) + + # store the current value in _cachedvalue. When it doesn't exists set _cachedvalue to + # None, same as when a value is invalid + self._cachedvalue = None + try: + v = self._proxy.GetValue() + except dbus.exceptions.DBusException: + pass + else: + self._cachedvalue = unwrap_dbus_value(v) + + def __del__(self): + if self._match is not None: + self._match.remove() + self._match = None + self._proxy = None + + def _refreshcachedvalue(self): + self._cachedvalue = unwrap_dbus_value(self._proxy.GetValue()) + + ## Returns the path as a string, for example '/AC/L1/V' + @property + def path(self): + return self._path + + ## Returns the dbus service name as a string, for example com.victronenergy.vebus.ttyO1 + @property + def serviceName(self): + return self._serviceName + + ## Returns the value of the dbus-item. + # the type will be a dbus variant, for example dbus.Int32(0, variant_level=1) + # this is not a property to keep the name consistant with the com.victronenergy.busitem interface + # returns None when the property is invalid + def get_value(self): + return self._cachedvalue + + ## Writes a new value to the dbus-item + def set_value(self, newvalue): + r = self._proxy.SetValue(wrap_dbus_value(newvalue)) + + # instead of just saving the value, go to the dbus and get it. So we have the right type etc. + if r == 0: + self._refreshcachedvalue() + + return r + + ## Resets the item to its default value + def set_default(self): + self._proxy.SetDefault() + self._refreshcachedvalue() + + ## Returns the text representation of the value. + # For example when the value is an enum/int GetText might return the string + # belonging to that enum value. Another example, for a voltage, GetValue + # would return a float, 12.0Volt, and GetText could return 12 VDC. + # + # Note that this depends on how the dbus-producer has implemented this. + def get_text(self): + return self._proxy.GetText() + + ## Returns true of object path exists, and false if it doesn't + @property + def exists(self): + # TODO: do some real check instead of this crazy thing. + r = False + try: + r = self._proxy.GetValue() + r = True + except dbus.exceptions.DBusException: + pass + + return r + + ## callback for the trigger-event. + # @param eventCallback the event-callback-function. + @property + def eventCallback(self): + return self._eventCallback + + @eventCallback.setter + def eventCallback(self, eventCallback): + self._eventCallback = eventCallback + + ## Is called when the value of the imported bus-item changes. + # Stores the new value in our local cache, and calls the eventCallback, if set. + def _properties_changed_handler(self, changes): + if "Value" in changes: + changes['Value'] = unwrap_dbus_value(changes['Value']) + self._cachedvalue = changes['Value'] + if self._eventCallback: + # The reason behind this try/except is to prevent errors silently ending up the an error + # handler in the dbus code. + try: + self._eventCallback(self._serviceName, self._path, changes) + except: + traceback.print_exc() + os._exit(1) # sys.exit() is not used, since that also throws an exception + + +class VeDbusTreeExport(dbus.service.Object): + def __init__(self, bus, objectPath, service): + dbus.service.Object.__init__(self, bus, objectPath) + self._service = service + logging.debug("VeDbusTreeExport %s has been created" % objectPath) + + def __del__(self): + # self._get_path() will raise an exception when retrieved after the call to .remove_from_connection, + # so we need a copy. + path = self._get_path() + if path is None: + return + self.remove_from_connection() + logging.debug("VeDbusTreeExport %s has been removed" % path) + + def _get_path(self): + if len(self._locations) == 0: + return None + return self._locations[0][1] + + def _get_value_handler(self, path, get_text=False): + logging.debug("_get_value_handler called for %s" % path) + r = {} + px = path + if not px.endswith('/'): + px += '/' + for p, item in self._service._dbusobjects.items(): + if p.startswith(px): + v = item.GetText() if get_text else wrap_dbus_value(item.local_get_value()) + r[p[len(px):]] = v + logging.debug(r) + return r + + @dbus.service.method('com.victronenergy.BusItem', out_signature='v') + def GetValue(self): + value = self._get_value_handler(self._get_path()) + return dbus.Dictionary(value, signature=dbus.Signature('sv'), variant_level=1) + + @dbus.service.method('com.victronenergy.BusItem', out_signature='v') + def GetText(self): + return self._get_value_handler(self._get_path(), True) + + def local_get_value(self): + return self._get_value_handler(self.path) + +class VeDbusRootExport(VeDbusTreeExport): + @dbus.service.signal('com.victronenergy.BusItem', signature='a{sa{sv}}') + def ItemsChanged(self, changes): + pass + + @dbus.service.method('com.victronenergy.BusItem', out_signature='a{sa{sv}}') + def GetItems(self): + return { + path: { + 'Value': wrap_dbus_value(item.local_get_value()), + 'Text': item.GetText() } + for path, item in self._service._dbusobjects.items() + } + + +class VeDbusItemExport(dbus.service.Object): + ## Constructor of VeDbusItemExport + # + # Use this object to export (publish), values on the dbus + # Creates the dbus-object under the given dbus-service-name. + # @param bus The dbus object. + # @param objectPath The dbus-object-path. + # @param value Value to initialize ourselves with, defaults to None which means Invalid + # @param description String containing a description. Can be called over the dbus with GetDescription() + # @param writeable what would this do!? :). + # @param callback Function that will be called when someone else changes the value of this VeBusItem + # over the dbus. First parameter passed to callback will be our path, second the new + # value. This callback should return True to accept the change, False to reject it. + def __init__(self, bus, objectPath, value=None, description=None, writeable=False, + onchangecallback=None, gettextcallback=None, deletecallback=None, + valuetype=None): + dbus.service.Object.__init__(self, bus, objectPath) + self._onchangecallback = onchangecallback + self._gettextcallback = gettextcallback + self._value = value + self._description = description + self._writeable = writeable + self._deletecallback = deletecallback + self._type = valuetype + + # To force immediate deregistering of this dbus object, explicitly call __del__(). + def __del__(self): + # self._get_path() will raise an exception when retrieved after the + # call to .remove_from_connection, so we need a copy. + path = self._get_path() + if path == None: + return + if self._deletecallback is not None: + self._deletecallback(path) + self.remove_from_connection() + logging.debug("VeDbusItemExport %s has been removed" % path) + + def _get_path(self): + if len(self._locations) == 0: + return None + return self._locations[0][1] + + ## Sets the value. And in case the value is different from what it was, a signal + # will be emitted to the dbus. This function is to be used in the python code that + # is using this class to export values to the dbus. + # set value to None to indicate that it is Invalid + def local_set_value(self, newvalue): + changes = self._local_set_value(newvalue) + if changes is not None: + self.PropertiesChanged(changes) + + def _local_set_value(self, newvalue): + if self._value == newvalue: + return None + + self._value = newvalue + return { + 'Value': wrap_dbus_value(newvalue), + 'Text': self.GetText() + } + + def local_get_value(self): + return self._value + + # ==== ALL FUNCTIONS BELOW THIS LINE WILL BE CALLED BY OTHER PROCESSES OVER THE DBUS ==== + + ## Dbus exported method SetValue + # Function is called over the D-Bus by other process. It will first check (via callback) if new + # value is accepted. And it is, stores it and emits a changed-signal. + # @param value The new value. + # @return completion-code When successful a 0 is return, and when not a -1 is returned. + @dbus.service.method('com.victronenergy.BusItem', in_signature='v', out_signature='i') + def SetValue(self, newvalue): + if not self._writeable: + return 1 # NOT OK + + newvalue = unwrap_dbus_value(newvalue) + + # If value type is enforced, cast it. If the type can be coerced + # python will do it for us. This allows ints to become floats, + # or bools to become ints. Additionally also allow None, so that + # a path may be invalidated. + if self._type is not None and newvalue is not None: + try: + newvalue = self._type(newvalue) + except (ValueError, TypeError): + return 1 # NOT OK + + if newvalue == self._value: + return 0 # OK + + # call the callback given to us, and check if new value is OK. + if (self._onchangecallback is None or + (self._onchangecallback is not None and self._onchangecallback(self.__dbus_object_path__, newvalue))): + + self.local_set_value(newvalue) + return 0 # OK + + return 2 # NOT OK + + ## Dbus exported method GetDescription + # + # Returns the a description. + # @param language A language code (e.g. ISO 639-1 en-US). + # @param length Lenght of the language string. + # @return description + @dbus.service.method('com.victronenergy.BusItem', in_signature='si', out_signature='s') + def GetDescription(self, language, length): + return self._description if self._description is not None else 'No description given' + + ## Dbus exported method GetValue + # Returns the value. + # @return the value when valid, and otherwise an empty array + @dbus.service.method('com.victronenergy.BusItem', out_signature='v') + def GetValue(self): + return wrap_dbus_value(self._value) + + ## Dbus exported method GetText + # Returns the value as string of the dbus-object-path. + # @return text A text-value. '---' when local value is invalid + @dbus.service.method('com.victronenergy.BusItem', out_signature='s') + def GetText(self): + if self._value is None: + return '---' + + # Default conversion from dbus.Byte will get you a character (so 'T' instead of '84'), so we + # have to convert to int first. Note that if a dbus.Byte turns up here, it must have come from + # the application itself, as all data from the D-Bus should have been unwrapped by now. + if self._gettextcallback is None and type(self._value) == dbus.Byte: + return str(int(self._value)) + + if self._gettextcallback is None and self.__dbus_object_path__ == '/ProductId': + return "0x%X" % self._value + + if self._gettextcallback is None: + return str(self._value) + + return self._gettextcallback(self.__dbus_object_path__, self._value) + + ## The signal that indicates that the value has changed. + # Other processes connected to this BusItem object will have subscribed to the + # event when they want to track our state. + @dbus.service.signal('com.victronenergy.BusItem', signature='a{sv}') + def PropertiesChanged(self, changes): + pass + +## This class behaves like a regular reference to a class method (eg. self.foo), but keeps a weak reference +## to the object which method is to be called. +## Use this object to break circular references. +class weak_functor: + def __init__(self, f): + self._r = weakref.ref(f.__self__) + self._f = weakref.ref(f.__func__) + + def __call__(self, *args, **kargs): + r = self._r() + f = self._f() + if r == None or f == None: + return + f(r, *args, **kargs) diff --git a/python/dbus-fzsonick-48tl-nofork/start.sh b/python/dbus-fzsonick-48tl-nofork/start.sh new file mode 100755 index 000000000..d818ffc57 --- /dev/null +++ b/python/dbus-fzsonick-48tl-nofork/start.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +. /opt/victronenergy/serial-starter/run-service.sh + +app=/opt/victronenergy/dbus-fzsonick-48tl/dbus-fzsonick-48tl.py +args="$tty" +start $args diff --git a/typescript/frontend-marios2/src/content/dashboards/Information/InformationSalidomo.tsx b/typescript/frontend-marios2/src/content/dashboards/Information/InformationSalidomo.tsx index 4e4ba1481..4c85105a5 100644 --- a/typescript/frontend-marios2/src/content/dashboards/Information/InformationSalidomo.tsx +++ b/typescript/frontend-marios2/src/content/dashboards/Information/InformationSalidomo.tsx @@ -302,7 +302,7 @@ function InformationSalidomo(props: InformationSalidomoProps) { diff --git a/typescript/frontend-marios2/src/content/dashboards/SalidomoInstallations/FlatInstallationView.tsx b/typescript/frontend-marios2/src/content/dashboards/SalidomoInstallations/FlatInstallationView.tsx index 54cac80e9..ae664956e 100644 --- a/typescript/frontend-marios2/src/content/dashboards/SalidomoInstallations/FlatInstallationView.tsx +++ b/typescript/frontend-marios2/src/content/dashboards/SalidomoInstallations/FlatInstallationView.tsx @@ -207,7 +207,11 @@ const FlatInstallationView = (props: FlatInstallationViewProps) => { sx={{ marginTop: '10px', fontSize: 'small' }} > { const filtered = props.installations.filter( (item) => - item.name.toLowerCase().includes(searchTerm.toLowerCase()) || + item.installationName + .toLowerCase() + .includes(searchTerm.toLowerCase()) || item.location.toLowerCase().includes(searchTerm.toLowerCase()) || item.region.toLowerCase().includes(searchTerm.toLowerCase()) ); From 533ed9018a75939b293fdf980ea3ebd71ffa0643 Mon Sep 17 00:00:00 2001 From: kostas Date: Thu, 30 May 2024 09:55:40 +0200 Subject: [PATCH 03/25] extarct s3 data with decompression --- .../opt/innovenergy/scripts/extractS3data.py | 110 ++++++++---------- 1 file changed, 51 insertions(+), 59 deletions(-) diff --git a/firmware/opt/innovenergy/scripts/extractS3data.py b/firmware/opt/innovenergy/scripts/extractS3data.py index 41cd81f03..6c5c8b924 100644 --- a/firmware/opt/innovenergy/scripts/extractS3data.py +++ b/firmware/opt/innovenergy/scripts/extractS3data.py @@ -4,6 +4,9 @@ import subprocess import argparse import matplotlib.pyplot as plt from collections import defaultdict +import zipfile +import base64 +import shutil def extract_timestamp(filename): timestamp_str = filename[:10] @@ -14,7 +17,6 @@ def extract_timestamp(filename): return 0 def extract_values_by_key(csv_file, key, exact_match): - # Initialize a defaultdict for lists matched_values = defaultdict(list) with open(csv_file, 'r') as file: reader = csv.reader(file) @@ -31,37 +33,26 @@ def extract_values_by_key(csv_file, key, exact_match): else: if key_item.lower() in first_column.lower(): matched_values[path_key].append(row[0]) - #return matched_values - # Concatenate all keys to create a single final_key final_key = ''.join(matched_values.keys()) - # Combine all lists of values into a single list combined_values = [] for values in matched_values.values(): combined_values.extend(values) - # Create the final dictionary with final_key and all combined values final_dict = {final_key: combined_values} - #return dict(matched_values) return final_dict def list_files_in_range(start_timestamp, end_timestamp, sampling_stepsize): filenames_in_range = [f"{timestamp:10d}" for timestamp in range(start_timestamp, end_timestamp + 1, 2*sampling_stepsize)] return filenames_in_range -def check_s3_files_exist(bucket_number, filename): - s3cmd_ls_command = f"s3cmd ls s3://{bucket_number}-3e5b3069-214a-43ee-8d85-57d72000c19d/{filename}*" - try: - result = subprocess.run(s3cmd_ls_command, shell=True, check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - lines = result.stdout.decode().split('\n')[:-1] - filenames = [line.split()[-1].split('/')[-1] for line in lines] - return filenames - except subprocess.CalledProcessError as e: - print(f"Error checking S3 files: {e}") - return [] - -def download_files(bucket_number, filenames_to_download): +def download_files(bucket_number, filenames_to_download, product_type): + if product_type == 0: + hash = "3e5b3069-214a-43ee-8d85-57d72000c19d" + elif product_type == 1: + hash = "c0436b6a-d276-4cd8-9c44-1eae86cf5d0e" + else: + raise ValueError("Invalid product type option. Use 0 or 1") output_directory = f"S3cmdData_{bucket_number}" - if not os.path.exists(output_directory): os.makedirs(output_directory) print(f"Directory '{output_directory}' created.") @@ -70,7 +61,7 @@ def download_files(bucket_number, filenames_to_download): stripfilename = filename.strip() local_path = os.path.join(output_directory, stripfilename + ".csv") if not os.path.exists(local_path): - s3cmd_command = f"s3cmd get s3://{bucket_number}-3e5b3069-214a-43ee-8d85-57d72000c19d/{stripfilename}.csv {output_directory}/" + s3cmd_command = f"s3cmd get s3://{bucket_number}-{hash}/{stripfilename}.csv {output_directory}/" try: subprocess.run(s3cmd_command, shell=True, check=True) downloaded_files = [file for file in os.listdir(output_directory) if file.startswith(filename)] @@ -84,44 +75,48 @@ def download_files(bucket_number, filenames_to_download): else: print(f"File '{filename}.csv' already exists locally. Skipping download.") +def decompress_file(compressed_file, output_directory): + base_name = os.path.splitext(os.path.basename(compressed_file))[0] -def visualize_data(data, output_directory): - # Extract data for visualization (replace this with your actual data extraction) - x_values = [int(entry[0]) for entry in data] - y_values = [float(entry[1]) for entry in data] + with open(compressed_file, 'rb') as file: + compressed_data = file.read() - # Plotting - plt.plot(x_values, y_values, marker='o', linestyle='-', color='b') - plt.xlabel('Timestamp') - plt.ylabel('Your Y-axis Label') - plt.title('Your Plot Title') - plt.grid(True) - plt.savefig(os.path.join(output_directory, f"{start_timestamp}_{key}_plot.png")) - plt.close() # Close the plot window + # Decode the base64 encoded content + decoded_data = base64.b64decode(compressed_data) + zip_path = os.path.join(output_directory, 'temp.zip') + with open(zip_path, 'wb') as zip_file: + zip_file.write(decoded_data) + + with zipfile.ZipFile(zip_path, 'r') as zip_ref: + zip_ref.extractall(output_directory) + + # Rename the extracted data.csv file to the original timestamp-based name + extracted_csv_path = os.path.join(output_directory, 'data.csv') + if os.path.exists(extracted_csv_path): + new_csv_path = os.path.join(output_directory, f"{base_name}.csv") + os.rename(extracted_csv_path, new_csv_path) + + os.remove(zip_path) + #os.remove(compressed_file) + print(f"Decompressed and renamed '{compressed_file}' to '{new_csv_path}'.") - # Save data to CSV - csv_file_path = os.path.join(output_directory, f"{start_timestamp}_{key}_extracted.csv") - with open(csv_file_path, 'w', newline='') as csvfile: - csv_writer = csv.writer(csvfile) - csv_writer.writerow(['Timestamp', 'Value']) # Adjust column names as needed - csv_writer.writerows(data) def get_last_component(path): path_without_slashes = path.replace('/', '') return path_without_slashes - -def download_and_process_files(bucket_number, start_timestamp, end_timestamp, sampling_stepsize, key, booleans_as_numbers, exact_match): +def download_and_process_files(bucket_number, start_timestamp, end_timestamp, sampling_stepsize, key, booleans_as_numbers, exact_match, product_type): output_directory = f"S3cmdData_{bucket_number}" + if os.path.exists(output_directory): + shutil.rmtree(output_directory) + if not os.path.exists(output_directory): os.makedirs(output_directory) print(f"Directory '{output_directory}' created.") - - filenames_to_check = list_files_in_range(start_timestamp, end_timestamp, sampling_stepsize) - #filenames_on_s3 = check_s3_files_exist(bucket_number, filenames_to_check, key) + filenames_to_check = list_files_in_range(start_timestamp, end_timestamp, sampling_stepsize) existing_files = [filename for filename in filenames_to_check if os.path.exists(os.path.join(output_directory, f"{filename}.csv"))] files_to_download = set(filenames_to_check) - set(existing_files) @@ -129,15 +124,20 @@ def download_and_process_files(bucket_number, start_timestamp, end_timestamp, sa print("Files already exist in the local folder. Skipping download.") else: if files_to_download: - download_files(bucket_number, files_to_download) + download_files(bucket_number, files_to_download, product_type) + # Decompress all downloaded .csv files (which are actually compressed) + compressed_files = [os.path.join(output_directory, file) for file in os.listdir(output_directory) if file.endswith('.csv')] + for compressed_file in compressed_files: + decompress_file(compressed_file, output_directory) - # Process CSV files csv_files = [file for file in os.listdir(output_directory) if file.endswith('.csv')] csv_files.sort(key=extract_timestamp) + + keypath = '' for key_item in key: - keypath+= get_last_component(key_item) + keypath += get_last_component(key_item) output_csv_filename = f"{keypath}_{start_timestamp}_{bucket_number}.csv" with open(output_csv_filename, 'w', newline='') as csvfile: csv_writer = csv.writer(csvfile) @@ -171,42 +171,34 @@ def download_and_process_files(bucket_number, start_timestamp, end_timestamp, sa print(f"Extracted data saved in '{output_csv_filename}'.") def parse_keys(input_string): - # Split the input string by commas and strip whitespace keys = [key.strip() for key in input_string.split(',')] - # Return keys as a list if more than one, else return the single key - #return keys if len(keys) > 1 else keys[0] return keys - def main(): parser = argparse.ArgumentParser(description='Download files from S3 using s3cmd and extract specific values from CSV files.') parser.add_argument('start_timestamp', type=int, help='The start timestamp for the range (even number)') parser.add_argument('end_timestamp', type=int, help='The end timestamp for the range (even number)') - #parser.add_argument('--key', type=str, required=True, help='The part to match from each CSV file') parser.add_argument('--keys', type=parse_keys, required=True, help='The part to match from each CSV file, can be a single key or a comma-separated list of keys') parser.add_argument('--bucket-number', type=int, required=True, help='The number of the bucket to download from') parser.add_argument('--sampling_stepsize', type=int, required=False, default=1, help='The number of 2sec intervals, which define the length of the sampling interval in S3 file retrieval') parser.add_argument('--booleans_as_numbers', action="store_true", required=False, help='If key used, then booleans are converted to numbers [0/1], if key not used, then booleans maintained as text [False/True]') parser.add_argument('--exact_match', action="store_true", required=False, help='If key used, then key has to match exactly "=", else it is enough that key is found "in" text') + parser.add_argument('--product_type', required=True, help='Use 0 for Salimax and 1 for Salidomo') - - args = parser.parse_args(); + args = parser.parse_args() start_timestamp = args.start_timestamp end_timestamp = args.end_timestamp keys = args.keys bucket_number = args.bucket_number sampling_stepsize = args.sampling_stepsize booleans_as_numbers = args.booleans_as_numbers - exact_match = args.exact_match + exact_match = args.exact_match + product_type = int(args.product_type) - - - # Check if start_timestamp is smaller than end_timestamp if start_timestamp >= end_timestamp: print("Error: start_timestamp must be smaller than end_timestamp.") return - download_and_process_files(bucket_number, start_timestamp, end_timestamp, sampling_stepsize, keys, booleans_as_numbers, exact_match) + download_and_process_files(bucket_number, start_timestamp, end_timestamp, sampling_stepsize, keys, booleans_as_numbers, exact_match, product_type) if __name__ == "__main__": main() - From 933f895a67cfc81763e0e25ae1a431c1e8e9f1c1 Mon Sep 17 00:00:00 2001 From: kostas Date: Thu, 30 May 2024 10:09:35 +0200 Subject: [PATCH 04/25] extarct s3 data with decompression --- firmware/opt/innovenergy/scripts/extractS3data.py | 1 + 1 file changed, 1 insertion(+) diff --git a/firmware/opt/innovenergy/scripts/extractS3data.py b/firmware/opt/innovenergy/scripts/extractS3data.py index 6c5c8b924..4aeb99ee7 100644 --- a/firmware/opt/innovenergy/scripts/extractS3data.py +++ b/firmware/opt/innovenergy/scripts/extractS3data.py @@ -193,6 +193,7 @@ def main(): sampling_stepsize = args.sampling_stepsize booleans_as_numbers = args.booleans_as_numbers exact_match = args.exact_match + # new arg for product type product_type = int(args.product_type) if start_timestamp >= end_timestamp: From 5813ecfee3e07a3470decf50242ac64c6dee0ee5 Mon Sep 17 00:00:00 2001 From: kostas Date: Thu, 30 May 2024 12:29:36 +0200 Subject: [PATCH 05/25] extarct s3 data with decompression --- .../dbus-fzsonick-48tl/dbus-fzsonick-48tl.py | 409 +++++++++--------- 1 file changed, 194 insertions(+), 215 deletions(-) diff --git a/firmware/opt/victronenergy/dbus-fzsonick-48tl/dbus-fzsonick-48tl.py b/firmware/opt/victronenergy/dbus-fzsonick-48tl/dbus-fzsonick-48tl.py index 283e73bf3..f0af6f187 100755 --- a/firmware/opt/victronenergy/dbus-fzsonick-48tl/dbus-fzsonick-48tl.py +++ b/firmware/opt/victronenergy/dbus-fzsonick-48tl/dbus-fzsonick-48tl.py @@ -1,18 +1,16 @@ -#!/usr/bin/python3 -u +#!/usr/bin/python2 -u # coding=utf-8 import logging import re import socket import sys -import typing - -from gi.repository import GLib as glib +import gobject import signals import config as cfg from dbus.mainloop.glib import DBusGMainLoop -from pymodbus.client import ModbusSerialClient as Modbus +from pymodbus.client.sync import ModbusSerialClient as Modbus from pymodbus.exceptions import ModbusException, ModbusIOException from pymodbus.other_message import ReportSlaveIdRequest from pymodbus.pdu import ExceptionResponse @@ -23,353 +21,334 @@ from python_libs.ie_dbus.dbus_service import DBusService # trick the pycharm type-checker into thinking Callable is in scope, not used at runtime # noinspection PyUnreachableCode if False: - from typing import Callable, List, Iterable, NoReturn + from typing import Callable, List, Iterable, NoReturn + RESET_REGISTER = 0x2087 -SETTINGS_SERVICE_PREFIX = 'com.victronenergy.settings' -INVERTER_SERVICE_PREFIX = 'com.victronenergy.vebus.' - def init_modbus(tty): - # type: (str) -> Modbus + # type: (str) -> Modbus - logging.debug('initializing Modbus') + logging.debug('initializing Modbus') - return Modbus( - port='/dev/' + tty, - method=cfg.MODE, - baudrate=cfg.BAUD_RATE, - stopbits=cfg.STOP_BITS, - bytesize=cfg.BYTE_SIZE, - timeout=cfg.TIMEOUT, - parity=cfg.PARITY) + return Modbus( + port='/dev/' + tty, + method=cfg.MODE, + baudrate=cfg.BAUD_RATE, + stopbits=cfg.STOP_BITS, + bytesize=cfg.BYTE_SIZE, + timeout=cfg.TIMEOUT, + parity=cfg.PARITY) def init_udp_socket(): - # type: () -> socket + # type: () -> socket - s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) - s.setblocking(False) + s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + s.setblocking(False) - return s + return s def report_slave_id(modbus, slave_address): - # type: (Modbus, int) -> str + # type: (Modbus, int) -> str - slave = str(slave_address) + slave = str(slave_address) - logging.debug('requesting slave id from node ' + slave) + logging.debug('requesting slave id from node ' + slave) - with modbus: + with modbus: - request = ReportSlaveIdRequest(unit=slave_address) - response = modbus.execute(request) + request = ReportSlaveIdRequest(unit=slave_address) + response = modbus.execute(request) - if response is ExceptionResponse or issubclass(type(response), ModbusException): - raise Exception('failed to get slave id from ' + slave + ' : ' + str(response)) + if response is ExceptionResponse or issubclass(type(response), ModbusException): + raise Exception('failed to get slave id from ' + slave + ' : ' + str(response)) - return response.identifier + return response.identifier def identify_battery(modbus, slave_address): - # type: (Modbus, int) -> Battery + # type: (Modbus, int) -> Battery - logging.info('identifying battery...') + logging.info('identifying battery...') - hardware_version, bms_version, ampere_hours = parse_slave_id(modbus, slave_address) - firmware_version = read_firmware_version(modbus, slave_address) + hardware_version, bms_version, ampere_hours = parse_slave_id(modbus, slave_address) + firmware_version = read_firmware_version(modbus, slave_address) - specs = Battery( - slave_address=slave_address, - hardware_version=hardware_version, - firmware_version=firmware_version, - bms_version=bms_version, - ampere_hours=ampere_hours) + specs = Battery( + slave_address=slave_address, + hardware_version=hardware_version, + firmware_version=firmware_version, + bms_version=bms_version, + ampere_hours=ampere_hours) - logging.info('battery identified:\n{0}'.format(str(specs))) + logging.info('battery identified:\n{0}'.format(str(specs))) - return specs + return specs def identify_batteries(modbus): - # type: (Modbus) -> List[Battery] + # type: (Modbus) -> List[Battery] - def _identify_batteries(): - slave_address = 0 - n_missing = -255 + def _identify_batteries(): + slave_address = 0 + n_missing = -255 - while n_missing < 3: - slave_address += 1 - try: - yield identify_battery(modbus, slave_address) - n_missing = 0 - except Exception as e: - logging.info('failed to identify battery at {0} : {1}'.format(str(slave_address), str(e))) - n_missing += 1 + while n_missing < 3: + slave_address += 1 + try: + yield identify_battery(modbus, slave_address) + n_missing = 0 + except Exception as e: + logging.info('failed to identify battery at {0} : {1}'.format(str(slave_address), str(e))) + n_missing += 1 - logging.info('giving up searching for further batteries') + logging.info('giving up searching for further batteries') - batteries = list(_identify_batteries()) # dont be lazy! + batteries = list(_identify_batteries()) # dont be lazy! - n = len(batteries) - logging.info('found ' + str(n) + (' battery' if n == 1 else ' batteries')) + n = len(batteries) + logging.info('found ' + str(n) + (' battery' if n == 1 else ' batteries')) - return batteries + return batteries def parse_slave_id(modbus, slave_address): - # type: (Modbus, int) -> (str, str, int) + # type: (Modbus, int) -> (str, str, int) - slave_id = report_slave_id(modbus, slave_address) + slave_id = report_slave_id(modbus, slave_address) - sid = re.sub(r'[^\x20-\x7E]', '', slave_id) # remove weird special chars + sid = re.sub(r'[^\x20-\x7E]', '', slave_id) # remove weird special chars - match = re.match('(?P48TL(?P[0-9]+)) *(?P.*)', sid) + match = re.match('(?P48TL(?P[0-9]+)) *(?P.*)', sid) - if match is None: - raise Exception('no known battery found') + if match is None: + raise Exception('no known battery found') - return match.group('hw').strip(), match.group('bms').strip(), int(match.group('ah').strip()) + return match.group('hw').strip(), match.group('bms').strip(), int(match.group('ah').strip()) def read_firmware_version(modbus, slave_address): - # type: (Modbus, int) -> str + # type: (Modbus, int) -> str - logging.debug('reading firmware version') + logging.debug('reading firmware version') - with modbus: + with modbus: - response = read_modbus_registers(modbus, slave_address, base_address=1054, count=1) - register = response.registers[0] + response = read_modbus_registers(modbus, slave_address, base_address=1054, count=1) + register = response.registers[0] - return '{0:0>4X}'.format(register) + return '{0:0>4X}'.format(register) def read_modbus_registers(modbus, slave_address, base_address=cfg.BASE_ADDRESS, count=cfg.NO_OF_REGISTERS): - # type: (Modbus, int, int, int) -> ReadInputRegistersResponse + # type: (Modbus, int, int, int) -> ReadInputRegistersResponse - logging.debug('requesting modbus registers {0}-{1}'.format(base_address, base_address + count)) + logging.debug('requesting modbus registers {0}-{1}'.format(base_address, base_address + count)) - return modbus.read_input_registers( - address=base_address, - count=count, - unit=slave_address) + return modbus.read_input_registers( + address=base_address, + count=count, + unit=slave_address) def read_battery_status(modbus, battery): - # type: (Modbus, Battery) -> BatteryStatus - """ - Read the modbus registers containing the battery's status info. - """ + # type: (Modbus, Battery) -> BatteryStatus + """ + Read the modbus registers containing the battery's status info. + """ - logging.debug('reading battery status') + logging.debug('reading battery status') - with modbus: - data = read_modbus_registers(modbus, battery.slave_address) - return BatteryStatus(battery, data.registers) + with modbus: + data = read_modbus_registers(modbus, battery.slave_address) + return BatteryStatus(battery, data.registers) def publish_values_on_dbus(service, battery_signals, battery_statuses): - # type: (DBusService, Iterable[BatterySignal], Iterable[BatteryStatus]) -> () + # type: (DBusService, Iterable[BatterySignal], Iterable[BatteryStatus]) -> () - publish_individuals(service, battery_signals, battery_statuses) - publish_aggregates(service, battery_signals, battery_statuses) + publish_individuals(service, battery_signals, battery_statuses) + publish_aggregates(service, battery_signals, battery_statuses) def publish_aggregates(service, signals, battery_statuses): - # type: (DBusService, Iterable[BatterySignal], Iterable[BatteryStatus]) -> () + # type: (DBusService, Iterable[BatterySignal], Iterable[BatteryStatus]) -> () - for s in signals: - if s.aggregate is None: - continue - values = [s.get_value(battery_status) for battery_status in battery_statuses] - value = s.aggregate(values) - - service.own_properties.set(s.dbus_path, value, s.unit) + for s in signals: + if s.aggregate is None: + continue + values = [s.get_value(battery_status) for battery_status in battery_statuses] + value = s.aggregate(values) + service.own_properties.set(s.dbus_path, value, s.unit) def publish_individuals(service, signals, battery_statuses): - # type: (DBusService, Iterable[BatterySignal], Iterable[BatteryStatus]) -> () + # type: (DBusService, Iterable[BatterySignal], Iterable[BatteryStatus]) -> () - for signal in signals: - for battery_status in battery_statuses: - address = battery_status.battery.slave_address - dbus_path = '/_Battery/' + str(address) + signal.dbus_path - value = signal.get_value(battery_status) - service.own_properties.set(dbus_path, value, signal.unit) + for signal in signals: + for battery_status in battery_statuses: + address = battery_status.battery.slave_address + dbus_path = '/_Battery/' + str(address) + signal.dbus_path + value = signal.get_value(battery_status) + service.own_properties.set(dbus_path, value, signal.unit) def publish_service_signals(service, signals): - # type: (DBusService, Iterable[ServiceSignal]) -> NoReturn + # type: (DBusService, Iterable[ServiceSignal]) -> NoReturn - for signal in signals: - service.own_properties.set(signal.dbus_path, signal.value, signal.unit) + for signal in signals: + service.own_properties.set(signal.dbus_path, signal.value, signal.unit) def upload_status_to_innovenergy(sock, statuses): - # type: (socket, Iterable[BatteryStatus]) -> bool + # type: (socket, Iterable[BatteryStatus]) -> bool - logging.debug('upload status') + logging.debug('upload status') - try: - for s in statuses: - sock.sendto(s.serialize(), (cfg.INNOVENERGY_SERVER_IP, cfg.INNOVENERGY_SERVER_PORT)) - except: - logging.debug('FAILED') - return False - else: - return True + try: + for s in statuses: + sock.sendto(s.serialize(), (cfg.INNOVENERGY_SERVER_IP, cfg.INNOVENERGY_SERVER_PORT)) + except: + logging.debug('FAILED') + return False + else: + return True def print_usage(): - print ('Usage: ' + __file__ + ' ') - print ('Example: ' + __file__ + ' ttyUSB0') + print ('Usage: ' + __file__ + ' ') + print ('Example: ' + __file__ + ' ttyUSB0') def parse_cmdline_args(argv): - # type: (List[str]) -> str + # type: (List[str]) -> str - if len(argv) == 0: - logging.info('missing command line argument for tty device') - print_usage() - sys.exit(1) + if len(argv) == 0: + logging.info('missing command line argument for tty device') + print_usage() + sys.exit(1) - return argv[0] + return argv[0] def reset_batteries(modbus, batteries): - # type: (Modbus, Iterable[Battery]) -> NoReturn + # type: (Modbus, Iterable[Battery]) -> NoReturn - logging.info('Resetting batteries...') + logging.info('Resetting batteries...') - for battery in batteries: + for battery in batteries: - result = modbus.write_registers(RESET_REGISTER, [1], unit=battery.slave_address) + result = modbus.write_registers(RESET_REGISTER, [1], unit=battery.slave_address) - # expecting a ModbusIOException (timeout) - # BMS can no longer reply because it is already reset - success = isinstance(result, ModbusIOException) + # expecting a ModbusIOException (timeout) + # BMS can no longer reply because it is already reset + success = isinstance(result, ModbusIOException) - outcome = 'successfully' if success else 'FAILED to' - logging.info('Battery {0} {1} reset'.format(str(battery.slave_address), outcome)) + outcome = 'successfully' if success else 'FAILED to' + logging.info('Battery {0} {1} reset'.format(str(battery.slave_address), outcome)) - logging.info('Shutting down fz-sonick driver') - exit(0) + logging.info('Shutting down fz-sonick driver') + exit(0) -alive = True # global alive flag, watchdog_task clears it, update_task sets it +alive = True # global alive flag, watchdog_task clears it, update_task sets it def create_update_task(modbus, service, batteries): - # type: (Modbus, DBusService, Iterable[Battery]) -> Callable[[],bool] - """ - Creates an update task which runs the main update function - and resets the alive flag - """ - _socket = init_udp_socket() - _signals = signals.init_battery_signals() + # type: (Modbus, DBusService, Iterable[Battery]) -> Callable[[],bool] + """ + Creates an update task which runs the main update function + and resets the alive flag + """ + _socket = init_udp_socket() + _signals = signals.init_battery_signals() - def update_task(): - # type: () -> bool + def update_task(): + # type: () -> bool - global alive + global alive - logging.debug('starting update cycle') + logging.debug('starting update cycle') - # Checking if we have excess power and if so charge batteries more + if service.own_properties.get('/ResetBatteries').value == 1: + reset_batteries(modbus, batteries) - target = service.remote_properties.get(get_service(SETTINGS_SERVICE_PREFIX) + '/Settings/CGwacs/AcPowerSetPoint').value or 0 - actual = service.remote_properties.get(get_service(INVERTER_SERVICE_PREFIX) + '/Ac/Out/P').value or 0 + statuses = [read_battery_status(modbus, battery) for battery in batteries] - if actual>target: - service.own_properties.set('/Info/MaxChargeCurrent').value = min([battery.i_max for battery in batteries]) + publish_values_on_dbus(service, _signals, statuses) + upload_status_to_innovenergy(_socket, statuses) - if service.own_properties.get('/ResetBatteries').value == 1: - reset_batteries(modbus, batteries) + logging.debug('finished update cycle\n') - statuses = [read_battery_status(modbus, battery) for battery in batteries] + alive = True - publish_values_on_dbus(service, _signals, statuses) - upload_status_to_innovenergy(_socket, statuses) + return True - logging.debug('finished update cycle\n') - - alive = True - - return True - - return update_task + return update_task def create_watchdog_task(main_loop): - # type: (DBusGMainLoop) -> Callable[[],bool] - """ - Creates a Watchdog task that monitors the alive flag. - The watchdog kills the main loop if the alive flag is not periodically reset by the update task. - Who watches the watchdog? - """ + # type: (DBusGMainLoop) -> Callable[[],bool] + """ + Creates a Watchdog task that monitors the alive flag. + The watchdog kills the main loop if the alive flag is not periodically reset by the update task. + Who watches the watchdog? + """ + def watchdog_task(): + # type: () -> bool - def watchdog_task(): - # type: () -> bool + global alive - global alive + if alive: + logging.debug('watchdog_task: update_task is alive') + alive = False + return True + else: + logging.info('watchdog_task: killing main loop because update_task is no longer alive') + main_loop.quit() + return False - if alive: - logging.debug('watchdog_task: update_task is alive') - alive = False - return True - else: - logging.info('watchdog_task: killing main loop because update_task is no longer alive') - main_loop.quit() - return False - - return watchdog_task - -def get_service(self, prefix: str) -> Optional[unicode]: - service = next((s for s in self.available_services if s.startswith(prefix)), None) - if service is None: - raise Exception('no service matching ' + prefix + '* available') - - return service + return watchdog_task def main(argv): - # type: (List[str]) -> () + # type: (List[str]) -> () - logging.basicConfig(level=cfg.LOG_LEVEL) - logging.info('starting ' + __file__) + logging.basicConfig(level=cfg.LOG_LEVEL) + logging.info('starting ' + __file__) - tty = parse_cmdline_args(argv) - modbus = init_modbus(tty) + tty = parse_cmdline_args(argv) + modbus = init_modbus(tty) - batteries = identify_batteries(modbus) + batteries = identify_batteries(modbus) - if len(batteries) <= 0: - sys.exit(2) + if len(batteries) <= 0: + sys.exit(2) - service = DBusService(service_name=cfg.SERVICE_NAME_PREFIX + tty) + service = DBusService(service_name=cfg.SERVICE_NAME_PREFIX + tty) - service.own_properties.set('/ResetBatteries', value=False, writable=True) # initial value = False + service.own_properties.set('/ResetBatteries', value=False, writable=True) # initial value = False - main_loop = GLib.MainLoop() + main_loop = gobject.MainLoop() - service_signals = signals.init_service_signals(batteries) - publish_service_signals(service, service_signals) + service_signals = signals.init_service_signals(batteries) + publish_service_signals(service, service_signals) - update_task = create_update_task(modbus, service, batteries) - update_task() # run it right away, so that all props are initialized before anyone can ask - watchdog_task = create_watchdog_task(main_loop) + update_task = create_update_task(modbus, service, batteries) + update_task() # run it right away, so that all props are initialized before anyone can ask + watchdog_task = create_watchdog_task(main_loop) - GLib.timeout_add(cfg.UPDATE_INTERVAL * 2, watchdog_task, priority = GLib.PRIORITY_LOW) # add watchdog first - GLib.timeout_add(cfg.UPDATE_INTERVAL, update_task, priority = GLib.PRIORITY_LOW) # call update once every update_interval + gobject.timeout_add(cfg.UPDATE_INTERVAL * 2, watchdog_task, priority = gobject.PRIORITY_LOW) # add watchdog first + gobject.timeout_add(cfg.UPDATE_INTERVAL, update_task, priority = gobject.PRIORITY_LOW) # call update once every update_interval - logging.info('starting gobject.MainLoop') - main_loop.run() - logging.info('gobject.MainLoop was shut down') + logging.info('starting gobject.MainLoop') + main_loop.run() + logging.info('gobject.MainLoop was shut down') - sys.exit(0xFF) # reaches this only on error + sys.exit(0xFF) # reaches this only on error main(sys.argv[1:]) From 2e8dab4bbe91eedc9409e9162cac5ffc2e5a0703 Mon Sep 17 00:00:00 2001 From: kostas Date: Thu, 30 May 2024 13:19:04 +0200 Subject: [PATCH 06/25] extarct s3 data with decompression --- .../dbus-fzsonick-48tl/dbus-fzsonick-48tl.py | 403 +++++++++--------- 1 file changed, 212 insertions(+), 191 deletions(-) diff --git a/firmware/opt/victronenergy/dbus-fzsonick-48tl/dbus-fzsonick-48tl.py b/firmware/opt/victronenergy/dbus-fzsonick-48tl/dbus-fzsonick-48tl.py index f0af6f187..6d0284d39 100755 --- a/firmware/opt/victronenergy/dbus-fzsonick-48tl/dbus-fzsonick-48tl.py +++ b/firmware/opt/victronenergy/dbus-fzsonick-48tl/dbus-fzsonick-48tl.py @@ -5,7 +5,9 @@ import logging import re import socket import sys -import gobject +import typing + +from gi.repository import GLib as glib import signals import config as cfg @@ -23,332 +25,351 @@ from python_libs.ie_dbus.dbus_service import DBusService if False: from typing import Callable, List, Iterable, NoReturn - RESET_REGISTER = 0x2087 +SETTINGS_SERVICE_PREFIX = 'com.victronenergy.settings' +INVERTER_SERVICE_PREFIX = 'com.victronenergy.vebus.' + def init_modbus(tty): - # type: (str) -> Modbus + # type: (str) -> Modbus - logging.debug('initializing Modbus') + logging.debug('initializing Modbus') - return Modbus( - port='/dev/' + tty, - method=cfg.MODE, - baudrate=cfg.BAUD_RATE, - stopbits=cfg.STOP_BITS, - bytesize=cfg.BYTE_SIZE, - timeout=cfg.TIMEOUT, - parity=cfg.PARITY) + return Modbus( + port='/dev/' + tty, + method=cfg.MODE, + baudrate=cfg.BAUD_RATE, + stopbits=cfg.STOP_BITS, + bytesize=cfg.BYTE_SIZE, + timeout=cfg.TIMEOUT, + parity=cfg.PARITY) def init_udp_socket(): - # type: () -> socket + # type: () -> socket - s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) - s.setblocking(False) + s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + s.setblocking(False) - return s + return s def report_slave_id(modbus, slave_address): - # type: (Modbus, int) -> str + # type: (Modbus, int) -> str - slave = str(slave_address) + slave = str(slave_address) - logging.debug('requesting slave id from node ' + slave) + logging.debug('requesting slave id from node ' + slave) - with modbus: + with modbus: - request = ReportSlaveIdRequest(unit=slave_address) - response = modbus.execute(request) + request = ReportSlaveIdRequest(unit=slave_address) + response = modbus.execute(request) - if response is ExceptionResponse or issubclass(type(response), ModbusException): - raise Exception('failed to get slave id from ' + slave + ' : ' + str(response)) + if response is ExceptionResponse or issubclass(type(response), ModbusException): + raise Exception('failed to get slave id from ' + slave + ' : ' + str(response)) - return response.identifier + return response.identifier def identify_battery(modbus, slave_address): - # type: (Modbus, int) -> Battery + # type: (Modbus, int) -> Battery - logging.info('identifying battery...') + logging.info('identifying battery...') - hardware_version, bms_version, ampere_hours = parse_slave_id(modbus, slave_address) - firmware_version = read_firmware_version(modbus, slave_address) + hardware_version, bms_version, ampere_hours = parse_slave_id(modbus, slave_address) + firmware_version = read_firmware_version(modbus, slave_address) - specs = Battery( - slave_address=slave_address, - hardware_version=hardware_version, - firmware_version=firmware_version, - bms_version=bms_version, - ampere_hours=ampere_hours) + specs = Battery( + slave_address=slave_address, + hardware_version=hardware_version, + firmware_version=firmware_version, + bms_version=bms_version, + ampere_hours=ampere_hours) - logging.info('battery identified:\n{0}'.format(str(specs))) + logging.info('battery identified:\n{0}'.format(str(specs))) - return specs + return specs def identify_batteries(modbus): - # type: (Modbus) -> List[Battery] + # type: (Modbus) -> List[Battery] - def _identify_batteries(): - slave_address = 0 - n_missing = -255 + def _identify_batteries(): + slave_address = 0 + n_missing = -255 - while n_missing < 3: - slave_address += 1 - try: - yield identify_battery(modbus, slave_address) - n_missing = 0 - except Exception as e: - logging.info('failed to identify battery at {0} : {1}'.format(str(slave_address), str(e))) - n_missing += 1 + while n_missing < 3: + slave_address += 1 + try: + yield identify_battery(modbus, slave_address) + n_missing = 0 + except Exception as e: + logging.info('failed to identify battery at {0} : {1}'.format(str(slave_address), str(e))) + n_missing += 1 - logging.info('giving up searching for further batteries') + logging.info('giving up searching for further batteries') - batteries = list(_identify_batteries()) # dont be lazy! + batteries = list(_identify_batteries()) # dont be lazy! - n = len(batteries) - logging.info('found ' + str(n) + (' battery' if n == 1 else ' batteries')) + n = len(batteries) + logging.info('found ' + str(n) + (' battery' if n == 1 else ' batteries')) - return batteries + return batteries def parse_slave_id(modbus, slave_address): - # type: (Modbus, int) -> (str, str, int) + # type: (Modbus, int) -> (str, str, int) - slave_id = report_slave_id(modbus, slave_address) + slave_id = report_slave_id(modbus, slave_address) - sid = re.sub(r'[^\x20-\x7E]', '', slave_id) # remove weird special chars + sid = re.sub(r'[^\x20-\x7E]', '', slave_id) # remove weird special chars - match = re.match('(?P48TL(?P[0-9]+)) *(?P.*)', sid) + match = re.match('(?P48TL(?P[0-9]+)) *(?P.*)', sid) - if match is None: - raise Exception('no known battery found') + if match is None: + raise Exception('no known battery found') - return match.group('hw').strip(), match.group('bms').strip(), int(match.group('ah').strip()) + return match.group('hw').strip(), match.group('bms').strip(), int(match.group('ah').strip()) def read_firmware_version(modbus, slave_address): - # type: (Modbus, int) -> str + # type: (Modbus, int) -> str - logging.debug('reading firmware version') + logging.debug('reading firmware version') - with modbus: + with modbus: - response = read_modbus_registers(modbus, slave_address, base_address=1054, count=1) - register = response.registers[0] + response = read_modbus_registers(modbus, slave_address, base_address=1054, count=1) + register = response.registers[0] - return '{0:0>4X}'.format(register) + return '{0:0>4X}'.format(register) def read_modbus_registers(modbus, slave_address, base_address=cfg.BASE_ADDRESS, count=cfg.NO_OF_REGISTERS): - # type: (Modbus, int, int, int) -> ReadInputRegistersResponse + # type: (Modbus, int, int, int) -> ReadInputRegistersResponse - logging.debug('requesting modbus registers {0}-{1}'.format(base_address, base_address + count)) + logging.debug('requesting modbus registers {0}-{1}'.format(base_address, base_address + count)) - return modbus.read_input_registers( - address=base_address, - count=count, - unit=slave_address) + return modbus.read_input_registers( + address=base_address, + count=count, + unit=slave_address) def read_battery_status(modbus, battery): - # type: (Modbus, Battery) -> BatteryStatus - """ - Read the modbus registers containing the battery's status info. - """ + # type: (Modbus, Battery) -> BatteryStatus + """ + Read the modbus registers containing the battery's status info. + """ - logging.debug('reading battery status') + logging.debug('reading battery status') - with modbus: - data = read_modbus_registers(modbus, battery.slave_address) - return BatteryStatus(battery, data.registers) + with modbus: + data = read_modbus_registers(modbus, battery.slave_address) + return BatteryStatus(battery, data.registers) def publish_values_on_dbus(service, battery_signals, battery_statuses): - # type: (DBusService, Iterable[BatterySignal], Iterable[BatteryStatus]) -> () + # type: (DBusService, Iterable[BatterySignal], Iterable[BatteryStatus]) -> () - publish_individuals(service, battery_signals, battery_statuses) - publish_aggregates(service, battery_signals, battery_statuses) + publish_individuals(service, battery_signals, battery_statuses) + publish_aggregates(service, battery_signals, battery_statuses) def publish_aggregates(service, signals, battery_statuses): - # type: (DBusService, Iterable[BatterySignal], Iterable[BatteryStatus]) -> () + # type: (DBusService, Iterable[BatterySignal], Iterable[BatteryStatus]) -> () - for s in signals: - if s.aggregate is None: - continue - values = [s.get_value(battery_status) for battery_status in battery_statuses] - value = s.aggregate(values) - service.own_properties.set(s.dbus_path, value, s.unit) + for s in signals: + if s.aggregate is None: + continue + values = [s.get_value(battery_status) for battery_status in battery_statuses] + value = s.aggregate(values) + + service.own_properties.set(s.dbus_path, value, s.unit) def publish_individuals(service, signals, battery_statuses): - # type: (DBusService, Iterable[BatterySignal], Iterable[BatteryStatus]) -> () + # type: (DBusService, Iterable[BatterySignal], Iterable[BatteryStatus]) -> () - for signal in signals: - for battery_status in battery_statuses: - address = battery_status.battery.slave_address - dbus_path = '/_Battery/' + str(address) + signal.dbus_path - value = signal.get_value(battery_status) - service.own_properties.set(dbus_path, value, signal.unit) + for signal in signals: + for battery_status in battery_statuses: + address = battery_status.battery.slave_address + dbus_path = '/_Battery/' + str(address) + signal.dbus_path + value = signal.get_value(battery_status) + service.own_properties.set(dbus_path, value, signal.unit) def publish_service_signals(service, signals): - # type: (DBusService, Iterable[ServiceSignal]) -> NoReturn + # type: (DBusService, Iterable[ServiceSignal]) -> NoReturn - for signal in signals: - service.own_properties.set(signal.dbus_path, signal.value, signal.unit) + for signal in signals: + service.own_properties.set(signal.dbus_path, signal.value, signal.unit) def upload_status_to_innovenergy(sock, statuses): - # type: (socket, Iterable[BatteryStatus]) -> bool + # type: (socket, Iterable[BatteryStatus]) -> bool - logging.debug('upload status') + logging.debug('upload status') - try: - for s in statuses: - sock.sendto(s.serialize(), (cfg.INNOVENERGY_SERVER_IP, cfg.INNOVENERGY_SERVER_PORT)) - except: - logging.debug('FAILED') - return False - else: - return True + try: + for s in statuses: + sock.sendto(s.serialize(), (cfg.INNOVENERGY_SERVER_IP, cfg.INNOVENERGY_SERVER_PORT)) + except: + logging.debug('FAILED') + return False + else: + return True def print_usage(): - print ('Usage: ' + __file__ + ' ') - print ('Example: ' + __file__ + ' ttyUSB0') + print ('Usage: ' + __file__ + ' ') + print ('Example: ' + __file__ + ' ttyUSB0') def parse_cmdline_args(argv): - # type: (List[str]) -> str + # type: (List[str]) -> str - if len(argv) == 0: - logging.info('missing command line argument for tty device') - print_usage() - sys.exit(1) + if len(argv) == 0: + logging.info('missing command line argument for tty device') + print_usage() + sys.exit(1) - return argv[0] + return argv[0] def reset_batteries(modbus, batteries): - # type: (Modbus, Iterable[Battery]) -> NoReturn + # type: (Modbus, Iterable[Battery]) -> NoReturn - logging.info('Resetting batteries...') + logging.info('Resetting batteries...') - for battery in batteries: + for battery in batteries: - result = modbus.write_registers(RESET_REGISTER, [1], unit=battery.slave_address) + result = modbus.write_registers(RESET_REGISTER, [1], unit=battery.slave_address) - # expecting a ModbusIOException (timeout) - # BMS can no longer reply because it is already reset - success = isinstance(result, ModbusIOException) + # expecting a ModbusIOException (timeout) + # BMS can no longer reply because it is already reset + success = isinstance(result, ModbusIOException) - outcome = 'successfully' if success else 'FAILED to' - logging.info('Battery {0} {1} reset'.format(str(battery.slave_address), outcome)) + outcome = 'successfully' if success else 'FAILED to' + logging.info('Battery {0} {1} reset'.format(str(battery.slave_address), outcome)) - logging.info('Shutting down fz-sonick driver') - exit(0) + logging.info('Shutting down fz-sonick driver') + exit(0) -alive = True # global alive flag, watchdog_task clears it, update_task sets it +alive = True # global alive flag, watchdog_task clears it, update_task sets it def create_update_task(modbus, service, batteries): - # type: (Modbus, DBusService, Iterable[Battery]) -> Callable[[],bool] - """ - Creates an update task which runs the main update function - and resets the alive flag - """ - _socket = init_udp_socket() - _signals = signals.init_battery_signals() + # type: (Modbus, DBusService, Iterable[Battery]) -> Callable[[],bool] + """ + Creates an update task which runs the main update function + and resets the alive flag + """ + _socket = init_udp_socket() + _signals = signals.init_battery_signals() - def update_task(): - # type: () -> bool + def update_task(): + # type: () -> bool - global alive + global alive - logging.debug('starting update cycle') + logging.debug('starting update cycle') - if service.own_properties.get('/ResetBatteries').value == 1: - reset_batteries(modbus, batteries) + # Checking if we have excess power and if so charge batteries more - statuses = [read_battery_status(modbus, battery) for battery in batteries] + target = service.remote_properties.get(get_service(SETTINGS_SERVICE_PREFIX) + '/Settings/CGwacs/AcPowerSetPoint').value or 0 + actual = service.remote_properties.get(get_service(INVERTER_SERVICE_PREFIX) + '/Ac/Out/P').value or 0 - publish_values_on_dbus(service, _signals, statuses) - upload_status_to_innovenergy(_socket, statuses) + if actual>target: + service.own_properties.set('/Info/MaxChargeCurrent').value = min([battery.i_max for battery in batteries]) - logging.debug('finished update cycle\n') + if service.own_properties.get('/ResetBatteries').value == 1: + reset_batteries(modbus, batteries) - alive = True + statuses = [read_battery_status(modbus, battery) for battery in batteries] - return True + publish_values_on_dbus(service, _signals, statuses) + upload_status_to_innovenergy(_socket, statuses) - return update_task + logging.debug('finished update cycle\n') + + alive = True + + return True + + return update_task def create_watchdog_task(main_loop): - # type: (DBusGMainLoop) -> Callable[[],bool] - """ - Creates a Watchdog task that monitors the alive flag. - The watchdog kills the main loop if the alive flag is not periodically reset by the update task. - Who watches the watchdog? - """ - def watchdog_task(): - # type: () -> bool + # type: (DBusGMainLoop) -> Callable[[],bool] + """ + Creates a Watchdog task that monitors the alive flag. + The watchdog kills the main loop if the alive flag is not periodically reset by the update task. + Who watches the watchdog? + """ - global alive + def watchdog_task(): + # type: () -> bool - if alive: - logging.debug('watchdog_task: update_task is alive') - alive = False - return True - else: - logging.info('watchdog_task: killing main loop because update_task is no longer alive') - main_loop.quit() - return False + global alive - return watchdog_task + if alive: + logging.debug('watchdog_task: update_task is alive') + alive = False + return True + else: + logging.info('watchdog_task: killing main loop because update_task is no longer alive') + main_loop.quit() + return False + + return watchdog_task + +def get_service(self, prefix: str) -> Optional[unicode]: + service = next((s for s in self.available_services if s.startswith(prefix)), None) + if service is None: + raise Exception('no service matching ' + prefix + '* available') + + return service def main(argv): - # type: (List[str]) -> () + # type: (List[str]) -> () - logging.basicConfig(level=cfg.LOG_LEVEL) - logging.info('starting ' + __file__) + logging.basicConfig(level=cfg.LOG_LEVEL) + logging.info('starting ' + __file__) - tty = parse_cmdline_args(argv) - modbus = init_modbus(tty) + tty = parse_cmdline_args(argv) + modbus = init_modbus(tty) - batteries = identify_batteries(modbus) + batteries = identify_batteries(modbus) - if len(batteries) <= 0: - sys.exit(2) + if len(batteries) <= 0: + sys.exit(2) - service = DBusService(service_name=cfg.SERVICE_NAME_PREFIX + tty) + service = DBusService(service_name=cfg.SERVICE_NAME_PREFIX + tty) - service.own_properties.set('/ResetBatteries', value=False, writable=True) # initial value = False + service.own_properties.set('/ResetBatteries', value=False, writable=True) # initial value = False - main_loop = gobject.MainLoop() + main_loop = GLib.MainLoop() - service_signals = signals.init_service_signals(batteries) - publish_service_signals(service, service_signals) + service_signals = signals.init_service_signals(batteries) + publish_service_signals(service, service_signals) - update_task = create_update_task(modbus, service, batteries) - update_task() # run it right away, so that all props are initialized before anyone can ask - watchdog_task = create_watchdog_task(main_loop) + update_task = create_update_task(modbus, service, batteries) + update_task() # run it right away, so that all props are initialized before anyone can ask + watchdog_task = create_watchdog_task(main_loop) - gobject.timeout_add(cfg.UPDATE_INTERVAL * 2, watchdog_task, priority = gobject.PRIORITY_LOW) # add watchdog first - gobject.timeout_add(cfg.UPDATE_INTERVAL, update_task, priority = gobject.PRIORITY_LOW) # call update once every update_interval + GLib.timeout_add(cfg.UPDATE_INTERVAL * 2, watchdog_task, priority = GLib.PRIORITY_LOW) # add watchdog first + GLib.timeout_add(cfg.UPDATE_INTERVAL, update_task, priority = GLib.PRIORITY_LOW) # call update once every update_interval - logging.info('starting gobject.MainLoop') - main_loop.run() - logging.info('gobject.MainLoop was shut down') + logging.info('starting gobject.MainLoop') + main_loop.run() + logging.info('gobject.MainLoop was shut down') - sys.exit(0xFF) # reaches this only on error + sys.exit(0xFF) # reaches this only on error main(sys.argv[1:]) From bac3e17224753c62423443002e9c8d48642b1120 Mon Sep 17 00:00:00 2001 From: kostas Date: Thu, 30 May 2024 13:19:58 +0200 Subject: [PATCH 07/25] extarct s3 data with decompression --- .../dbus-fzsonick-48tl/dbus-fzsonick-48tl.py | 403 +++++++++--------- 1 file changed, 191 insertions(+), 212 deletions(-) diff --git a/firmware/opt/victronenergy/dbus-fzsonick-48tl/dbus-fzsonick-48tl.py b/firmware/opt/victronenergy/dbus-fzsonick-48tl/dbus-fzsonick-48tl.py index 6d0284d39..f0af6f187 100755 --- a/firmware/opt/victronenergy/dbus-fzsonick-48tl/dbus-fzsonick-48tl.py +++ b/firmware/opt/victronenergy/dbus-fzsonick-48tl/dbus-fzsonick-48tl.py @@ -5,9 +5,7 @@ import logging import re import socket import sys -import typing - -from gi.repository import GLib as glib +import gobject import signals import config as cfg @@ -25,351 +23,332 @@ from python_libs.ie_dbus.dbus_service import DBusService if False: from typing import Callable, List, Iterable, NoReturn -RESET_REGISTER = 0x2087 -SETTINGS_SERVICE_PREFIX = 'com.victronenergy.settings' -INVERTER_SERVICE_PREFIX = 'com.victronenergy.vebus.' +RESET_REGISTER = 0x2087 def init_modbus(tty): - # type: (str) -> Modbus + # type: (str) -> Modbus - logging.debug('initializing Modbus') + logging.debug('initializing Modbus') - return Modbus( - port='/dev/' + tty, - method=cfg.MODE, - baudrate=cfg.BAUD_RATE, - stopbits=cfg.STOP_BITS, - bytesize=cfg.BYTE_SIZE, - timeout=cfg.TIMEOUT, - parity=cfg.PARITY) + return Modbus( + port='/dev/' + tty, + method=cfg.MODE, + baudrate=cfg.BAUD_RATE, + stopbits=cfg.STOP_BITS, + bytesize=cfg.BYTE_SIZE, + timeout=cfg.TIMEOUT, + parity=cfg.PARITY) def init_udp_socket(): - # type: () -> socket + # type: () -> socket - s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) - s.setblocking(False) + s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + s.setblocking(False) - return s + return s def report_slave_id(modbus, slave_address): - # type: (Modbus, int) -> str + # type: (Modbus, int) -> str - slave = str(slave_address) + slave = str(slave_address) - logging.debug('requesting slave id from node ' + slave) + logging.debug('requesting slave id from node ' + slave) - with modbus: + with modbus: - request = ReportSlaveIdRequest(unit=slave_address) - response = modbus.execute(request) + request = ReportSlaveIdRequest(unit=slave_address) + response = modbus.execute(request) - if response is ExceptionResponse or issubclass(type(response), ModbusException): - raise Exception('failed to get slave id from ' + slave + ' : ' + str(response)) + if response is ExceptionResponse or issubclass(type(response), ModbusException): + raise Exception('failed to get slave id from ' + slave + ' : ' + str(response)) - return response.identifier + return response.identifier def identify_battery(modbus, slave_address): - # type: (Modbus, int) -> Battery + # type: (Modbus, int) -> Battery - logging.info('identifying battery...') + logging.info('identifying battery...') - hardware_version, bms_version, ampere_hours = parse_slave_id(modbus, slave_address) - firmware_version = read_firmware_version(modbus, slave_address) + hardware_version, bms_version, ampere_hours = parse_slave_id(modbus, slave_address) + firmware_version = read_firmware_version(modbus, slave_address) - specs = Battery( - slave_address=slave_address, - hardware_version=hardware_version, - firmware_version=firmware_version, - bms_version=bms_version, - ampere_hours=ampere_hours) + specs = Battery( + slave_address=slave_address, + hardware_version=hardware_version, + firmware_version=firmware_version, + bms_version=bms_version, + ampere_hours=ampere_hours) - logging.info('battery identified:\n{0}'.format(str(specs))) + logging.info('battery identified:\n{0}'.format(str(specs))) - return specs + return specs def identify_batteries(modbus): - # type: (Modbus) -> List[Battery] + # type: (Modbus) -> List[Battery] - def _identify_batteries(): - slave_address = 0 - n_missing = -255 + def _identify_batteries(): + slave_address = 0 + n_missing = -255 - while n_missing < 3: - slave_address += 1 - try: - yield identify_battery(modbus, slave_address) - n_missing = 0 - except Exception as e: - logging.info('failed to identify battery at {0} : {1}'.format(str(slave_address), str(e))) - n_missing += 1 + while n_missing < 3: + slave_address += 1 + try: + yield identify_battery(modbus, slave_address) + n_missing = 0 + except Exception as e: + logging.info('failed to identify battery at {0} : {1}'.format(str(slave_address), str(e))) + n_missing += 1 - logging.info('giving up searching for further batteries') + logging.info('giving up searching for further batteries') - batteries = list(_identify_batteries()) # dont be lazy! + batteries = list(_identify_batteries()) # dont be lazy! - n = len(batteries) - logging.info('found ' + str(n) + (' battery' if n == 1 else ' batteries')) + n = len(batteries) + logging.info('found ' + str(n) + (' battery' if n == 1 else ' batteries')) - return batteries + return batteries def parse_slave_id(modbus, slave_address): - # type: (Modbus, int) -> (str, str, int) + # type: (Modbus, int) -> (str, str, int) - slave_id = report_slave_id(modbus, slave_address) + slave_id = report_slave_id(modbus, slave_address) - sid = re.sub(r'[^\x20-\x7E]', '', slave_id) # remove weird special chars + sid = re.sub(r'[^\x20-\x7E]', '', slave_id) # remove weird special chars - match = re.match('(?P48TL(?P[0-9]+)) *(?P.*)', sid) + match = re.match('(?P48TL(?P[0-9]+)) *(?P.*)', sid) - if match is None: - raise Exception('no known battery found') + if match is None: + raise Exception('no known battery found') - return match.group('hw').strip(), match.group('bms').strip(), int(match.group('ah').strip()) + return match.group('hw').strip(), match.group('bms').strip(), int(match.group('ah').strip()) def read_firmware_version(modbus, slave_address): - # type: (Modbus, int) -> str + # type: (Modbus, int) -> str - logging.debug('reading firmware version') + logging.debug('reading firmware version') - with modbus: + with modbus: - response = read_modbus_registers(modbus, slave_address, base_address=1054, count=1) - register = response.registers[0] + response = read_modbus_registers(modbus, slave_address, base_address=1054, count=1) + register = response.registers[0] - return '{0:0>4X}'.format(register) + return '{0:0>4X}'.format(register) def read_modbus_registers(modbus, slave_address, base_address=cfg.BASE_ADDRESS, count=cfg.NO_OF_REGISTERS): - # type: (Modbus, int, int, int) -> ReadInputRegistersResponse + # type: (Modbus, int, int, int) -> ReadInputRegistersResponse - logging.debug('requesting modbus registers {0}-{1}'.format(base_address, base_address + count)) + logging.debug('requesting modbus registers {0}-{1}'.format(base_address, base_address + count)) - return modbus.read_input_registers( - address=base_address, - count=count, - unit=slave_address) + return modbus.read_input_registers( + address=base_address, + count=count, + unit=slave_address) def read_battery_status(modbus, battery): - # type: (Modbus, Battery) -> BatteryStatus - """ - Read the modbus registers containing the battery's status info. - """ + # type: (Modbus, Battery) -> BatteryStatus + """ + Read the modbus registers containing the battery's status info. + """ - logging.debug('reading battery status') + logging.debug('reading battery status') - with modbus: - data = read_modbus_registers(modbus, battery.slave_address) - return BatteryStatus(battery, data.registers) + with modbus: + data = read_modbus_registers(modbus, battery.slave_address) + return BatteryStatus(battery, data.registers) def publish_values_on_dbus(service, battery_signals, battery_statuses): - # type: (DBusService, Iterable[BatterySignal], Iterable[BatteryStatus]) -> () + # type: (DBusService, Iterable[BatterySignal], Iterable[BatteryStatus]) -> () - publish_individuals(service, battery_signals, battery_statuses) - publish_aggregates(service, battery_signals, battery_statuses) + publish_individuals(service, battery_signals, battery_statuses) + publish_aggregates(service, battery_signals, battery_statuses) def publish_aggregates(service, signals, battery_statuses): - # type: (DBusService, Iterable[BatterySignal], Iterable[BatteryStatus]) -> () + # type: (DBusService, Iterable[BatterySignal], Iterable[BatteryStatus]) -> () - for s in signals: - if s.aggregate is None: - continue - values = [s.get_value(battery_status) for battery_status in battery_statuses] - value = s.aggregate(values) - - service.own_properties.set(s.dbus_path, value, s.unit) + for s in signals: + if s.aggregate is None: + continue + values = [s.get_value(battery_status) for battery_status in battery_statuses] + value = s.aggregate(values) + service.own_properties.set(s.dbus_path, value, s.unit) def publish_individuals(service, signals, battery_statuses): - # type: (DBusService, Iterable[BatterySignal], Iterable[BatteryStatus]) -> () + # type: (DBusService, Iterable[BatterySignal], Iterable[BatteryStatus]) -> () - for signal in signals: - for battery_status in battery_statuses: - address = battery_status.battery.slave_address - dbus_path = '/_Battery/' + str(address) + signal.dbus_path - value = signal.get_value(battery_status) - service.own_properties.set(dbus_path, value, signal.unit) + for signal in signals: + for battery_status in battery_statuses: + address = battery_status.battery.slave_address + dbus_path = '/_Battery/' + str(address) + signal.dbus_path + value = signal.get_value(battery_status) + service.own_properties.set(dbus_path, value, signal.unit) def publish_service_signals(service, signals): - # type: (DBusService, Iterable[ServiceSignal]) -> NoReturn + # type: (DBusService, Iterable[ServiceSignal]) -> NoReturn - for signal in signals: - service.own_properties.set(signal.dbus_path, signal.value, signal.unit) + for signal in signals: + service.own_properties.set(signal.dbus_path, signal.value, signal.unit) def upload_status_to_innovenergy(sock, statuses): - # type: (socket, Iterable[BatteryStatus]) -> bool + # type: (socket, Iterable[BatteryStatus]) -> bool - logging.debug('upload status') + logging.debug('upload status') - try: - for s in statuses: - sock.sendto(s.serialize(), (cfg.INNOVENERGY_SERVER_IP, cfg.INNOVENERGY_SERVER_PORT)) - except: - logging.debug('FAILED') - return False - else: - return True + try: + for s in statuses: + sock.sendto(s.serialize(), (cfg.INNOVENERGY_SERVER_IP, cfg.INNOVENERGY_SERVER_PORT)) + except: + logging.debug('FAILED') + return False + else: + return True def print_usage(): - print ('Usage: ' + __file__ + ' ') - print ('Example: ' + __file__ + ' ttyUSB0') + print ('Usage: ' + __file__ + ' ') + print ('Example: ' + __file__ + ' ttyUSB0') def parse_cmdline_args(argv): - # type: (List[str]) -> str + # type: (List[str]) -> str - if len(argv) == 0: - logging.info('missing command line argument for tty device') - print_usage() - sys.exit(1) + if len(argv) == 0: + logging.info('missing command line argument for tty device') + print_usage() + sys.exit(1) - return argv[0] + return argv[0] def reset_batteries(modbus, batteries): - # type: (Modbus, Iterable[Battery]) -> NoReturn + # type: (Modbus, Iterable[Battery]) -> NoReturn - logging.info('Resetting batteries...') + logging.info('Resetting batteries...') - for battery in batteries: + for battery in batteries: - result = modbus.write_registers(RESET_REGISTER, [1], unit=battery.slave_address) + result = modbus.write_registers(RESET_REGISTER, [1], unit=battery.slave_address) - # expecting a ModbusIOException (timeout) - # BMS can no longer reply because it is already reset - success = isinstance(result, ModbusIOException) + # expecting a ModbusIOException (timeout) + # BMS can no longer reply because it is already reset + success = isinstance(result, ModbusIOException) - outcome = 'successfully' if success else 'FAILED to' - logging.info('Battery {0} {1} reset'.format(str(battery.slave_address), outcome)) + outcome = 'successfully' if success else 'FAILED to' + logging.info('Battery {0} {1} reset'.format(str(battery.slave_address), outcome)) - logging.info('Shutting down fz-sonick driver') - exit(0) + logging.info('Shutting down fz-sonick driver') + exit(0) -alive = True # global alive flag, watchdog_task clears it, update_task sets it +alive = True # global alive flag, watchdog_task clears it, update_task sets it def create_update_task(modbus, service, batteries): - # type: (Modbus, DBusService, Iterable[Battery]) -> Callable[[],bool] - """ - Creates an update task which runs the main update function - and resets the alive flag - """ - _socket = init_udp_socket() - _signals = signals.init_battery_signals() + # type: (Modbus, DBusService, Iterable[Battery]) -> Callable[[],bool] + """ + Creates an update task which runs the main update function + and resets the alive flag + """ + _socket = init_udp_socket() + _signals = signals.init_battery_signals() - def update_task(): - # type: () -> bool + def update_task(): + # type: () -> bool - global alive + global alive - logging.debug('starting update cycle') + logging.debug('starting update cycle') - # Checking if we have excess power and if so charge batteries more + if service.own_properties.get('/ResetBatteries').value == 1: + reset_batteries(modbus, batteries) - target = service.remote_properties.get(get_service(SETTINGS_SERVICE_PREFIX) + '/Settings/CGwacs/AcPowerSetPoint').value or 0 - actual = service.remote_properties.get(get_service(INVERTER_SERVICE_PREFIX) + '/Ac/Out/P').value or 0 + statuses = [read_battery_status(modbus, battery) for battery in batteries] - if actual>target: - service.own_properties.set('/Info/MaxChargeCurrent').value = min([battery.i_max for battery in batteries]) + publish_values_on_dbus(service, _signals, statuses) + upload_status_to_innovenergy(_socket, statuses) - if service.own_properties.get('/ResetBatteries').value == 1: - reset_batteries(modbus, batteries) + logging.debug('finished update cycle\n') - statuses = [read_battery_status(modbus, battery) for battery in batteries] + alive = True - publish_values_on_dbus(service, _signals, statuses) - upload_status_to_innovenergy(_socket, statuses) + return True - logging.debug('finished update cycle\n') - - alive = True - - return True - - return update_task + return update_task def create_watchdog_task(main_loop): - # type: (DBusGMainLoop) -> Callable[[],bool] - """ - Creates a Watchdog task that monitors the alive flag. - The watchdog kills the main loop if the alive flag is not periodically reset by the update task. - Who watches the watchdog? - """ + # type: (DBusGMainLoop) -> Callable[[],bool] + """ + Creates a Watchdog task that monitors the alive flag. + The watchdog kills the main loop if the alive flag is not periodically reset by the update task. + Who watches the watchdog? + """ + def watchdog_task(): + # type: () -> bool - def watchdog_task(): - # type: () -> bool + global alive - global alive + if alive: + logging.debug('watchdog_task: update_task is alive') + alive = False + return True + else: + logging.info('watchdog_task: killing main loop because update_task is no longer alive') + main_loop.quit() + return False - if alive: - logging.debug('watchdog_task: update_task is alive') - alive = False - return True - else: - logging.info('watchdog_task: killing main loop because update_task is no longer alive') - main_loop.quit() - return False - - return watchdog_task - -def get_service(self, prefix: str) -> Optional[unicode]: - service = next((s for s in self.available_services if s.startswith(prefix)), None) - if service is None: - raise Exception('no service matching ' + prefix + '* available') - - return service + return watchdog_task def main(argv): - # type: (List[str]) -> () + # type: (List[str]) -> () - logging.basicConfig(level=cfg.LOG_LEVEL) - logging.info('starting ' + __file__) + logging.basicConfig(level=cfg.LOG_LEVEL) + logging.info('starting ' + __file__) - tty = parse_cmdline_args(argv) - modbus = init_modbus(tty) + tty = parse_cmdline_args(argv) + modbus = init_modbus(tty) - batteries = identify_batteries(modbus) + batteries = identify_batteries(modbus) - if len(batteries) <= 0: - sys.exit(2) + if len(batteries) <= 0: + sys.exit(2) - service = DBusService(service_name=cfg.SERVICE_NAME_PREFIX + tty) + service = DBusService(service_name=cfg.SERVICE_NAME_PREFIX + tty) - service.own_properties.set('/ResetBatteries', value=False, writable=True) # initial value = False + service.own_properties.set('/ResetBatteries', value=False, writable=True) # initial value = False - main_loop = GLib.MainLoop() + main_loop = gobject.MainLoop() - service_signals = signals.init_service_signals(batteries) - publish_service_signals(service, service_signals) + service_signals = signals.init_service_signals(batteries) + publish_service_signals(service, service_signals) - update_task = create_update_task(modbus, service, batteries) - update_task() # run it right away, so that all props are initialized before anyone can ask - watchdog_task = create_watchdog_task(main_loop) + update_task = create_update_task(modbus, service, batteries) + update_task() # run it right away, so that all props are initialized before anyone can ask + watchdog_task = create_watchdog_task(main_loop) - GLib.timeout_add(cfg.UPDATE_INTERVAL * 2, watchdog_task, priority = GLib.PRIORITY_LOW) # add watchdog first - GLib.timeout_add(cfg.UPDATE_INTERVAL, update_task, priority = GLib.PRIORITY_LOW) # call update once every update_interval + gobject.timeout_add(cfg.UPDATE_INTERVAL * 2, watchdog_task, priority = gobject.PRIORITY_LOW) # add watchdog first + gobject.timeout_add(cfg.UPDATE_INTERVAL, update_task, priority = gobject.PRIORITY_LOW) # call update once every update_interval - logging.info('starting gobject.MainLoop') - main_loop.run() - logging.info('gobject.MainLoop was shut down') + logging.info('starting gobject.MainLoop') + main_loop.run() + logging.info('gobject.MainLoop was shut down') - sys.exit(0xFF) # reaches this only on error + sys.exit(0xFF) # reaches this only on error main(sys.argv[1:]) From c73ef581e3c81da369127dc086cdbca191275eb5 Mon Sep 17 00:00:00 2001 From: kostas Date: Mon, 3 Jun 2024 12:53:39 +0200 Subject: [PATCH 08/25] extarct s3 data with decompression --- .../dbus-fz-sonick-48tl-with-s3/__init__.py | 0 python/dbus-fz-sonick-48tl-with-s3/config.py | 59 ++ .../dbus-fz-sonick-48tl-with-s3/controller.py | 644 +++++++++++++++++ python/dbus-fz-sonick-48tl-with-s3/convert.py | 192 +++++ python/dbus-fz-sonick-48tl-with-s3/data.py | 134 ++++ .../dbus-fzsonick-48tl.py | 674 ++++++++++++++++++ .../dbus-fz-sonick-48tl-with-s3/dbus_types.py | 156 ++++ .../ext/velib_python/ve_utils.py | 202 ++++++ .../ext/velib_python/vedbus.py | 496 +++++++++++++ .../dbus-fz-sonick-48tl-with-s3/service/down | 0 .../service/log/down | 0 .../service/log/run | 3 + python/dbus-fz-sonick-48tl-with-s3/signals.py | 374 ++++++++++ python/dbus-fz-sonick-48tl-with-s3/start.sh | 7 + 14 files changed, 2941 insertions(+) create mode 100644 python/dbus-fz-sonick-48tl-with-s3/__init__.py create mode 100755 python/dbus-fz-sonick-48tl-with-s3/config.py create mode 100755 python/dbus-fz-sonick-48tl-with-s3/controller.py create mode 100755 python/dbus-fz-sonick-48tl-with-s3/convert.py create mode 100755 python/dbus-fz-sonick-48tl-with-s3/data.py create mode 100755 python/dbus-fz-sonick-48tl-with-s3/dbus-fzsonick-48tl.py create mode 100644 python/dbus-fz-sonick-48tl-with-s3/dbus_types.py create mode 100644 python/dbus-fz-sonick-48tl-with-s3/ext/velib_python/ve_utils.py create mode 100644 python/dbus-fz-sonick-48tl-with-s3/ext/velib_python/vedbus.py create mode 100644 python/dbus-fz-sonick-48tl-with-s3/service/down create mode 100644 python/dbus-fz-sonick-48tl-with-s3/service/log/down create mode 100755 python/dbus-fz-sonick-48tl-with-s3/service/log/run create mode 100644 python/dbus-fz-sonick-48tl-with-s3/signals.py create mode 100755 python/dbus-fz-sonick-48tl-with-s3/start.sh diff --git a/python/dbus-fz-sonick-48tl-with-s3/__init__.py b/python/dbus-fz-sonick-48tl-with-s3/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/python/dbus-fz-sonick-48tl-with-s3/config.py b/python/dbus-fz-sonick-48tl-with-s3/config.py new file mode 100755 index 000000000..1d4962daa --- /dev/null +++ b/python/dbus-fz-sonick-48tl-with-s3/config.py @@ -0,0 +1,59 @@ +import serial +import logging +from data import read_file_one_line + +# dbus configuration + +CONNECTION = 'Modbus RTU' +PRODUCT_NAME = 'FIAMM 48TL Series Battery' +PRODUCT_ID = 0xB012 # assigned by victron +DEVICE_INSTANCE = 1 +SERVICE_NAME_PREFIX = 'com.victronenergy.battery.' + + +# driver configuration + +SOFTWARE_VERSION = '3.0.0' +UPDATE_INTERVAL = 2000 # milliseconds +#LOG_LEVEL = logging.INFO +LOG_LEVEL = logging.DEBUG + + +# battery config + +V_MAX = 54.2 +V_MIN = 42 +R_STRING_MIN = 0.125 +R_STRING_MAX = 0.250 +I_MAX_PER_STRING = 15 +AH_PER_STRING = 40 +NUM_OF_STRINGS_PER_BATTERY = 5 + +# modbus configuration + +BASE_ADDRESS = 999 +NO_OF_REGISTERS = 64 +MAX_SLAVE_ADDRESS = 25 + + +# RS 485 configuration + +PARITY = serial.PARITY_ODD +TIMEOUT = 0.1 # seconds +BAUD_RATE = 115200 +BYTE_SIZE = 8 +STOP_BITS = 1 +MODE = 'rtu' + +# InnovEnergy IOT configuration + +INSTALLATION_NAME = read_file_one_line('/data/innovenergy/openvpn/installation-name') +INNOVENERGY_SERVER_IP = '10.2.0.1' +INNOVENERGY_SERVER_PORT = 8134 +INNOVENERGY_PROTOCOL_VERSION = '48TL200V3' + + +# S3 Credentials +S3BUCKET = "5-c0436b6a-d276-4cd8-9c44-1eae86cf5d0e" +S3KEY = "EXO6bb63d9bbe5f938a68fa444b" +S3SECRET = "A4-5wIjIlAqn-p0cUkQu0f9fBIrX1V5PGTBDwjsrlR8" diff --git a/python/dbus-fz-sonick-48tl-with-s3/controller.py b/python/dbus-fz-sonick-48tl-with-s3/controller.py new file mode 100755 index 000000000..749093592 --- /dev/null +++ b/python/dbus-fz-sonick-48tl-with-s3/controller.py @@ -0,0 +1,644 @@ +#!/usr/bin/python -u +# coding=utf-8 + +import logging +import os +import time +import states as State +import target_type as TargetType + +from random import randint +from python_libs.ie_dbus.dbus_service import DBusService +from python_libs.ie_utils.main_loop import run_on_main_loop + +# noinspection PyUnreachableCode +if False: + from typing import NoReturn, Optional, Any, Iterable, List + +logging.basicConfig(level=logging.INFO) +_log = logging.getLogger(__name__) + +VERSION = '1.0.0' +PRODUCT = 'Controller' + +GRID_SERVICE_PREFIX = 'com.victronenergy.grid.' +BATTERY_SERVICE_PREFIX = 'com.victronenergy.battery.' +INVERTER_SERVICE_PREFIX = 'com.victronenergy.vebus.' +SYSTEM_SERVICE_PREFIX = 'com.victronenergy.system' +HUB4_SERVICE_PREFIX = 'com.victronenergy.hub4' +SETTINGS_SERVICE_PREFIX = 'com.victronenergy.settings' + +UPDATE_PERIOD_MS = 2000 +MAX_POWER_PER_BATTERY = 2500 + +MAX_DAYS_WITHOUT_EOC = 7 +SECONDS_PER_DAY = 24 * 60 * 60 + +GRID_SET_POINT_SETTING = PRODUCT + '/GridSetPoint' +LAST_EOC_SETTING = PRODUCT + '/LastEOC' +CALIBRATION_CHARGE_START_TIME_OF_DAY_SETTING = PRODUCT + '/CalibrationChargeStartTime' + +HEAT_LOSS = 150 # W +P_CONST = 0.5 # W/W + +Epoch = int +Seconds = int + + +def time_now(): + return int(time.time()) + + +class Controller(object): + + def __init__(self, measurement, target, target_type, state): + # type: (float, float, int, int) -> NoReturn + self.target_type = target_type + self.target = target + self.measurement = measurement + self.state = state + + d_p = target - measurement + self.delta = d_p * P_CONST + + @staticmethod + def min(controllers): + # type: (Iterable[Controller]) -> Controller + return min(controllers, key=lambda c: c.delta) + + @staticmethod + def max(controllers): + # type: (Iterable[Controller]) -> Controller + return max(controllers, key=lambda c: c.delta) + + def clamp(self, lower_limit_controllers, upper_limit_controllers): + # type: (List[Controller],List[Controller]) -> Controller + c_min = Controller.min(upper_limit_controllers + [self]) + return Controller.max(lower_limit_controllers + [c_min]) + + +# noinspection PyMethodMayBeStatic +class InnovEnergyController(DBusService): + + def __init__(self): + + super(InnovEnergyController, self).__init__(PRODUCT.lower()) + + self.settings.add_setting(path=LAST_EOC_SETTING, default_value=0) # unix epoch timestamp + self.settings.add_setting(path=GRID_SET_POINT_SETTING, default_value=0) # grid setpoint, Watts + + self.settings.add_setting(path=CALIBRATION_CHARGE_START_TIME_OF_DAY_SETTING, default_value=32400) # 09:00 + + self.own_properties.set('/ProductName', PRODUCT) + self.own_properties.set('/Mgmt/ProcessName', __file__) + self.own_properties.set('/Mgmt/ProcessVersion', VERSION) + self.own_properties.set('/Mgmt/Connection', 'dbus') + self.own_properties.set('/ProductId', PRODUCT) + self.own_properties.set('/FirmwareVersion', VERSION) + self.own_properties.set('/HardwareVersion', VERSION) + self.own_properties.set('/Connected', 1) + self.own_properties.set('/TimeToCalibrationCharge', 'unknown') + self.own_properties.set('/State', 0) + + self.phases = [ + p for p in ['/Hub4/L1/AcPowerSetpoint', '/Hub4/L2/AcPowerSetpoint', '/Hub4/L3/AcPowerSetpoint'] + if self.remote_properties.exists(self.inverter_service + p) + ] + + self.n_phases = len(self.phases) + print ('The system has ' + str(self.n_phases) + ' phase' + ('s' if self.n_phases != 1 else '')) + + self.max_inverter_power = 32700 + # ^ defined in https://github.com/victronenergy/dbus_modbustcp/blob/master/CCGX-Modbus-TCP-register-list.xlsx + + def clamp_power_command(self, value): + # type: (float) -> int + + value = max(value, -self.max_inverter_power) + value = min(value, self.max_inverter_power) + + return int(value) + + def get_service(self, prefix): + # type: (str) -> Optional[unicode] + service = next((s for s in self.available_services if s.startswith(prefix)), None) + + if service is None: + raise Exception('no service matching ' + prefix + '* available') + + return service + + def is_service_available(self, prefix): + # type: (str) -> bool + return next((True for s in self.available_services if s.startswith(prefix)), False) + + @property + def battery_service(self): + # type: () -> Optional[unicode] + return self.get_service(BATTERY_SERVICE_PREFIX) + + @property + def battery_available(self): + # type: () -> bool + return self.is_service_available(BATTERY_SERVICE_PREFIX) + + @property + def grid_service(self): + # type: () -> Optional[unicode] + return self.get_service(GRID_SERVICE_PREFIX) + + @property + def grid_meter_available(self): + # type: () -> bool + return self.is_service_available(GRID_SERVICE_PREFIX) + + @property + def inverter_service(self): + # type: () -> Optional[unicode] + return self.get_service(INVERTER_SERVICE_PREFIX) + + @property + def inverter_available(self): + # type: () -> bool + return self.is_service_available(INVERTER_SERVICE_PREFIX) + + @property + def system_service(self): + # type: () -> Optional[unicode] + return self.get_service(SYSTEM_SERVICE_PREFIX) + + @property + def system_service_available(self): + # type: () -> bool + return self.is_service_available(SYSTEM_SERVICE_PREFIX) + + @property + def hub4_service(self): + # type: () -> Optional[unicode] + return self.get_service(HUB4_SERVICE_PREFIX) + + @property + def hub4_service_available(self): + # type: () -> bool + return self.is_service_available(HUB4_SERVICE_PREFIX) + + @property + def inverter_power_setpoint(self): + # type: () -> float + return sum((self.get_inverter_prop(p) for p in self.phases)) + + def get_battery_prop(self, dbus_path): + # type: (str) -> Any + battery_service = self.battery_service + return self.remote_properties.get(battery_service + dbus_path).value + + def get_grid_prop(self, dbus_path): + # type: (str) -> Any + return self.remote_properties.get(self.grid_service + dbus_path).value + + def get_inverter_prop(self, dbus_path): + # type: (str) -> Any + return self.remote_properties.get(self.inverter_service + dbus_path).value + + def get_system_prop(self, dbus_path): + # type: (str) -> Any + system_service = self.system_service + return self.remote_properties.get(system_service + dbus_path).value + + def get_hub4_prop(self, dbus_path): + # type: (str) -> Any + hub4_service = self.hub4_service + return self.remote_properties.get(hub4_service + dbus_path).value + + def set_settings_prop(self, dbus_path, value): + # type: (str, Any) -> bool + return self.remote_properties.set(SETTINGS_SERVICE_PREFIX + dbus_path, value) + + def set_inverter_prop(self, dbus_path, value): + # type: (str, Any) -> bool + inverter_service = self.inverter_service + return self.remote_properties.set(inverter_service + dbus_path, value) + + @property + def max_battery_charge_power(self): + # type: () -> int + return self.get_battery_prop('/Info/MaxChargePower') + + @property + def max_battery_discharge_power(self): + # type: () -> int + return self.get_battery_prop('/Info/MaxDischargePower') + + @property + def max_configured_charge_power(self): + # type: () -> Optional[int] + max_power = self.settings.get('/Settings/CGwacs/MaxChargePower') + return max_power if max_power >= 0 else None + + @property + def max_configured_discharge_power(self): # unsigned + # type: () -> Optional[int] + max_power = self.settings.get('/Settings/CGwacs/MaxDischargePower') + return max_power if max_power >= 0 else None + + @property + def max_charge_power(self): + # type: () -> int + if self.max_configured_charge_power is None: + return self.max_battery_charge_power + else: + return min(self.max_battery_charge_power, self.max_configured_charge_power) + + @property + def max_discharge_power(self): # unsigned + # type: () -> int + if self.max_configured_discharge_power is None: + return self.max_battery_discharge_power + else: + return min(self.max_battery_discharge_power, self.max_configured_discharge_power) + + def set_inverter_power_setpoint(self, power): + # type: (float) -> NoReturn + + if self.settings.get('/Settings/CGwacs/BatteryLife/State') == 9: + self.settings.set('/Settings/CGwacs/BatteryLife/State', 0) # enables scheduled charge + self.settings.set('/Settings/CGwacs/Hub4Mode', 3) # disable hub4 + self.set_inverter_prop('/Hub4/DisableCharge', 0) + self.set_inverter_prop('/Hub4/DisableFeedIn', 0) + + power = self.clamp_power_command(power / self.n_phases) + for p in self.phases: + self.set_inverter_prop(p, power + randint(-1, 1)) # use randint to force dbus re-send + + def set_controller_state(self, state): + # type: (int) -> NoReturn + self.own_properties.set('/State', state) + + @property + def grid_power(self): + # type: () -> Optional[float] + try: + return self.get_grid_prop('/Ac/Power') + except: + return None + + @property + def battery_cold(self): + # type: () -> bool + return self.get_battery_prop('/IoStatus/BatteryCold') == 1 + + @property + def eoc_reached(self): + # type: () -> bool + if not self.battery_available: + return False + + return min(self.get_battery_prop('/EOCReached')) == 1 + + @property + def battery_power(self): + # type: () -> float + return self.get_battery_prop('/Dc/0/Power') + + @property + def inverter_ac_in_power(self): + # type: () -> float + return self.get_inverter_prop('/Ac/ActiveIn/P') + + @property + def inverter_ac_out_power(self): + # type: () -> float + return self.get_inverter_prop('/Ac/Out/P') + + @property + def soc(self): + # type: () -> float + return self.get_battery_prop('/Soc') + + @property + def n_batteries(self): + # type: () -> int + return self.get_battery_prop('/NbOfBatteries') + + @property + def min_soc(self): + # type: () -> float + return self.settings.get('/Settings/CGwacs/BatteryLife/MinimumSocLimit') + + @property + def should_hold_min_soc(self): + # type: () -> bool + return self.min_soc <= self.soc <= self.min_soc + 5 + + @property + def utc_offset(self): + # type: () -> int + + # stackoverflow.com/a/1301528 + # stackoverflow.com/a/3168394 + + os.environ['TZ'] = self.settings.get('/Settings/System/TimeZone') + time.tzset() + is_dst = time.daylight and time.localtime().tm_isdst > 0 + return -(time.altzone if is_dst else time.timezone) + + @property + def grid_set_point(self): + # type: () -> float + return self.settings.get('/Settings/CGwacs/AcPowerSetPoint') + + @property + def time_to_calibration_charge_str(self): + # type: () -> str + return self.own_properties.get('/TimeToCalibrationCharge').text + + @property + def calibration_charge_deadline(self): + # type: () -> Epoch + + utc_offset = self.utc_offset + ultimate_deadline = self.settings.get(LAST_EOC_SETTING) + MAX_DAYS_WITHOUT_EOC * SECONDS_PER_DAY + midnight_before_udl = int((ultimate_deadline + utc_offset) / SECONDS_PER_DAY) * SECONDS_PER_DAY - utc_offset # round off to last midnight + + dead_line = midnight_before_udl + self.calibration_charge_start_time_of_day + + while dead_line > ultimate_deadline: # should fire at most once, but let's be defensive... + dead_line -= SECONDS_PER_DAY # too late, advance one day + + return dead_line + + @property + def time_to_calibration_charge(self): + # type: () -> Seconds + return self.calibration_charge_deadline - time_now() + + @property + def grid_blackout(self): + # type: () -> bool + return self.get_inverter_prop('/Leds/Mains') < 1 + + @property + def scheduled_charge(self): + # type: () -> bool + return self.get_hub4_prop('/Overrides/ForceCharge') != 0 + + @property + def calibration_charge_start_time_of_day(self): + # type: () -> Seconds + return self.settings.get(CALIBRATION_CHARGE_START_TIME_OF_DAY_SETTING) # seconds since midnight + + @property + def must_do_calibration_charge(self): + # type: () -> bool + return self.time_to_calibration_charge <= 0 + + def controller_charge_to_min_soc(self): + # type: () -> Controller + + return Controller( + measurement=self.battery_power, + target=self.max_charge_power, + target_type=TargetType.BATTERY_DC, + state=State.CHARGE_TO_MIN_SOC + ) + + def controller_hold_min_soc(self): + # type: () -> Controller + + # TODO: explain + + a = -4 * HEAT_LOSS * self.n_batteries + b = -a * (self.min_soc + .5) + + target_dc_power = a * self.soc + b + + return Controller( + measurement = self.battery_power, + target = target_dc_power, + target_type = TargetType.BATTERY_DC, + state = State.HOLD_MIN_SOC + ) + + def controller_calibration_charge(self): + # type: () -> Controller + + return Controller( + measurement = self.battery_power, + target = self.max_charge_power, + target_type = TargetType.BATTERY_DC, + state = State.CALIBRATION_CHARGE + ) + + def controller_limit_discharge_power(self): # signed + # type: () -> Controller + + return Controller( + measurement = self.battery_power, + target = -self.max_discharge_power, # add sign! + target_type = TargetType.BATTERY_DC, + state = State.LIMIT_DISCHARGE_POWER + ) + + def controller_limit_charge_power(self): + # type: () -> Controller + return Controller( + measurement = self.battery_power, + target = self.max_charge_power, + target_type = TargetType.BATTERY_DC, + state = State.LIMIT_CHARGE_POWER + ) + + def controller_optimize_self_consumption(self): + # type: () -> Controller + + return Controller( + measurement = self.grid_power, + target = self.grid_set_point, + target_type = TargetType.GRID_AC, + state = State.OPTIMIZE_SELF_CONSUMPTION + ) + + def controller_heating(self): + # type: () -> Controller + + return Controller( + measurement = self.battery_power, + target = self.max_charge_power, + target_type = TargetType.BATTERY_DC, + state = State.HEATING + ) + + def controller_scheduled_charge(self): + # type: () -> Controller + + return Controller( + measurement = self.battery_power, + target = self.max_charge_power, + target_type = TargetType.BATTERY_DC, + state = State.SCHEDULED_CHARGE + ) + + def controller_no_grid_meter(self): + # type: () -> Controller + + return Controller( + measurement = self.battery_power, + target = self.max_charge_power, + target_type = TargetType.BATTERY_DC, + state = State.NO_GRID_METER_AVAILABLE + ) + + def controller_no_battery(self): + # type: () -> Controller + + return Controller( + measurement = self.inverter_ac_in_power, + target = 0, + target_type = TargetType.INVERTER_AC_IN, + state = State.NO_BATTERY_AVAILABLE + ) + + def controller_bridge_grid_blackout(self): + # type: () -> Controller + + return Controller( + measurement = 0, + target = 0, + target_type = TargetType.GRID_AC, + state = State.BRIDGE_GRID_BLACKOUT + ) + + def update_eoc(self): + + if self.eoc_reached: + print('battery has reached EOC') + self.settings.set(LAST_EOC_SETTING, time_now()) + + self.publish_time_to_calibration_charge() + + def publish_time_to_calibration_charge(self): + + total_seconds = self.time_to_calibration_charge + + if total_seconds <= 0: + time_to_eoc_str = 'now' + else: + total_minutes, seconds = divmod(total_seconds, 60) + total_hours, minutes = divmod(total_minutes, 60) + total_days, hours = divmod(total_hours, 24) + + days_str = (str(total_days) + 'd') if total_days > 0 else '' + hours_str = (str(hours) + 'h') if total_hours > 0 else '' + minutes_str = (str(minutes) + 'm') if total_days == 0 else '' + + time_to_eoc_str = "{0} {1} {2}".format(days_str, hours_str, minutes_str).strip() + + self.own_properties.set('/TimeToCalibrationCharge', time_to_eoc_str) + + def print_system_stats(self, controller): + # type: (Controller) -> NoReturn + + def soc_setpoint(): + if controller.state == State.CALIBRATION_CHARGE or controller.state == State.NO_GRID_METER_AVAILABLE: + return ' => 100%' + if controller.state == State.CHARGE_TO_MIN_SOC: + return ' => ' + str(int(self.min_soc)) + '%' + return '' + + def setpoint(target_type): + if target_type != controller.target_type: + return '' + return ' => ' + str(int(controller.target)) + 'W' + + def p(power): + # type: (Optional[float]) -> str + if power is None: + return ' --- W' + else: + return str(int(power)) + 'W' + + ac_loads = None if self.grid_power is None else self.grid_power - self.inverter_ac_in_power + delta = p(controller.delta) if controller.delta < 0 else '+' + p(controller.delta) + battery_power = self.battery_power if self.battery_available else None + soc_ = str(self.soc) + '%' if self.battery_available else '---' + + print (State.name_of[controller.state]) + print ('') + print ('time to CC: ' + self.time_to_calibration_charge_str) + print (' SOC: ' + soc_ + soc_setpoint()) + print (' grid: ' + p(self.grid_power) + setpoint(TargetType.GRID_AC)) + print (' battery: ' + p(battery_power) + setpoint(TargetType.BATTERY_DC)) + print (' AC in: ' + p(self.inverter_ac_in_power) + ' ' + delta) + print (' AC out: ' + p(self.inverter_ac_out_power)) + print (' AC loads: ' + p(ac_loads)) + + def choose_controller(self): + # type: () -> Controller + + if self.grid_blackout: + return self.controller_bridge_grid_blackout() + + if not self.battery_available: + return self.controller_no_battery() + + if self.battery_cold: + return self.controller_heating() + + if self.scheduled_charge: + return self.controller_scheduled_charge() + + if self.must_do_calibration_charge: + return self.controller_calibration_charge() + + if self.soc < self.min_soc: + return self.controller_charge_to_min_soc() + + if not self.grid_meter_available: + return self.controller_no_grid_meter() + + hold_min_soc = self.controller_hold_min_soc() + limit_discharge_power = self.controller_limit_discharge_power() # signed + + lower_limit = [limit_discharge_power, hold_min_soc] + + # No upper limit. We no longer actively limit charge power. DC/DC Charger inside the BMS will do that for us. + upper_limit = [] + + optimize_self_consumption = self.controller_optimize_self_consumption() + + return optimize_self_consumption.clamp(lower_limit, upper_limit) + + def update(self): + + print('iteration started\n') + + self.update_eoc() + + if self.inverter_available: + + controller = self.choose_controller() + power = self.inverter_ac_in_power + controller.delta + + self.set_inverter_power_setpoint(power) + self.set_controller_state(controller.state) + self.print_system_stats(controller) # for debug + + else: + self.set_controller_state(State.NO_INVERTER_AVAILABLE) + print('inverter not available!') + + print('\niteration finished\n') + + +def main(): + + print('starting ' + __file__) + + with InnovEnergyController() as service: + run_on_main_loop(service.update, UPDATE_PERIOD_MS) + + print(__file__ + ' has shut down') + + +if __name__ == '__main__': + main() diff --git a/python/dbus-fz-sonick-48tl-with-s3/convert.py b/python/dbus-fz-sonick-48tl-with-s3/convert.py new file mode 100755 index 000000000..7138d856a --- /dev/null +++ b/python/dbus-fz-sonick-48tl-with-s3/convert.py @@ -0,0 +1,192 @@ +import struct + +import config as cfg +from data import LedState, BatteryStatus + +# trick the pycharm type-checker into thinking Callable is in scope, not used at runtime +# noinspection PyUnreachableCode +if False: + from typing import Callable, List, Iterable, Union, AnyStr, Any + + +def read_bool(base_register, bit): + # type: (int, int) -> Callable[[BatteryStatus], bool] + + # TODO: explain base register offset + register = base_register + int(bit/16) + bit = bit % 16 + + def get_value(status): + # type: (BatteryStatus) -> bool + value = status.modbus_data[register - cfg.BASE_ADDRESS] + return value & (1 << bit) > 0 + + return get_value + + +def read_float(register, scale_factor=1.0, offset=0.0): + # type: (int, float, float) -> Callable[[BatteryStatus], float] + + def get_value(status): + # type: (BatteryStatus) -> float + value = status.modbus_data[register - cfg.BASE_ADDRESS] + + if value >= 0x8000: # convert to signed int16 + value -= 0x10000 # fiamm stores their integers signed AND with sign-offset @#%^&! + + return (value + offset) * scale_factor + + return get_value + + +def read_registers(register, count): + # type: (int, int) -> Callable[[BatteryStatus], List[int]] + + start = register - cfg.BASE_ADDRESS + end = start + count + + def get_value(status): + # type: (BatteryStatus) -> List[int] + return [x for x in status.modbus_data[start:end]] + + return get_value + + +def comma_separated(values): + # type: (Iterable[str]) -> str + return ", ".join(set(values)) + + +def count_bits(base_register, nb_of_registers, nb_of_bits, first_bit=0): + # type: (int, int, int, int) -> Callable[[BatteryStatus], int] + + get_registers = read_registers(base_register, nb_of_registers) + end_bit = first_bit + nb_of_bits + + def get_value(status): + # type: (BatteryStatus) -> int + + registers = get_registers(status) + bin_registers = [bin(x)[-1:1:-1] for x in registers] # reverse the bits in each register so that bit0 is to the left + str_registers = [str(x).ljust(16, "0") for x in bin_registers] # add leading zeroes, so all registers are 16 chars long + bit_string = ''.join(str_registers) # join them, one long string of 0s and 1s + filtered_bits = bit_string[first_bit:end_bit] # take the first nb_of_bits bits starting at first_bit + + return filtered_bits.count('1') # count 1s + + return get_value + + +def read_led_state(register, led): + # type: (int, int) -> Callable[[BatteryStatus], int] + + read_lo = read_bool(register, led * 2) + read_hi = read_bool(register, led * 2 + 1) + + def get_value(status): + # type: (BatteryStatus) -> int + + lo = read_lo(status) + hi = read_hi(status) + + if hi: + if lo: + return LedState.blinking_fast + else: + return LedState.blinking_slow + else: + if lo: + return LedState.on + else: + return LedState.off + + return get_value + + +# noinspection PyShadowingNames +def unit(unit): + # type: (unicode) -> Callable[[unicode], unicode] + + def get_text(v): + # type: (unicode) -> unicode + return "{0}{1}".format(str(v), unit) + + return get_text + + +def const(constant): + # type: (any) -> Callable[[any], any] + def get(*args): + return constant + return get + + +def mean(numbers): + # type: (List[Union[float,int]]) -> float + return float(sum(numbers)) / len(numbers) + + +def first(ts, default=None): + return next((t for t in ts), default) + + +def bitfields_to_str(lists): + # type: (List[List[int]]) -> str + + def or_lists(): + # type: () -> Iterable[int] + + length = len(first(lists)) + n_lists = len(lists) + + for i in range(0, length): + e = 0 + for l in range(0, n_lists): + e = e | lists[l][i] + yield e + + hexed = [ + '{0:0>4X}'.format(x) + for x in or_lists() + ] + + return ' '.join(hexed) + + +def pack_string(string): + # type: (AnyStr) -> Any + data = string.encode('UTF-8') + return struct.pack('B', len(data)) + data + + +def read_bitmap(register): + # type: (int) -> Callable[[BatteryStatus], int] + + def get_value(status): + # type: (BatteryStatus) -> int + value = status.modbus_data[register - cfg.BASE_ADDRESS] + return value + + return get_value + +def return_in_list(ts): + return ts + +def first(ts): + return next(t for t in ts) + +def read_hex_string(register, count): + # type: (int, int) -> Callable[[BatteryStatus], str] + """ + reads count consecutive modbus registers from start_address, + and returns a hex representation of it: + e.g. for count=4: DEAD BEEF DEAD BEEF. + """ + start = register - cfg.BASE_ADDRESS + end = start + count + + def get_value(status): + # type: (BatteryStatus) -> str + return ' '.join(['{0:0>4X}'.format(x) for x in status.modbus_data[start:end]]) + + return get_value diff --git a/python/dbus-fz-sonick-48tl-with-s3/data.py b/python/dbus-fz-sonick-48tl-with-s3/data.py new file mode 100755 index 000000000..9bff4ff93 --- /dev/null +++ b/python/dbus-fz-sonick-48tl-with-s3/data.py @@ -0,0 +1,134 @@ +import config as cfg + + +# trick the pycharm type-checker into thinking Callable is in scope, not used at runtime +# noinspection PyUnreachableCode +if False: + from typing import Callable, List, Optional, AnyStr, Union, Any + + +class LedState(object): + """ + from page 6 of the '48TLxxx ModBus Protocol doc' + """ + off = 0 + on = 1 + blinking_slow = 2 + blinking_fast = 3 + + +class LedColor(object): + green = 0 + amber = 1 + blue = 2 + red = 3 + + +class ServiceSignal(object): + + def __init__(self, dbus_path, get_value_or_const, unit=''): + # type: (str, Union[Callable[[],Any],Any], Optional[AnyStr] )->None + + self.get_value_or_const = get_value_or_const + self.dbus_path = dbus_path + self.unit = unit + + @property + def value(self): + try: + return self.get_value_or_const() # callable + except: + return self.get_value_or_const # value + + +class BatterySignal(object): + + def __init__(self, dbus_path, aggregate, get_value, unit=''): + # type: (str, Callable[[List[any]],any], Callable[[BatteryStatus],any], Optional[AnyStr] )->None + """ + A Signal holds all information necessary for the handling of a + certain datum (e.g. voltage) published by the battery. + + :param dbus_path: str + object_path on DBus where the datum needs to be published + + :param aggregate: Iterable[any] -> any + function that combines the values of multiple batteries into one. + e.g. sum for currents, or mean for voltages + + :param get_value: (BatteryStatus) -> any + function to extract the datum from the modbus record, + """ + + self.dbus_path = dbus_path + self.aggregate = aggregate + self.get_value = get_value + self.unit = unit + + +class Battery(object): + + """ Data record to hold hardware and firmware specs of the battery """ + + def __init__(self, slave_address, hardware_version, firmware_version, bms_version, ampere_hours): + # type: (int, str, str, str, int) -> None + self.slave_address = slave_address + self.hardware_version = hardware_version + self.firmware_version = firmware_version + self.bms_version = bms_version + self.ampere_hours = ampere_hours + self.n_strings = int(ampere_hours/cfg.AH_PER_STRING) + self.i_max = self.n_strings * cfg.I_MAX_PER_STRING + self.v_min = cfg.V_MIN + self.v_max = cfg.V_MAX + self.r_int_min = cfg.R_STRING_MIN / self.n_strings + self.r_int_max = cfg.R_STRING_MAX / self.n_strings + + def __str__(self): + return 'slave address = {0}\nhardware version = {1}\nfirmware version = {2}\nbms version = {3}\nampere hours = {4}'.format( + self.slave_address, self.hardware_version, self.firmware_version, self.bms_version, str(self.ampere_hours)) + + +class BatteryStatus(object): + """ + record holding the current status of a battery + """ + def __init__(self, battery, modbus_data): + # type: (Battery, List[int]) -> None + + self.battery = battery + self.modbus_data = modbus_data + + def serialize(self): + # type: () -> str + + b = self.battery + + s = cfg.INNOVENERGY_PROTOCOL_VERSION + '\n' + s += cfg.INSTALLATION_NAME + '\n' + s += str(b.slave_address) + '\n' + s += b.hardware_version + '\n' + s += b.firmware_version + '\n' + s += b.bms_version + '\n' + s += str(b.ampere_hours) + '\n' + + for d in self.modbus_data: + s += str(d) + '\n' + + return s + + +def read_file_one_line(file_name): + + with open(file_name, 'r') as file: + return file.read().replace('\n', '').replace('\r', '').strip() + + +class CsvSignal(object): + def __init__(self, name, get_value, get_text=None): + self.name = name + self.get_value = get_value if callable(get_value) else lambda _: get_value + self.get_text = get_text + + if get_text is None: + self.get_text = "" diff --git a/python/dbus-fz-sonick-48tl-with-s3/dbus-fzsonick-48tl.py b/python/dbus-fz-sonick-48tl-with-s3/dbus-fzsonick-48tl.py new file mode 100755 index 000000000..87a64c631 --- /dev/null +++ b/python/dbus-fz-sonick-48tl-with-s3/dbus-fzsonick-48tl.py @@ -0,0 +1,674 @@ +#!/usr/bin/python2 -u +# coding=utf-8 + +import logging +import re +import socket +import sys +import gobject +import signals +import config as cfg + +from dbus.mainloop.glib import DBusGMainLoop +from pymodbus.client.sync import ModbusSerialClient as Modbus +from pymodbus.exceptions import ModbusException, ModbusIOException +from pymodbus.other_message import ReportSlaveIdRequest +from pymodbus.pdu import ExceptionResponse +from pymodbus.register_read_message import ReadInputRegistersResponse +from data import BatteryStatus, BatterySignal, Battery, ServiceSignal +from python_libs.ie_dbus.dbus_service import DBusService + +import time +import os +import csv +import pika +import zipfile +import hashlib +import base64 +import hmac +import requests +from datetime import datetime +import io +import json +from convert import first +CSV_DIR = "/data/csv_files/" +INSTALLATION_NAME_FILE = '/data/innovenergy/openvpn/installation-name' + +# trick the pycharm type-checker into thinking Callable is in scope, not used at runtime +# noinspection PyUnreachableCode +if False: + from typing import Callable, List, Iterable, NoReturn + + +RESET_REGISTER = 0x2087 + + +def compress_csv_data(csv_data, file_name="data.csv"): + memory_stream = io.BytesIO() + + # Create a zip archive in the memory buffer + with zipfile.ZipFile(memory_stream, 'w', zipfile.ZIP_DEFLATED) as archive: + # Add CSV data to the ZIP archive using writestr + archive.writestr(file_name, csv_data.encode('utf-8')) + + # Get the compressed byte array from the memory buffer + compressed_bytes = memory_stream.getvalue() + + # Encode the compressed byte array as a Base64 string + base64_string = base64.b64encode(compressed_bytes).decode('utf-8') + + return base64_string + +class S3config: + def __init__(self): + self.bucket = cfg.S3BUCKET + self.region = "sos-ch-dk-2" + self.provider = "exo.io" + self.key = cfg.S3KEY + self.secret = cfg.S3SECRET + self.content_type = "application/base64; charset=utf-8" + + @property + def host(self): + return "{}.{}.{}".format(self.bucket, self.region, self.provider) + + @property + def url(self): + return "https://{}".format(self.host) + + def create_put_request(self, s3_path, data): + headers = self._create_request("PUT", s3_path) + url = "{}/{}".format(self.url, s3_path) + response = requests.put(url, headers=headers, data=data) + return response + + def _create_request(self, method, s3_path): + date = datetime.utcnow().strftime('%a, %d %b %Y %H:%M:%S GMT') + auth = self._create_authorization(method, self.bucket, s3_path, date, self.key, self.secret, self.content_type) + headers = { + "Host": self.host, + "Date": date, + "Authorization": auth, + "Content-Type": self.content_type + } + return headers + + @staticmethod + def _create_authorization(method, bucket, s3_path, date, s3_key, s3_secret, content_type="", md5_hash=""): + payload = "{}\n{}\n{}\n{}\n/{}/{}".format( + method, md5_hash, content_type, date, bucket.strip('/'), s3_path.strip('/') + ) + signature = base64.b64encode( + hmac.new(s3_secret.encode(), payload.encode(), hashlib.sha1).digest() + ).decode() + return "AWS {}:{}".format(s3_key, signature) + + +def SubscribeToQueue(): + try: + connection = pika.BlockingConnection(pika.ConnectionParameters(host="10.2.0.11", + port=5672, + virtual_host="/", + credentials=pika.PlainCredentials("producer", "b187ceaddb54d5485063ddc1d41af66f"))) + channel = connection.channel() + channel.queue_declare(queue="statusQueue", durable=True) + print("Subscribed to queue") + except Exception as ex: + print("An error occurred while connecting to the RabbitMQ queue:", ex) + return channel + + +previous_warnings = {} +previous_alarms = {} + +class MessageType: + ALARM_OR_WARNING = "AlarmOrWarning" + HEARTBEAT = "Heartbeat" + +class AlarmOrWarning: + def __init__(self, description, created_by): + self.date = datetime.now().strftime('%Y-%m-%d') + self.time = datetime.now().strftime('%H:%M:%S') + self.description = description + self.created_by = created_by + + def to_dict(self): + return { + "Date": self.date, + "Time": self.time, + "Description": self.description, + "CreatedBy": self.created_by + } + +channel = SubscribeToQueue() +# Create an S3config instance +s3_config = S3config() +INSTALLATION_ID=int(s3_config.bucket.split('-')[0]) +PRODUCT_ID = 1 +is_first_update = True +prev_status = 0 +subscribed_to_queue_first_time = False +heartbit_interval = 0 + +def update_state_from_dictionaries(current_warnings, current_alarms, node_numbers): + global previous_warnings, previous_alarms, INSTALLATION_ID, PRODUCT_ID, is_first_update, channel, prev_status, heartbit_interval, subscribed_to_queue_first_time + + heartbit_interval += 1 + + if is_first_update: + changed_warnings = current_warnings + changed_alarms = current_alarms + is_first_update = False + else: + changed_alarms = {} + changed_warnings = {} + # calculate the diff in warnings and alarms + prev_alarm_value_list = list(previous_alarms.values()) + alarm_keys = list(previous_alarms.keys()) + + for i, alarm in enumerate(current_alarms.values()): + if alarm != prev_alarm_value_list[i]: + changed_alarms[alarm_keys[i]] = True + else: + changed_alarms[alarm_keys[i]] = False + + prev_warning_value_list=list(previous_warnings.values()) + warning_keys=list(previous_warnings.keys()) + + for i, warning in enumerate(current_warnings.values()): + if warning!=prev_warning_value_list[i]: + changed_warnings[warning_keys[i]]=True + else: + changed_warnings[warning_keys[i]]=False + + status_message = { + "InstallationId": INSTALLATION_ID, + "Product": PRODUCT_ID, + "Status": 0, + "Type": 1, + "Warnings": [], + "Alarms": [] + } + + 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) + + warnings_number_list = [] + for node_number in node_numbers: + cnt = 0 + for warning_value in current_warnings.values(): + 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()) + + 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()) + + if any(current_alarms.values()): + status_message["Status"]=2 + + if not any(current_alarms.values()) and any(current_warnings.values()): + status_message["Status"]=1 + + if not any(current_alarms.values()) and not any(current_warnings.values()): + status_message["Status"]=0 + + if status_message["Status"]!=prev_status or len(status_message["Warnings"])>0 or len(status_message["Alarms"])>0: + prev_status=status_message["Status"] + status_message["Type"]=0 + status_message = json.dumps(status_message) + channel.basic_publish(exchange="", routing_key="statusQueue", body=status_message) + print(status_message) + print("Message sent successfully") + elif heartbit_interval>=15 or not subscribed_to_queue_first_time: + print("Send heartbit message to rabbitmq") + heartbit_interval=0 + subscribed_to_queue_first_time=True + status_message = json.dumps(status_message) + channel.basic_publish(exchange="", routing_key="statusQueue", body=status_message) + + previous_warnings = current_warnings.copy() + previous_alarms = current_alarms.copy() + + return status_message, alarms_number_list, warnings_number_list + +def read_csv_as_string(file_path): + """ + Reads a CSV file from the given path and returns its content as a single string. + """ + try: + # Note: 'encoding' is not available in open() in Python 2.7, so we'll use 'codecs' module. + import codecs + with codecs.open(file_path, 'r', encoding='utf-8') as file: + return file.read() + except IOError as e: + if e.errno == 2: # errno 2 corresponds to "No such file or directory" + print("Error: The file {} does not exist.".format(file_path)) + else: + print("IO error occurred: {}".format(str(e))) + return None + + + +def init_modbus(tty): + # type: (str) -> Modbus + + logging.debug('initializing Modbus') + + return Modbus( + port='/dev/' + tty, + method=cfg.MODE, + baudrate=cfg.BAUD_RATE, + stopbits=cfg.STOP_BITS, + bytesize=cfg.BYTE_SIZE, + timeout=cfg.TIMEOUT, + parity=cfg.PARITY) + + +def init_udp_socket(): + # type: () -> socket + + s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + s.setblocking(False) + + return s + + +def report_slave_id(modbus, slave_address): + # type: (Modbus, int) -> str + + slave = str(slave_address) + + logging.debug('requesting slave id from node ' + slave) + + with modbus: + + request = ReportSlaveIdRequest(unit=slave_address) + response = modbus.execute(request) + + if response is ExceptionResponse or issubclass(type(response), ModbusException): + raise Exception('failed to get slave id from ' + slave + ' : ' + str(response)) + + return response.identifier + + +def identify_battery(modbus, slave_address): + # type: (Modbus, int) -> Battery + + logging.info('identifying battery...') + + hardware_version, bms_version, ampere_hours = parse_slave_id(modbus, slave_address) + firmware_version = read_firmware_version(modbus, slave_address) + + specs = Battery( + slave_address=slave_address, + hardware_version=hardware_version, + firmware_version=firmware_version, + bms_version=bms_version, + ampere_hours=ampere_hours) + + logging.info('battery identified:\n{0}'.format(str(specs))) + + return specs + + +def identify_batteries(modbus): + # type: (Modbus) -> List[Battery] + + def _identify_batteries(): + slave_address = 0 + n_missing = -255 + + while n_missing < 3: + slave_address += 1 + try: + yield identify_battery(modbus, slave_address) + n_missing = 0 + except Exception as e: + logging.info('failed to identify battery at {0} : {1}'.format(str(slave_address), str(e))) + n_missing += 1 + + logging.info('giving up searching for further batteries') + + batteries = list(_identify_batteries()) # dont be lazy! + + n = len(batteries) + logging.info('found ' + str(n) + (' battery' if n == 1 else ' batteries')) + + return batteries + + +def parse_slave_id(modbus, slave_address): + # type: (Modbus, int) -> (str, str, int) + + slave_id = report_slave_id(modbus, slave_address) + + sid = re.sub(r'[^\x20-\x7E]', '', slave_id) # remove weird special chars + + match = re.match('(?P48TL(?P[0-9]+)) *(?P.*)', sid) + + if match is None: + raise Exception('no known battery found') + + return match.group('hw').strip(), match.group('bms').strip(), int(match.group('ah').strip()) + + +def read_firmware_version(modbus, slave_address): + # type: (Modbus, int) -> str + + logging.debug('reading firmware version') + + with modbus: + + response = read_modbus_registers(modbus, slave_address, base_address=1054, count=1) + register = response.registers[0] + + return '{0:0>4X}'.format(register) + + +def read_modbus_registers(modbus, slave_address, base_address=cfg.BASE_ADDRESS, count=cfg.NO_OF_REGISTERS): + # type: (Modbus, int, int, int) -> ReadInputRegistersResponse + + logging.debug('requesting modbus registers {0}-{1}'.format(base_address, base_address + count)) + + return modbus.read_input_registers( + address=base_address, + count=count, + unit=slave_address) + + +def read_battery_status(modbus, battery): + # type: (Modbus, Battery) -> BatteryStatus + """ + Read the modbus registers containing the battery's status info. + """ + + logging.debug('reading battery status') + + with modbus: + data = read_modbus_registers(modbus, battery.slave_address) + return BatteryStatus(battery, data.registers) + + +def publish_values_on_dbus(service, battery_signals, battery_statuses): + # type: (DBusService, Iterable[BatterySignal], Iterable[BatteryStatus]) -> () + + publish_individuals(service, battery_signals, battery_statuses) + publish_aggregates(service, battery_signals, battery_statuses) + + +def publish_aggregates(service, signals, battery_statuses): + # type: (DBusService, Iterable[BatterySignal], Iterable[BatteryStatus]) -> () + + for s in signals: + if s.aggregate is None: + continue + values = [s.get_value(battery_status) for battery_status in battery_statuses] + value = s.aggregate(values) + service.own_properties.set(s.dbus_path, value, s.unit) + + +def publish_individuals(service, signals, battery_statuses): + # type: (DBusService, Iterable[BatterySignal], Iterable[BatteryStatus]) -> () + + for signal in signals: + for battery_status in battery_statuses: + address = battery_status.battery.slave_address + dbus_path = '/_Battery/' + str(address) + signal.dbus_path + value = signal.get_value(battery_status) + service.own_properties.set(dbus_path, value, signal.unit) + + +def publish_service_signals(service, signals): + # type: (DBusService, Iterable[ServiceSignal]) -> NoReturn + + for signal in signals: + service.own_properties.set(signal.dbus_path, signal.value, signal.unit) + + +def upload_status_to_innovenergy(sock, statuses): + # type: (socket, Iterable[BatteryStatus]) -> bool + + logging.debug('upload status') + + try: + for s in statuses: + sock.sendto(s.serialize(), (cfg.INNOVENERGY_SERVER_IP, cfg.INNOVENERGY_SERVER_PORT)) + except: + logging.debug('FAILED') + return False + else: + return True + + +def print_usage(): + print ('Usage: ' + __file__ + ' ') + print ('Example: ' + __file__ + ' ttyUSB0') + + +def parse_cmdline_args(argv): + # type: (List[str]) -> str + + if len(argv) == 0: + logging.info('missing command line argument for tty device') + print_usage() + sys.exit(1) + + return argv[0] + + +def reset_batteries(modbus, batteries): + # type: (Modbus, Iterable[Battery]) -> NoReturn + + logging.info('Resetting batteries...') + + for battery in batteries: + + result = modbus.write_registers(RESET_REGISTER, [1], unit=battery.slave_address) + + # expecting a ModbusIOException (timeout) + # BMS can no longer reply because it is already reset + success = isinstance(result, ModbusIOException) + + outcome = 'successfully' if success else 'FAILED to' + logging.info('Battery {0} {1} reset'.format(str(battery.slave_address), outcome)) + + logging.info('Shutting down fz-sonick driver') + exit(0) + + +alive = True # global alive flag, watchdog_task clears it, update_task sets it + + +def create_update_task(modbus, service, batteries): + # type: (Modbus, DBusService, Iterable[Battery]) -> Callable[[],bool] + """ + Creates an update task which runs the main update function + and resets the alive flag + """ + _socket = init_udp_socket() + _signals = signals.init_battery_signals() + + csv_signals = signals.create_csv_signals(first(batteries).firmware_version) + node_numbers = [battery.slave_address for battery in batteries] + warnings_signals, alarm_signals = signals.read_warning_and_alarm_flags() + current_warnings = {} + current_alarms = {} + + def update_task(): + # type: () -> bool + + global alive + + logging.debug('starting update cycle') + + if service.own_properties.get('/ResetBatteries').value == 1: + reset_batteries(modbus, batteries) + + statuses = [read_battery_status(modbus, battery) for battery in 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) + value = s.get_value(statuses[i]) + current_warnings[signal_name] = value + for s in alarm_signals: + signal_name = insert_id(s.name, i+1) + value = s.get_value(statuses[i]) + current_alarms[signal_name] = value + + status_message, alarms_number_list, warnings_number_list = update_state_from_dictionaries(current_warnings, current_alarms, node_numbers) + + publish_values_on_dbus(service, _signals, statuses) + + create_csv_files(csv_signals, statuses, node_numbers, alarms_number_list, warnings_number_list) + + upload_status_to_innovenergy(_socket, statuses) + + logging.debug('finished update cycle\n') + + alive = True + + return True + + return update_task + +def manage_csv_files(directory_path, max_files=20): + csv_files = [f for f in os.listdir(directory_path)] + 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: + file_to_delete = os.path.join(directory_path, csv_files.pop(0)) + os.remove(file_to_delete) +def insert_id(path, id_number): + parts = path.split("/") + insert_position = parts.index("Devices") + 1 + parts.insert(insert_position, str(id_number)) + return "/".join(parts) + +def create_csv_files(signals, statuses, node_numbers, alarms_number_list, warnings_number_list): + timestamp = int(time.time()) + if timestamp % 2 != 0: + timestamp-=1 + if not os.path.exists(CSV_DIR): + os.makedirs(CSV_DIR) + csv_filename = "{}.csv".format(timestamp) + csv_path = os.path.join(CSV_DIR, csv_filename) + + with open(csv_path, 'ab') as csvfile: + csv_writer = csv.writer(csvfile, delimiter=';') + nodes_config_path = "/Config/Devices/BatteryNodes" + nodes_list = ",".join(str(node) for node in node_numbers) + config_row = [nodes_config_path, nodes_list, ""] + csv_writer.writerow(config_row) + for i, node in enumerate(node_numbers): + csv_writer.writerow(["/Battery/Devices/{}/Alarms".format(str(i+1)), alarms_number_list[i], ""]) + csv_writer.writerow(["/Battery/Devices/{}/Warnings".format(str(i+1)), warnings_number_list[i], ""]) + for s in signals: + signal_name = insert_id(s.name, i+1) + value = s.get_value(statuses[i]) + row_values = [signal_name, value, s.get_text] + csv_writer.writerow(row_values) + + csv_data = read_csv_as_string(csv_path) + + if csv_data is None: + print("error while reading csv as string") + return + + # zip-comp additions + compressed_csv = compress_csv_data(csv_data) + compressed_filename = "{}.csv".format(timestamp) + + response = s3_config.create_put_request(compressed_filename, compressed_csv) + if response.status_code == 200: + #os.remove(csv_path) + print("Success") + else: + failed_dir = os.path.join(CSV_DIR, "failed") + if not os.path.exists(failed_dir): + os.makedirs(failed_dir) + failed_path = os.path.join(failed_dir, csv_filename) + os.rename(csv_path, failed_path) + print("Uploading failed") + manage_csv_files(failed_dir, 10) + + manage_csv_files(CSV_DIR) + + +def create_watchdog_task(main_loop): + # type: (DBusGMainLoop) -> Callable[[],bool] + """ + Creates a Watchdog task that monitors the alive flag. + The watchdog kills the main loop if the alive flag is not periodically reset by the update task. + Who watches the watchdog? + """ + def watchdog_task(): + # type: () -> bool + + global alive + + if alive: + logging.debug('watchdog_task: update_task is alive') + alive = False + return True + else: + logging.info('watchdog_task: killing main loop because update_task is no longer alive') + main_loop.quit() + return False + + return watchdog_task + + +def main(argv): + # type: (List[str]) -> () + print("INSIDE DBUS SONICK") + logging.basicConfig(level=cfg.LOG_LEVEL) + logging.info('starting ' + __file__) + + tty = parse_cmdline_args(argv) + modbus = init_modbus(tty) + + batteries = identify_batteries(modbus) + + if len(batteries) <= 0: + sys.exit(2) + + service = DBusService(service_name=cfg.SERVICE_NAME_PREFIX + tty) + + service.own_properties.set('/ResetBatteries', value=False, writable=True) # initial value = False + + main_loop = gobject.MainLoop() + + service_signals = signals.init_service_signals(batteries) + publish_service_signals(service, service_signals) + + update_task = create_update_task(modbus, service, batteries) + update_task() # run it right away, so that all props are initialized before anyone can ask + watchdog_task = create_watchdog_task(main_loop) + + gobject.timeout_add(cfg.UPDATE_INTERVAL * 2, watchdog_task, priority = gobject.PRIORITY_LOW) # add watchdog first + gobject.timeout_add(cfg.UPDATE_INTERVAL, update_task, priority = gobject.PRIORITY_LOW) # call update once every update_interval + + logging.info('starting gobject.MainLoop') + main_loop.run() + logging.info('gobject.MainLoop was shut down') + + sys.exit(0xFF) # reaches this only on error + + +main(sys.argv[1:]) diff --git a/python/dbus-fz-sonick-48tl-with-s3/dbus_types.py b/python/dbus-fz-sonick-48tl-with-s3/dbus_types.py new file mode 100644 index 000000000..a5fcc6e8a --- /dev/null +++ b/python/dbus-fz-sonick-48tl-with-s3/dbus_types.py @@ -0,0 +1,156 @@ +from logging import getLogger + +import dbus + + +_log = getLogger(__name__) + +# noinspection PyUnreachableCode +if False: + from typing import Any, Union, Dict + DbusString = Union[dbus.String, dbus.UTF8String, dbus.ObjectPath, dbus.Signature] + DbusInt = Union[dbus.Int16, dbus.Int32, dbus.Int64] + DbusDouble = dbus.Double + DbusBool = dbus.Boolean + + DbusStringVariant = DbusString # TODO: variant_level constraint ? + DbusIntVariant = DbusInt + DbusDoubleVariant = DbusDouble + DbusBoolVariant = DbusBool + + DbusValue = Union[DbusString, DbusInt, DbusDouble, DbusBool, DBUS_NONE] + DbusVariant = Union[DbusStringVariant, DbusIntVariant, DbusDoubleVariant, DbusBoolVariant, DBUS_NONE] + + DbusTextDict = dbus.Dictionary + DbusVariantDict = dbus.Dictionary + + DbusType = Union[DbusValue, DbusVariant, DbusVariantDict, DbusTextDict] + +DBUS_NONE = dbus.Array([], signature=dbus.Signature('i'), variant_level=1) # DEFINED by victron + +MAX_INT16 = 2 ** 15 - 1 +MAX_INT32 = 2 ** 31 - 1 + + +def dbus_uint32(value): + # type: (int) -> dbus.UInt32 + if value < 0: + raise Exception('cannot convert negative value to UInt32') + + return dbus.UInt32(value) + + +def dbus_int(value): + # type: (Union[int, long]) -> Union[dbus.Int16, dbus.Int32, dbus.Int64] + abs_value = abs(value) + if abs_value < MAX_INT16: + return dbus.Int16(value) + elif abs_value < MAX_INT32: + return dbus.Int32(value) + else: + return dbus.Int64(value) + + +def dbus_string(value): + # type: (Union[str, unicode]) -> DbusString + if isinstance(value, unicode): + return dbus.UTF8String(value) + else: + return dbus.String(value) + + +def dbus_double(value): + # type: (float) -> DbusDouble + return dbus.Double(value) + + +def dbus_bool(value): + # type: (bool) -> DbusBool + return dbus.Boolean(value) + + +# VARIANTS + +def dbus_int_variant(value): + # type: (Union[int, long]) -> DbusIntVariant + abs_value = abs(value) + if abs_value < MAX_INT16: + return dbus.Int16(value, variant_level=1) + elif abs_value < MAX_INT32: + return dbus.Int32(value, variant_level=1) + else: + return dbus.Int64(value, variant_level=1) + + +def dbus_string_variant(value): + # type: (Union[str, unicode]) -> DbusStringVariant + if isinstance(value, unicode): + return dbus.UTF8String(value, variant_level=1) + else: + return dbus.String(value, variant_level=1) + + +def dbus_double_variant(value): + # type: (float) -> DbusDoubleVariant + return dbus.Double(value, variant_level=1) + + +def dbus_bool_variant(value): + # type: (bool) -> DbusBoolVariant + return dbus.Boolean(value, variant_level=1) + + +def dbus_variant(value): + # type: (Any) -> DbusVariant + + if value is None: + return DBUS_NONE + if isinstance(value, float): + return dbus_double_variant(value) + if isinstance(value, bool): + return dbus_bool_variant(value) + if isinstance(value, (int, long)): + return dbus_int_variant(value) + if isinstance(value, (str, unicode)): + return dbus_string_variant(value) + # TODO: container types + if isinstance(value, list): + # Convert each element in the list to a dbus variant + dbus_array = [dbus_variant(item) for item in value] + if not dbus_array: + return dbus.Array([], signature='v') # Empty array with variant type + first_element = value[0] + if isinstance(first_element, float): + signature = 'd' + elif isinstance(first_element, bool): + signature = 'b' + elif isinstance(first_element, (int, long)): + signature = 'x' + elif isinstance(first_element, (str, unicode)): + signature = 's' + else: + signature = 'v' # default to variant if unknown + return dbus.Array(dbus_array, signature=signature) + + raise TypeError('unsupported python type: ' + str(type(value)) + ' ' + str(value)) + + +def dbus_value(value): + # type: (Any) -> DbusVariant + + if value is None: + return DBUS_NONE + if isinstance(value, float): + return dbus_double(value) + if isinstance(value, bool): + return dbus_bool(value) + if isinstance(value, (int, long)): + return dbus_int(value) + if isinstance(value, (str, unicode)): + return dbus_string_variant(value) + # TODO: container types + + raise TypeError('unsupported python type: ' + str(type(value)) + ' ' + str(value)) + + + diff --git a/python/dbus-fz-sonick-48tl-with-s3/ext/velib_python/ve_utils.py b/python/dbus-fz-sonick-48tl-with-s3/ext/velib_python/ve_utils.py new file mode 100644 index 000000000..459584bab --- /dev/null +++ b/python/dbus-fz-sonick-48tl-with-s3/ext/velib_python/ve_utils.py @@ -0,0 +1,202 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +from traceback import print_exc +from os import _exit as os_exit +from os import statvfs +import logging +from functools import update_wrapper +import dbus +logger = logging.getLogger(__name__) + +VEDBUS_INVALID = dbus.Array([], signature=dbus.Signature('i'), variant_level=1) + +# Use this function to make sure the code quits on an unexpected exception. Make sure to use it +# when using gobject.idle_add and also gobject.timeout_add. +# Without this, the code will just keep running, since gobject does not stop the mainloop on an +# exception. +# Example: gobject.idle_add(exit_on_error, myfunc, arg1, arg2) +def exit_on_error(func, *args, **kwargs): + try: + return func(*args, **kwargs) + except: + try: + print 'exit_on_error: there was an exception. Printing stacktrace will be tryed and then exit' + print_exc() + except: + pass + + # sys.exit() is not used, since that throws an exception, which does not lead to a program + # halt when used in a dbus callback, see connection.py in the Python/Dbus libraries, line 230. + os_exit(1) + + +__vrm_portal_id = None +def get_vrm_portal_id(): + # For the CCGX, the definition of the VRM Portal ID is that it is the mac address of the onboard- + # ethernet port (eth0), stripped from its colons (:) and lower case. + + # nice coincidence is that this also works fine when running on your (linux) development computer. + + global __vrm_portal_id + + if __vrm_portal_id: + return __vrm_portal_id + + # Assume we are on linux + import fcntl, socket, struct + + s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + info = fcntl.ioctl(s.fileno(), 0x8927, struct.pack('256s', 'eth0'[:15])) + __vrm_portal_id = ''.join(['%02x' % ord(char) for char in info[18:24]]) + + return __vrm_portal_id + + +# See VE.Can registers - public.docx for definition of this conversion +def convert_vreg_version_to_readable(version): + def str_to_arr(x, length): + a = [] + for i in range(0, len(x), length): + a.append(x[i:i+length]) + return a + + x = "%x" % version + x = x.upper() + + if len(x) == 5 or len(x) == 3 or len(x) == 1: + x = '0' + x + + a = str_to_arr(x, 2); + + # remove the first 00 if there are three bytes and it is 00 + if len(a) == 3 and a[0] == '00': + a.remove(0); + + # if we have two or three bytes now, and the first character is a 0, remove it + if len(a) >= 2 and a[0][0:1] == '0': + a[0] = a[0][1]; + + result = '' + for item in a: + result += ('.' if result != '' else '') + item + + + result = 'v' + result + + return result + + +def get_free_space(path): + result = -1 + + try: + s = statvfs(path) + result = s.f_frsize * s.f_bavail # Number of free bytes that ordinary users + except Exception, ex: + logger.info("Error while retrieving free space for path %s: %s" % (path, ex)) + + return result + + +def get_load_averages(): + c = read_file('/proc/loadavg') + return c.split(' ')[:3] + + +# Returns False if it cannot find a machine name. Otherwise returns the string +# containing the name +def get_machine_name(): + c = read_file('/proc/device-tree/model') + + if c != False: + return c.strip('\x00') + + return read_file('/etc/venus/machine') + + +# Returns False if it cannot open the file. Otherwise returns its rstripped contents +def read_file(path): + content = False + + try: + with open(path, 'r') as f: + content = f.read().rstrip() + except Exception, ex: + logger.debug("Error while reading %s: %s" % (path, ex)) + + return content + + +def wrap_dbus_value(value): + if value is None: + return VEDBUS_INVALID + if isinstance(value, float): + return dbus.Double(value, variant_level=1) + if isinstance(value, bool): + return dbus.Boolean(value, variant_level=1) + if isinstance(value, int): + return dbus.Int32(value, variant_level=1) + if isinstance(value, str): + return dbus.String(value, variant_level=1) + if isinstance(value, unicode): + return dbus.String(value, variant_level=1) + if isinstance(value, list): + if len(value) == 0: + # If the list is empty we cannot infer the type of the contents. So assume unsigned integer. + # A (signed) integer is dangerous, because an empty list of signed integers is used to encode + # an invalid value. + return dbus.Array([], signature=dbus.Signature('u'), variant_level=1) + return dbus.Array([wrap_dbus_value(x) for x in value], variant_level=1) + if isinstance(value, long): + return dbus.Int64(value, variant_level=1) + if isinstance(value, dict): + # Wrapping the keys of the dictionary causes D-Bus errors like: + # 'arguments to dbus_message_iter_open_container() were incorrect, + # assertion "(type == DBUS_TYPE_ARRAY && contained_signature && + # *contained_signature == DBUS_DICT_ENTRY_BEGIN_CHAR) || (contained_signature == NULL || + # _dbus_check_is_valid_signature (contained_signature))" failed in file ...' + return dbus.Dictionary({(k, wrap_dbus_value(v)) for k, v in value.items()}, variant_level=1) + return value + + +dbus_int_types = (dbus.Int32, dbus.UInt32, dbus.Byte, dbus.Int16, dbus.UInt16, dbus.UInt32, dbus.Int64, dbus.UInt64) + + +def unwrap_dbus_value(val): + """Converts D-Bus values back to the original type. For example if val is of type DBus.Double, + a float will be returned.""" + if isinstance(val, dbus_int_types): + return int(val) + if isinstance(val, dbus.Double): + return float(val) + if isinstance(val, dbus.Array): + v = [unwrap_dbus_value(x) for x in val] + return None if len(v) == 0 else v + if isinstance(val, (dbus.Signature, dbus.String)): + return unicode(val) + # Python has no byte type, so we convert to an integer. + if isinstance(val, dbus.Byte): + return int(val) + if isinstance(val, dbus.ByteArray): + return "".join([str(x) for x in val]) + if isinstance(val, (list, tuple)): + return [unwrap_dbus_value(x) for x in val] + if isinstance(val, (dbus.Dictionary, dict)): + # Do not unwrap the keys, see comment in wrap_dbus_value + return dict([(x, unwrap_dbus_value(y)) for x, y in val.items()]) + if isinstance(val, dbus.Boolean): + return bool(val) + return val + +class reify(object): + """ Decorator to replace a property of an object with the calculated value, + to make it concrete. """ + def __init__(self, wrapped): + self.wrapped = wrapped + update_wrapper(self, wrapped) + def __get__(self, inst, objtype=None): + if inst is None: + return self + v = self.wrapped(inst) + setattr(inst, self.wrapped.__name__, v) + return v diff --git a/python/dbus-fz-sonick-48tl-with-s3/ext/velib_python/vedbus.py b/python/dbus-fz-sonick-48tl-with-s3/ext/velib_python/vedbus.py new file mode 100644 index 000000000..2dbed13e2 --- /dev/null +++ b/python/dbus-fz-sonick-48tl-with-s3/ext/velib_python/vedbus.py @@ -0,0 +1,496 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import dbus.service +import logging +import traceback +import os +import weakref +from ve_utils import wrap_dbus_value, unwrap_dbus_value + +# vedbus contains three classes: +# VeDbusItemImport -> use this to read data from the dbus, ie import +# VeDbusItemExport -> use this to export data to the dbus (one value) +# VeDbusService -> use that to create a service and export several values to the dbus + +# Code for VeDbusItemImport is copied from busitem.py and thereafter modified. +# All projects that used busitem.py need to migrate to this package. And some +# projects used to define there own equivalent of VeDbusItemExport. Better to +# use VeDbusItemExport, or even better the VeDbusService class that does it all for you. + +# TODOS +# 1 check for datatypes, it works now, but not sure if all is compliant with +# com.victronenergy.BusItem interface definition. See also the files in +# tests_and_examples. And see 'if type(v) == dbus.Byte:' on line 102. Perhaps +# something similar should also be done in VeDbusBusItemExport? +# 2 Shouldn't VeDbusBusItemExport inherit dbus.service.Object? +# 7 Make hard rules for services exporting data to the D-Bus, in order to make tracking +# changes possible. Does everybody first invalidate its data before leaving the bus? +# And what about before taking one object away from the bus, instead of taking the +# whole service offline? +# They should! And after taking one value away, do we need to know that someone left +# the bus? Or we just keep that value in invalidated for ever? Result is that we can't +# see the difference anymore between an invalidated value and a value that was first on +# the bus and later not anymore. See comments above VeDbusItemImport as well. +# 9 there are probably more todos in the code below. + +# Some thoughts with regards to the data types: +# +# Text from: http://dbus.freedesktop.org/doc/dbus-python/doc/tutorial.html#data-types +# --- +# Variants are represented by setting the variant_level keyword argument in the +# constructor of any D-Bus data type to a value greater than 0 (variant_level 1 +# means a variant containing some other data type, variant_level 2 means a variant +# containing a variant containing some other data type, and so on). If a non-variant +# is passed as an argument but introspection indicates that a variant is expected, +# it'll automatically be wrapped in a variant. +# --- +# +# Also the different dbus datatypes, such as dbus.Int32, and dbus.UInt32 are a subclass +# of Python int. dbus.String is a subclass of Python standard class unicode, etcetera +# +# So all together that explains why we don't need to explicitly convert back and forth +# between the dbus datatypes and the standard python datatypes. Note that all datatypes +# in python are objects. Even an int is an object. + +# The signature of a variant is 'v'. + +# Export ourselves as a D-Bus service. +class VeDbusService(object): + def __init__(self, servicename, bus=None): + # dict containing the VeDbusItemExport objects, with their path as the key. + self._dbusobjects = {} + self._dbusnodes = {} + + # dict containing the onchange callbacks, for each object. Object path is the key + self._onchangecallbacks = {} + + # Connect to session bus whenever present, else use the system bus + self._dbusconn = bus or (dbus.SessionBus() if 'DBUS_SESSION_BUS_ADDRESS' in os.environ else dbus.SystemBus()) + + # make the dbus connection available to outside, could make this a true property instead, but ach.. + self.dbusconn = self._dbusconn + + # Register ourselves on the dbus, trigger an error if already in use (do_not_queue) + self._dbusname = dbus.service.BusName(servicename, self._dbusconn, do_not_queue=True) + + # Add the root item that will return all items as a tree + self._dbusnodes['/'] = self._create_tree_export(self._dbusconn, '/', self._get_tree_dict) + + logging.info("registered ourselves on D-Bus as %s" % servicename) + + def _get_tree_dict(self, path, get_text=False): + logging.debug("_get_tree_dict called for %s" % path) + r = {} + px = path + if not px.endswith('/'): + px += '/' + for p, item in self._dbusobjects.items(): + if p.startswith(px): + v = item.GetText() if get_text else wrap_dbus_value(item.local_get_value()) + r[p[len(px):]] = v + logging.debug(r) + return r + + # To force immediate deregistering of this dbus service and all its object paths, explicitly + # call __del__(). + def __del__(self): + for node in self._dbusnodes.values(): + node.__del__() + self._dbusnodes.clear() + for item in self._dbusobjects.values(): + item.__del__() + self._dbusobjects.clear() + if self._dbusname: + self._dbusname.__del__() # Forces call to self._bus.release_name(self._name), see source code + self._dbusname = None + + # @param callbackonchange function that will be called when this value is changed. First parameter will + # be the path of the object, second the new value. This callback should return + # True to accept the change, False to reject it. + def add_path(self, path, value, description="", writeable=False, + onchangecallback=None, gettextcallback=None): + + if onchangecallback is not None: + self._onchangecallbacks[path] = onchangecallback + + item = VeDbusItemExport( + self._dbusconn, path, value, description, writeable, + self._value_changed, gettextcallback, deletecallback=self._item_deleted) + + spl = path.split('/') + for i in range(2, len(spl)): + subPath = '/'.join(spl[:i]) + if subPath not in self._dbusnodes and subPath not in self._dbusobjects: + self._dbusnodes[subPath] = self._create_tree_export(self._dbusconn, subPath, self._get_tree_dict) + self._dbusobjects[path] = item + logging.debug('added %s with start value %s. Writeable is %s' % (path, value, writeable)) + + # Add the mandatory paths, as per victron dbus api doc + def add_mandatory_paths(self, processname, processversion, connection, + deviceinstance, productid, productname, firmwareversion, hardwareversion, connected): + self.add_path('/Mgmt/ProcessName', processname) + self.add_path('/Mgmt/ProcessVersion', processversion) + self.add_path('/Mgmt/Connection', connection) + + # Create rest of the mandatory objects + self.add_path('/DeviceInstance', deviceinstance) + self.add_path('/ProductId', productid) + self.add_path('/ProductName', productname) + self.add_path('/FirmwareVersion', firmwareversion) + self.add_path('/HardwareVersion', hardwareversion) + self.add_path('/Connected', connected) + + def _create_tree_export(self, bus, objectPath, get_value_handler): + return VeDbusTreeExport(bus, objectPath, get_value_handler) + + # Callback function that is called from the VeDbusItemExport objects when a value changes. This function + # maps the change-request to the onchangecallback given to us for this specific path. + def _value_changed(self, path, newvalue): + if path not in self._onchangecallbacks: + return True + + return self._onchangecallbacks[path](path, newvalue) + + def _item_deleted(self, path): + self._dbusobjects.pop(path) + for np in self._dbusnodes.keys(): + if np != '/': + for ip in self._dbusobjects: + if ip.startswith(np + '/'): + break + else: + self._dbusnodes[np].__del__() + self._dbusnodes.pop(np) + + def __getitem__(self, path): + return self._dbusobjects[path].local_get_value() + + def __setitem__(self, path, newvalue): + self._dbusobjects[path].local_set_value(newvalue) + + def __delitem__(self, path): + self._dbusobjects[path].__del__() # Invalidates and then removes the object path + assert path not in self._dbusobjects + + def __contains__(self, path): + return path in self._dbusobjects + +""" +Importing basics: + - If when we power up, the D-Bus service does not exist, or it does exist and the path does not + yet exist, still subscribe to a signal: as soon as it comes online it will send a signal with its + initial value, which VeDbusItemImport will receive and use to update local cache. And, when set, + call the eventCallback. + - If when we power up, save it + - When using get_value, know that there is no difference between services (or object paths) that don't + exist and paths that are invalid (= empty array, see above). Both will return None. In case you do + really want to know ifa path exists or not, use the exists property. + - When a D-Bus service leaves the D-Bus, it will first invalidate all its values, and send signals + with that update, and only then leave the D-Bus. (or do we need to subscribe to the NameOwnerChanged- + signal!?!) To be discussed and make sure. Not really urgent, since all existing code that uses this + class already subscribes to the NameOwnerChanged signal, and subsequently removes instances of this + class. + +Read when using this class: +Note that when a service leaves that D-Bus without invalidating all its exported objects first, for +example because it is killed, VeDbusItemImport doesn't have a clue. So when using VeDbusItemImport, +make sure to also subscribe to the NamerOwnerChanged signal on bus-level. Or just use dbusmonitor, +because that takes care of all of that for you. +""" +class VeDbusItemImport(object): + ## Constructor + # @param bus the bus-object (SESSION or SYSTEM). + # @param serviceName the dbus-service-name (string), for example 'com.victronenergy.battery.ttyO1' + # @param path the object-path, for example '/Dc/V' + # @param eventCallback function that you want to be called on a value change + # @param createSignal only set this to False if you use this function to one time read a value. When + # leaving it to True, make sure to also subscribe to the NameOwnerChanged signal + # elsewhere. See also note some 15 lines up. + def __init__(self, bus, serviceName, path, eventCallback=None, createsignal=True): + # TODO: is it necessary to store _serviceName and _path? Isn't it + # stored in the bus_getobjectsomewhere? + self._serviceName = serviceName + self._path = path + self._match = None + # TODO: _proxy is being used in settingsdevice.py, make a getter for that + self._proxy = bus.get_object(serviceName, path, introspect=False) + self.eventCallback = eventCallback + + assert eventCallback is None or createsignal == True + if createsignal: + self._match = self._proxy.connect_to_signal( + "PropertiesChanged", weak_functor(self._properties_changed_handler)) + + # store the current value in _cachedvalue. When it doesn't exists set _cachedvalue to + # None, same as when a value is invalid + self._cachedvalue = None + try: + v = self._proxy.GetValue() + except dbus.exceptions.DBusException: + pass + else: + self._cachedvalue = unwrap_dbus_value(v) + + def __del__(self): + if self._match != None: + self._match.remove() + self._match = None + self._proxy = None + + def _refreshcachedvalue(self): + self._cachedvalue = unwrap_dbus_value(self._proxy.GetValue()) + + ## Returns the path as a string, for example '/AC/L1/V' + @property + def path(self): + return self._path + + ## Returns the dbus service name as a string, for example com.victronenergy.vebus.ttyO1 + @property + def serviceName(self): + return self._serviceName + + ## Returns the value of the dbus-item. + # the type will be a dbus variant, for example dbus.Int32(0, variant_level=1) + # this is not a property to keep the name consistant with the com.victronenergy.busitem interface + # returns None when the property is invalid + def get_value(self): + return self._cachedvalue + + ## Writes a new value to the dbus-item + def set_value(self, newvalue): + r = self._proxy.SetValue(wrap_dbus_value(newvalue)) + + # instead of just saving the value, go to the dbus and get it. So we have the right type etc. + if r == 0: + self._refreshcachedvalue() + + return r + + ## Returns the text representation of the value. + # For example when the value is an enum/int GetText might return the string + # belonging to that enum value. Another example, for a voltage, GetValue + # would return a float, 12.0Volt, and GetText could return 12 VDC. + # + # Note that this depends on how the dbus-producer has implemented this. + def get_text(self): + return self._proxy.GetText() + + ## Returns true of object path exists, and false if it doesn't + @property + def exists(self): + # TODO: do some real check instead of this crazy thing. + r = False + try: + r = self._proxy.GetValue() + r = True + except dbus.exceptions.DBusException: + pass + + return r + + ## callback for the trigger-event. + # @param eventCallback the event-callback-function. + @property + def eventCallback(self): + return self._eventCallback + + @eventCallback.setter + def eventCallback(self, eventCallback): + self._eventCallback = eventCallback + + ## Is called when the value of the imported bus-item changes. + # Stores the new value in our local cache, and calls the eventCallback, if set. + def _properties_changed_handler(self, changes): + if "Value" in changes: + changes['Value'] = unwrap_dbus_value(changes['Value']) + self._cachedvalue = changes['Value'] + if self._eventCallback: + # The reason behind this try/except is to prevent errors silently ending up the an error + # handler in the dbus code. + try: + self._eventCallback(self._serviceName, self._path, changes) + except: + traceback.print_exc() + os._exit(1) # sys.exit() is not used, since that also throws an exception + + +class VeDbusTreeExport(dbus.service.Object): + def __init__(self, bus, objectPath, get_value_handler): + dbus.service.Object.__init__(self, bus, objectPath) + self._get_value_handler = get_value_handler + logging.debug("VeDbusTreeExport %s has been created" % objectPath) + + def __del__(self): + # self._get_path() will raise an exception when retrieved after the call to .remove_from_connection, + # so we need a copy. + path = self._get_path() + if path is None: + return + self.remove_from_connection() + logging.debug("VeDbusTreeExport %s has been removed" % path) + + def _get_path(self): + if len(self._locations) == 0: + return None + return self._locations[0][1] + + @dbus.service.method('com.victronenergy.BusItem', out_signature='v') + def GetValue(self): + value = self._get_value_handler(self._get_path()) + return dbus.Dictionary(value, signature=dbus.Signature('sv'), variant_level=1) + + @dbus.service.method('com.victronenergy.BusItem', out_signature='v') + def GetText(self): + return self._get_value_handler(self._get_path(), True) + + def local_get_value(self): + return self._get_value_handler(self.path) + + +class VeDbusItemExport(dbus.service.Object): + ## Constructor of VeDbusItemExport + # + # Use this object to export (publish), values on the dbus + # Creates the dbus-object under the given dbus-service-name. + # @param bus The dbus object. + # @param objectPath The dbus-object-path. + # @param value Value to initialize ourselves with, defaults to None which means Invalid + # @param description String containing a description. Can be called over the dbus with GetDescription() + # @param writeable what would this do!? :). + # @param callback Function that will be called when someone else changes the value of this VeBusItem + # over the dbus. First parameter passed to callback will be our path, second the new + # value. This callback should return True to accept the change, False to reject it. + def __init__(self, bus, objectPath, value=None, description=None, writeable=False, + onchangecallback=None, gettextcallback=None, deletecallback=None): + dbus.service.Object.__init__(self, bus, objectPath) + self._onchangecallback = onchangecallback + self._gettextcallback = gettextcallback + self._value = value + self._description = description + self._writeable = writeable + self._deletecallback = deletecallback + + # To force immediate deregistering of this dbus object, explicitly call __del__(). + def __del__(self): + # self._get_path() will raise an exception when retrieved after the + # call to .remove_from_connection, so we need a copy. + path = self._get_path() + if path == None: + return + if self._deletecallback is not None: + self._deletecallback(path) + self.local_set_value(None) + self.remove_from_connection() + logging.debug("VeDbusItemExport %s has been removed" % path) + + def _get_path(self): + if len(self._locations) == 0: + return None + return self._locations[0][1] + + ## Sets the value. And in case the value is different from what it was, a signal + # will be emitted to the dbus. This function is to be used in the python code that + # is using this class to export values to the dbus. + # set value to None to indicate that it is Invalid + def local_set_value(self, newvalue): + if self._value == newvalue: + return + + self._value = newvalue + + changes = {} + changes['Value'] = wrap_dbus_value(newvalue) + changes['Text'] = self.GetText() + self.PropertiesChanged(changes) + + def local_get_value(self): + return self._value + + # ==== ALL FUNCTIONS BELOW THIS LINE WILL BE CALLED BY OTHER PROCESSES OVER THE DBUS ==== + + ## Dbus exported method SetValue + # Function is called over the D-Bus by other process. It will first check (via callback) if new + # value is accepted. And it is, stores it and emits a changed-signal. + # @param value The new value. + # @return completion-code When successful a 0 is return, and when not a -1 is returned. + @dbus.service.method('com.victronenergy.BusItem', in_signature='v', out_signature='i') + def SetValue(self, newvalue): + if not self._writeable: + return 1 # NOT OK + + newvalue = unwrap_dbus_value(newvalue) + + if newvalue == self._value: + return 0 # OK + + # call the callback given to us, and check if new value is OK. + if (self._onchangecallback is None or + (self._onchangecallback is not None and self._onchangecallback(self.__dbus_object_path__, newvalue))): + + self.local_set_value(newvalue) + return 0 # OK + + return 2 # NOT OK + + ## Dbus exported method GetDescription + # + # Returns the a description. + # @param language A language code (e.g. ISO 639-1 en-US). + # @param length Lenght of the language string. + # @return description + @dbus.service.method('com.victronenergy.BusItem', in_signature='si', out_signature='s') + def GetDescription(self, language, length): + return self._description if self._description is not None else 'No description given' + + ## Dbus exported method GetValue + # Returns the value. + # @return the value when valid, and otherwise an empty array + @dbus.service.method('com.victronenergy.BusItem', out_signature='v') + def GetValue(self): + return wrap_dbus_value(self._value) + + ## Dbus exported method GetText + # Returns the value as string of the dbus-object-path. + # @return text A text-value. '---' when local value is invalid + @dbus.service.method('com.victronenergy.BusItem', out_signature='s') + def GetText(self): + if self._value is None: + return '---' + + # Default conversion from dbus.Byte will get you a character (so 'T' instead of '84'), so we + # have to convert to int first. Note that if a dbus.Byte turns up here, it must have come from + # the application itself, as all data from the D-Bus should have been unwrapped by now. + if self._gettextcallback is None and type(self._value) == dbus.Byte: + return str(int(self._value)) + + if self._gettextcallback is None and self.__dbus_object_path__ == '/ProductId': + return "0x%X" % self._value + + if self._gettextcallback is None: + return str(self._value) + + return self._gettextcallback(self.__dbus_object_path__, self._value) + + ## The signal that indicates that the value has changed. + # Other processes connected to this BusItem object will have subscribed to the + # event when they want to track our state. + @dbus.service.signal('com.victronenergy.BusItem', signature='a{sv}') + def PropertiesChanged(self, changes): + pass + +## This class behaves like a regular reference to a class method (eg. self.foo), but keeps a weak reference +## to the object which method is to be called. +## Use this object to break circular references. +class weak_functor: + def __init__(self, f): + self._r = weakref.ref(f.__self__) + self._f = weakref.ref(f.__func__) + + def __call__(self, *args, **kargs): + r = self._r() + f = self._f() + if r == None or f == None: + return + f(r, *args, **kargs) diff --git a/python/dbus-fz-sonick-48tl-with-s3/service/down b/python/dbus-fz-sonick-48tl-with-s3/service/down new file mode 100644 index 000000000..e69de29bb diff --git a/python/dbus-fz-sonick-48tl-with-s3/service/log/down b/python/dbus-fz-sonick-48tl-with-s3/service/log/down new file mode 100644 index 000000000..e69de29bb diff --git a/python/dbus-fz-sonick-48tl-with-s3/service/log/run b/python/dbus-fz-sonick-48tl-with-s3/service/log/run new file mode 100755 index 000000000..74e759d9b --- /dev/null +++ b/python/dbus-fz-sonick-48tl-with-s3/service/log/run @@ -0,0 +1,3 @@ +#!/bin/sh +exec 2>&1 +exec multilog t s25000 n4 /var/log/dbus-fzsonick-48tl.TTY diff --git a/python/dbus-fz-sonick-48tl-with-s3/signals.py b/python/dbus-fz-sonick-48tl-with-s3/signals.py new file mode 100644 index 000000000..e35c95603 --- /dev/null +++ b/python/dbus-fz-sonick-48tl-with-s3/signals.py @@ -0,0 +1,374 @@ +# coding=utf-8 + +import config as cfg +from convert import mean, read_float, read_led_state, read_bool, count_bits, comma_separated, read_bitmap, return_in_list, first, read_hex_string +from data import BatterySignal, Battery, LedColor, ServiceSignal, BatteryStatus, LedState, CsvSignal + +# noinspection PyUnreachableCode +if False: + from typing import List, Iterable + +def read_voltage(): + return read_float(register=999, scale_factor=0.01, offset=0) + +def read_current(): + return read_float(register=1000, scale_factor=0.01, offset=-10000) + +def read_limb_bitmap(): + return read_bitmap(1059) + +def read_power(status): + return int(read_current()(status) * read_voltage()(status)) + +def interpret_limb_bitmap(bitmap_value): + string1_disabled = int((bitmap_value & 0b00001) != 0) + string2_disabled = int((bitmap_value & 0b00010) != 0) + string3_disabled = int((bitmap_value & 0b00100) != 0) + string4_disabled = int((bitmap_value & 0b01000) != 0) + string5_disabled = int((bitmap_value & 0b10000) != 0) + n_limb_strings = string1_disabled + string2_disabled + string3_disabled + string4_disabled + string5_disabled + return n_limb_strings + +def limp_strings_value(status): + return interpret_limb_bitmap(read_limb_bitmap()(status)) + +def calc_power_limit_imposed_by_voltage_limit(v, i, v_limit, r_int): + dv = v_limit - v + di = dv / r_int + p_limit = v_limit * (i + di) + return p_limit + +def calc_power_limit_imposed_by_current_limit(v, i, i_limit, r_int): + di = i_limit - i + dv = di * r_int + p_limit = i_limit * (v + dv) + return p_limit + +def calc_max_charge_power(status): + n_strings = cfg.NUM_OF_STRINGS_PER_BATTERY - limp_strings_value(status) + i_max = n_strings * cfg.I_MAX_PER_STRING + v_max = cfg.V_MAX + r_int_min = cfg.R_STRING_MIN / n_strings + r_int_max = cfg.R_STRING_MAX / n_strings + + v = read_voltage()(status) + i = read_current()(status) + + p_limits = [ + calc_power_limit_imposed_by_voltage_limit(v, i, v_max, r_int_min), + calc_power_limit_imposed_by_voltage_limit(v, i, v_max, r_int_max), + calc_power_limit_imposed_by_current_limit(v, i, i_max, r_int_min), + calc_power_limit_imposed_by_current_limit(v, i, i_max, r_int_max), + ] + + p_limit = min(p_limits) + p_limit = max(p_limit, 0) + return int(p_limit) + +def calc_max_discharge_power(status): + n_strings = cfg.NUM_OF_STRINGS_PER_BATTERY - limp_strings_value(status) + max_discharge_current = n_strings * cfg.I_MAX_PER_STRING + return int(max_discharge_current * read_voltage()(status)) + +def read_switch_closed(status): + value = read_bool(base_register=1013, bit=0)(status) + if value: + return False + return True + +def read_alarm_out_active(status): + value = read_bool(base_register=1013, bit=1)(status) + if value: + return False + return True + +def read_aux_relay(status): + value = read_bool(base_register=1013, bit=4)(status) + if value: + return False + return True + +def hex_string_to_ascii(hex_string): + hex_string = hex_string.replace(" ", "") + ascii_string = ''.join([chr(int(hex_string[i:i+2], 16)) for i in range(0, len(hex_string), 2)]) + return ascii_string + +def init_service_signals(batteries): + print("INSIDE INIT SERVICE SIGNALS") + n_batteries = len(batteries) + product_name = cfg.PRODUCT_NAME + ' x' + str(n_batteries) + return [ + ServiceSignal('/NbOfBatteries', n_batteries), + ServiceSignal('/Mgmt/ProcessName', __file__), + ServiceSignal('/Mgmt/ProcessVersion', cfg.SOFTWARE_VERSION), + ServiceSignal('/Mgmt/Connection', cfg.CONNECTION), + ServiceSignal('/DeviceInstance', cfg.DEVICE_INSTANCE), + ServiceSignal('/ProductName', product_name), + ServiceSignal('/ProductId', cfg.PRODUCT_ID), + ServiceSignal('/Connected', 1) + ] + +def init_battery_signals(): + print("START INIT SIGNALS") + battery_status_reader = read_hex_string(1060, 2) + + def read_eoc_reached(status): + battery_status_string = battery_status_reader(status) + return hex_string_to_ascii(battery_status_string) == "EOC_" + + def read_battery_cold(status): + return \ + read_led_state(register=1004, led=LedColor.green)(status) >= LedState.blinking_slow and \ + read_led_state(register=1004, led=LedColor.blue)(status) >= LedState.blinking_slow + + def read_soc(status): + soc = read_float(register=1053, scale_factor=0.1, offset=0)(status) + if soc > 99.9 and not read_eoc_reached(status): + return 99.9 + if soc >= 99.9 and read_eoc_reached(status): + return 100 + return soc + + def number_of_active_strings(status): + return cfg.NUM_OF_STRINGS_PER_BATTERY - limp_strings_value(status) + + def max_discharge_current(status): + return number_of_active_strings(status) * cfg.I_MAX_PER_STRING + + def max_charge_current(status): + return status.battery.ampere_hours / 2 + + return [ + BatterySignal('/TimeToTOCRequest', max, read_float(register=1052)), + BatterySignal('/EOCReached', return_in_list, read_eoc_reached), + BatterySignal('/NumOfLimbStrings', return_in_list, limp_strings_value), + BatterySignal('/Dc/0/Voltage', mean, get_value=read_voltage(), unit='V'), + BatterySignal('/Dc/0/Current', sum, get_value=read_current(), unit='A'), + BatterySignal('/Dc/0/Power', sum, get_value=read_power, unit='W'), + BatterySignal('/BussVoltage', mean, read_float(register=1001, scale_factor=0.01, offset=0), unit='V'), + BatterySignal('/Soc', mean, read_soc, unit='%'), + BatterySignal('/LowestSoc', min, read_float(register=1053, scale_factor=0.1, offset=0), unit='%'), + BatterySignal('/Dc/0/Temperature', mean, read_float(register=1003, scale_factor=0.1, offset=-400), unit='C'), + BatterySignal('/Dc/0/LowestTemperature', min, read_float(register=1003, scale_factor=0.1, offset=-400), unit='C'), + BatterySignal('/WarningFlags/TaM1', return_in_list, read_bool(base_register=1005, bit=1)), + BatterySignal('/WarningFlags/TbM1', return_in_list, read_bool(base_register=1005, bit=4)), + BatterySignal('/WarningFlags/VBm1', return_in_list, read_bool(base_register=1005, bit=6)), + BatterySignal('/WarningFlags/VBM1', return_in_list, read_bool(base_register=1005, bit=8)), + BatterySignal('/WarningFlags/IDM1', return_in_list, read_bool(base_register=1005, bit=10)), + BatterySignal('/WarningFlags/vsm1', return_in_list, read_bool(base_register=1005, bit=22)), + BatterySignal('/WarningFlags/vsM1', return_in_list, read_bool(base_register=1005, bit=24)), + BatterySignal('/WarningFlags/iCM1', return_in_list, read_bool(base_register=1005, bit=26)), + BatterySignal('/WarningFlags/iDM1', return_in_list, read_bool(base_register=1005, bit=28)), + BatterySignal('/WarningFlags/MID1', return_in_list, read_bool(base_register=1005, bit=30)), + BatterySignal('/WarningFlags/BLPW', return_in_list, read_bool(base_register=1005, bit=32)), + BatterySignal('/WarningFlags/CCBF', return_in_list, read_bool(base_register=1005, bit=33)), + BatterySignal('/WarningFlags/Ah_W', return_in_list, read_bool(base_register=1005, bit=35)), + BatterySignal('/WarningFlags/MPMM', return_in_list, read_bool(base_register=1005, bit=38)), + BatterySignal('/WarningFlags/TCdi', return_in_list, read_bool(base_register=1005, bit=40)), + BatterySignal('/WarningFlags/LMPW', return_in_list, read_bool(base_register=1005, bit=44)), + BatterySignal('/WarningFlags/TOCW', return_in_list, read_bool(base_register=1005, bit=47)), + BatterySignal('/WarningFlags/BUSL', return_in_list, read_bool(base_register=1005, bit=49)), + BatterySignal('/AlarmFlags/Tam', return_in_list, read_bool(base_register=1005, bit=0)), + BatterySignal('/AlarmFlags/TaM2', return_in_list, read_bool(base_register=1005, bit=2)), + BatterySignal('/AlarmFlags/Tbm', return_in_list, read_bool(base_register=1005, bit=3)), + BatterySignal('/AlarmFlags/TbM2', return_in_list, read_bool(base_register=1005, bit=5)), + BatterySignal('/AlarmFlags/VBm2', return_in_list, read_bool(base_register=1005, bit=7)), + BatterySignal('/AlarmFlags/VBM2', return_in_list, read_bool(base_register=1005, bit=9)), + BatterySignal('/AlarmFlags/IDM2', return_in_list, read_bool(base_register=1005, bit=11)), + BatterySignal('/AlarmFlags/ISOB', return_in_list, read_bool(base_register=1005, bit=12)), + BatterySignal('/AlarmFlags/MSWE', return_in_list, read_bool(base_register=1005, bit=13)), + BatterySignal('/AlarmFlags/FUSE', return_in_list, read_bool(base_register=1005, bit=14)), + BatterySignal('/AlarmFlags/HTRE', return_in_list, read_bool(base_register=1005, bit=15)), + BatterySignal('/AlarmFlags/TCPE', return_in_list, read_bool(base_register=1005, bit=16)), + BatterySignal('/AlarmFlags/STRE', return_in_list, read_bool(base_register=1005, bit=17)), + BatterySignal('/AlarmFlags/CME', return_in_list, read_bool(base_register=1005, bit=18)), + BatterySignal('/AlarmFlags/HWFL', return_in_list, read_bool(base_register=1005, bit=19)), + BatterySignal('/AlarmFlags/HWEM', return_in_list, read_bool(base_register=1005, bit=20)), + BatterySignal('/AlarmFlags/ThM', return_in_list, read_bool(base_register=1005, bit=21)), + BatterySignal('/AlarmFlags/vsm2', return_in_list, read_bool(base_register=1005, bit=23)), + BatterySignal('/AlarmFlags/vsM2', return_in_list, read_bool(base_register=1005, bit=25)), + BatterySignal('/AlarmFlags/iCM2', return_in_list, read_bool(base_register=1005, bit=27)), + BatterySignal('/AlarmFlags/iDM2', return_in_list, read_bool(base_register=1005, bit=29)), + BatterySignal('/AlarmFlags/MID2', return_in_list, read_bool(base_register=1005, bit=31)), + BatterySignal('/AlarmFlags/HTFS', return_in_list, read_bool(base_register=1005, bit=42)), + BatterySignal('/AlarmFlags/DATA', return_in_list, read_bool(base_register=1005, bit=43)), + BatterySignal('/AlarmFlags/LMPA', return_in_list, read_bool(base_register=1005, bit=45)), + BatterySignal('/AlarmFlags/HEBT', return_in_list, read_bool(base_register=1005, bit=46)), + BatterySignal('/AlarmFlags/CURM', return_in_list, read_bool(base_register=1005, bit=48)), + BatterySignal('/Diagnostics/LedStatus/Red', first, read_led_state(register=1004, led=LedColor.red)), + BatterySignal('/Diagnostics/LedStatus/Blue', first, read_led_state(register=1004, led=LedColor.blue)), + BatterySignal('/Diagnostics/LedStatus/Green', first, read_led_state(register=1004, led=LedColor.green)), + BatterySignal('/Diagnostics/LedStatus/Amber', first, read_led_state(register=1004, led=LedColor.amber)), + BatterySignal('/Diagnostics/IoStatus/MainSwitchClosed', return_in_list, read_switch_closed), + BatterySignal('/Diagnostics/IoStatus/AlarmOutActive', return_in_list, read_alarm_out_active), + BatterySignal('/Diagnostics/IoStatus/InternalFanActive', return_in_list, read_bool(base_register=1013, bit=2)), + BatterySignal('/Diagnostics/IoStatus/VoltMeasurementAllowed', return_in_list, read_bool(base_register=1013, bit=3)), + BatterySignal('/Diagnostics/IoStatus/AuxRelay', return_in_list, read_aux_relay), + BatterySignal('/Diagnostics/IoStatus/RemoteState', return_in_list, read_bool(base_register=1013, bit=5)), + BatterySignal('/Diagnostics/IoStatus/RiscOn', return_in_list, read_bool(base_register=1013, bit=6)), + BatterySignal('/IoStatus/BatteryCold', any, read_battery_cold), + BatterySignal('/Info/MaxDischargeCurrent', sum, max_discharge_current, unit='A'), + BatterySignal('/Info/MaxChargeCurrent', sum, max_charge_current, unit='A'), + BatterySignal('/Info/MaxChargeVoltage', min, lambda bs: bs.battery.v_max, unit='V'), + BatterySignal('/Info/MinDischargeVoltage', max, lambda bs: bs.battery.v_min, unit='V'), + BatterySignal('/Info/BatteryLowVoltage', max, lambda bs: bs.battery.v_min - 2, unit='V'), + BatterySignal('/Info/NumberOfStrings', sum, number_of_active_strings), + BatterySignal('/Info/MaxChargePower', sum, calc_max_charge_power), + BatterySignal('/Info/MaxDischargePower', sum, calc_max_discharge_power), + BatterySignal('/FirmwareVersion', comma_separated, lambda bs: bs.battery.firmware_version), + BatterySignal('/HardwareVersion', comma_separated, lambda bs: bs.battery.hardware_version), + BatterySignal('/BmsVersion', comma_separated, lambda bs: bs.battery.bms_version) + ] + +def create_csv_signals(firmware_version): + total_current = read_float(register=1062, scale_factor=0.01, offset=-10000) + + def read_total_current(status): + return total_current(status) + + def read_heating_current(status): + return total_current(status) - read_current()(status) + + def read_heating_power(status): + return read_voltage()(status) * read_heating_current(status) + + soc_ah = read_float(register=1002, scale_factor=0.1, offset=-10000) + + def read_soc_ah(status): + return soc_ah(status) + + def return_led_state(status, color): + led_state = read_led_state(register=1004, led=color)(status) + if led_state == LedState.blinking_fast or led_state == LedState.blinking_slow: + return "Blinking" + elif led_state == LedState.on: + return "On" + elif led_state == LedState.off: + return "Off" + return "Unknown" + + def return_led_state_blue(status): + return return_led_state(status, LedColor.blue) + + def return_led_state_red(status): + return return_led_state(status, LedColor.red) + + def return_led_state_green(status): + return return_led_state(status, LedColor.green) + + def return_led_state_amber(status): + return return_led_state(status, LedColor.amber) + + battery_status_reader = read_hex_string(1060, 2) + + def read_eoc_reached(status): + battery_status_string = battery_status_reader(status) + return hex_string_to_ascii(battery_status_string) == "EOC_" + + def read_serial_number(status): + serial_regs = [1055, 1056, 1057, 1058] + serial_parts = [] + for reg in serial_regs: + hex_value_fun = read_hex_string(reg, 1) + hex_value = hex_value_fun(status) + serial_parts.append(hex_value.replace(' ', '')) + serial_number = ''.join(serial_parts).rstrip('0') + return serial_number + + def time_since_toc_in_time_format(status): + time_in_minutes = read_float(register=1052)(status) + total_seconds = int(time_in_minutes * 60) + days = total_seconds // (24 * 3600) + total_seconds = total_seconds % (24 * 3600) + hours = total_seconds // 3600 + total_seconds %= 3600 + minutes = total_seconds // 60 + seconds = total_seconds % 60 + return "{}.{:02}:{:02}:{:02}".format(days, hours, minutes, seconds) + + return [ + CsvSignal('/Battery/Devices/FwVersion', firmware_version), + CsvSignal('/Battery/Devices/Dc/Power', read_power, 'W'), + CsvSignal('/Battery/Devices/Dc/Voltage', read_voltage(), 'V'), + CsvSignal('/Battery/Devices/Soc', read_float(register=1053, scale_factor=0.1, offset=0), '%'), + CsvSignal('/Battery/Devices/Temperatures/Cells/Average', read_float(register=1003, scale_factor=0.1, offset=-400), 'C'), + CsvSignal('/Battery/Devices/Dc/Current', read_current(), 'A'), + CsvSignal('/Battery/Devices/BusCurrent', read_total_current, 'A'), + CsvSignal('/Battery/Devices/CellsCurrent', read_current(), 'A'), + CsvSignal('/Battery/Devices/HeatingCurrent', read_heating_current, 'A'), + CsvSignal('/Battery/Devices/HeatingPower', read_heating_power, 'W'), + CsvSignal('/Battery/Devices/SOCAh', read_soc_ah), + CsvSignal('/Battery/Devices/Leds/Blue', return_led_state_blue), + CsvSignal('/Battery/Devices/Leds/Red', return_led_state_red), + CsvSignal('/Battery/Devices/Leds/Green', return_led_state_green), + CsvSignal('/Battery/Devices/Leds/Amber', return_led_state_amber), + CsvSignal('/Battery/Devices/BatteryStrings/String1Active', lambda status: int((read_limb_bitmap()(status) & 0b00001) != 0)), + CsvSignal('/Battery/Devices/BatteryStrings/String2Active', lambda status: int((read_limb_bitmap()(status) & 0b00010) != 0)), + CsvSignal('/Battery/Devices/BatteryStrings/String3Active', lambda status: int((read_limb_bitmap()(status) & 0b00100) != 0)), + CsvSignal('/Battery/Devices/BatteryStrings/String4Active', lambda status: int((read_limb_bitmap()(status) & 0b01000) != 0)), + CsvSignal('/Battery/Devices/BatteryStrings/String5Active', lambda status: int((read_limb_bitmap()(status) & 0b10000) != 0)), + CsvSignal('/Battery/Devices/IoStatus/ConnectedToDcBus', read_switch_closed), + CsvSignal('/Battery/Devices/IoStatus/AlarmOutActive', read_alarm_out_active), + CsvSignal('/Battery/Devices/IoStatus/InternalFanActive', read_bool(base_register=1013, bit=2)), + CsvSignal('/Battery/Devices/IoStatus/VoltMeasurementAllowed', read_bool(base_register=1013, bit=3)), + CsvSignal('/Battery/Devices/IoStatus/AuxRelayBus', read_aux_relay), + CsvSignal('/Battery/Devices/IoStatus/RemoteStateActive', read_bool(base_register=1013, bit=5)), + CsvSignal('/Battery/Devices/IoStatus/RiscActive', read_bool(base_register=1013, bit=6)), + CsvSignal('/Battery/Devices/Eoc', read_eoc_reached), + CsvSignal('/Battery/Devices/SerialNumber', read_serial_number), + CsvSignal('/Battery/Devices/TimeSinceTOC', time_since_toc_in_time_format), + CsvSignal('/Battery/Devices/MaxChargePower', calc_max_charge_power), + CsvSignal('/Battery/Devices/MaxDischargePower', calc_max_discharge_power), + ] + +def read_warning_and_alarm_flags(): + return [ + # Warnings + CsvSignal('/Battery/Devices/WarningFlags/TaM1', read_bool(base_register=1005, bit=1)), + CsvSignal('/Battery/Devices/WarningFlags/TbM1', read_bool(base_register=1005, bit=4)), + CsvSignal('/Battery/Devices/WarningFlags/VBm1', read_bool(base_register=1005, bit=6)), + CsvSignal('/Battery/Devices/WarningFlags/VBM1', read_bool(base_register=1005, bit=8)), + CsvSignal('/Battery/Devices/WarningFlags/IDM1', read_bool(base_register=1005, bit=10)), + CsvSignal('/Battery/Devices/WarningFlags/vsm1', read_bool(base_register=1005, bit=22)), + CsvSignal('/Battery/Devices/WarningFlags/vsM1', read_bool(base_register=1005, bit=24)), + CsvSignal('/Battery/Devices/WarningFlags/iCM1', read_bool(base_register=1005, bit=26)), + CsvSignal('/Battery/Devices/WarningFlags/iDM1', read_bool(base_register=1005, bit=28)), + CsvSignal('/Battery/Devices/WarningFlags/MID1', read_bool(base_register=1005, bit=30)), + CsvSignal('/Battery/Devices/WarningFlags/BLPW', read_bool(base_register=1005, bit=32)), + CsvSignal('/Battery/Devices/WarningFlags/CCBF', read_bool(base_register=1005, bit=33)), + CsvSignal('/Battery/Devices/WarningFlags/Ah_W', read_bool(base_register=1005, bit=35)), + CsvSignal('/Battery/Devices/WarningFlags/MPMM', read_bool(base_register=1005, bit=38)), + CsvSignal('/Battery/Devices/WarningFlags/TCdi', read_bool(base_register=1005, bit=40)), + CsvSignal('/Battery/Devices/WarningFlags/LMPW', read_bool(base_register=1005, bit=44)), + CsvSignal('/Battery/Devices/WarningFlags/TOCW', read_bool(base_register=1005, bit=47)), + CsvSignal('/Battery/Devices/WarningFlags/BUSL', read_bool(base_register=1005, bit=49)), + ], [ + # Alarms + CsvSignal('/Battery/Devices/AlarmFlags/Tam', read_bool(base_register=1005, bit=0)), + CsvSignal('/Battery/Devices/AlarmFlags/TaM2', read_bool(base_register=1005, bit=2)), + CsvSignal('/Battery/Devices/AlarmFlags/Tbm', read_bool(base_register=1005, bit=3)), + CsvSignal('/Battery/Devices/AlarmFlags/TbM2', read_bool(base_register=1005, bit=5)), + CsvSignal('/Battery/Devices/AlarmFlags/VBm2', read_bool(base_register=1005, bit=7)), + CsvSignal('/Battery/Devices/AlarmFlags/VBM2', read_bool(base_register=1005, bit=9)), + CsvSignal('/Battery/Devices/AlarmFlags/IDM2', read_bool(base_register=1005, bit=11)), + CsvSignal('/Battery/Devices/AlarmFlags/ISOB', read_bool(base_register=1005, bit=12)), + CsvSignal('/Battery/Devices/AlarmFlags/MSWE', read_bool(base_register=1005, bit=13)), + CsvSignal('/Battery/Devices/AlarmFlags/FUSE', read_bool(base_register=1005, bit=14)), + CsvSignal('/Battery/Devices/AlarmFlags/HTRE', read_bool(base_register=1005, bit=15)), + CsvSignal('/Battery/Devices/AlarmFlags/TCPE', read_bool(base_register=1005, bit=16)), + CsvSignal('/Battery/Devices/AlarmFlags/STRE', read_bool(base_register=1005, bit=17)), + CsvSignal('/Battery/Devices/AlarmFlags/CME', read_bool(base_register=1005, bit=18)), + CsvSignal('/Battery/Devices/AlarmFlags/HWFL', read_bool(base_register=1005, bit=19)), + CsvSignal('/Battery/Devices/AlarmFlags/HWEM', read_bool(base_register=1005, bit=20)), + CsvSignal('/Battery/Devices/AlarmFlags/ThM', read_bool(base_register=1005, bit=21)), + CsvSignal('/Battery/Devices/AlarmFlags/vsm2', read_bool(base_register=1005, bit=23)), + CsvSignal('/Battery/Devices/AlarmFlags/vsM2', read_bool(base_register=1005, bit=25)), + CsvSignal('/Battery/Devices/AlarmFlags/iCM2', read_bool(base_register=1005, bit=27)), + CsvSignal('/Battery/Devices/AlarmFlags/iDM2', read_bool(base_register=1005, bit=29)), + CsvSignal('/Battery/Devices/AlarmFlags/MID2', read_bool(base_register=1005, bit=31)), + CsvSignal('/Battery/Devices/AlarmFlags/HTFS', read_bool(base_register=1005, bit=42)), + CsvSignal('/Battery/Devices/AlarmFlags/DATA', read_bool(base_register=1005, bit=43)), + CsvSignal('/Battery/Devices/AlarmFlags/LMPA', read_bool(base_register=1005, bit=45)), + CsvSignal('/Battery/Devices/AlarmFlags/HEBT', read_bool(base_register=1005, bit=46)), + CsvSignal('/Battery/Devices/AlarmFlags/CURM', read_bool(base_register=1005, bit=48)), + ] diff --git a/python/dbus-fz-sonick-48tl-with-s3/start.sh b/python/dbus-fz-sonick-48tl-with-s3/start.sh new file mode 100755 index 000000000..83860d3e4 --- /dev/null +++ b/python/dbus-fz-sonick-48tl-with-s3/start.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +. /opt/victronenergy/serial-starter/run-service.sh + +app="/opt/innovenergy/dbus-fzsonick-48tl/dbus-fzsonick-48tl.py" +args="$tty" +start $args From 636d7e3ff4dc729c1ceb36ef76869a1cfa216117 Mon Sep 17 00:00:00 2001 From: kostas Date: Mon, 3 Jun 2024 12:58:04 +0200 Subject: [PATCH 09/25] extarct s3 data with decompression --- csharp/App/ResetBms/ResetBms.csproj | 14 + .../dbus-fz-sonick-48tl-with-s3/__init__.py | 0 .../opt/dbus-fz-sonick-48tl-with-s3/config.py | 59 ++ .../dbus-fz-sonick-48tl-with-s3/controller.py | 644 +++++++++++++++++ .../dbus-fz-sonick-48tl-with-s3/convert.py | 192 +++++ .../opt/dbus-fz-sonick-48tl-with-s3/data.py | 134 ++++ .../dbus-fzsonick-48tl.py | 674 ++++++++++++++++++ .../dbus-fz-sonick-48tl-with-s3/dbus_types.py | 156 ++++ .../ext/velib_python/ve_utils.py | 202 ++++++ .../ext/velib_python/vedbus.py | 496 +++++++++++++ .../old_signals.py | 547 ++++++++++++++ .../dbus-fz-sonick-48tl-with-s3/service/down | 0 .../service/log/down | 0 .../service/log/run | 3 + .../dbus-fz-sonick-48tl-with-s3/service/run | 4 + .../dbus-fz-sonick-48tl-with-s3/signals.py | 374 ++++++++++ .../opt/dbus-fz-sonick-48tl-with-s3/start.sh | 7 + .../old_signals.py | 547 ++++++++++++++ .../dbus-fz-sonick-48tl-with-s3/service/run | 4 + 19 files changed, 4057 insertions(+) create mode 100644 csharp/App/ResetBms/ResetBms.csproj create mode 100644 firmware/opt/dbus-fz-sonick-48tl-with-s3/__init__.py create mode 100755 firmware/opt/dbus-fz-sonick-48tl-with-s3/config.py create mode 100755 firmware/opt/dbus-fz-sonick-48tl-with-s3/controller.py create mode 100755 firmware/opt/dbus-fz-sonick-48tl-with-s3/convert.py create mode 100755 firmware/opt/dbus-fz-sonick-48tl-with-s3/data.py create mode 100755 firmware/opt/dbus-fz-sonick-48tl-with-s3/dbus-fzsonick-48tl.py create mode 100644 firmware/opt/dbus-fz-sonick-48tl-with-s3/dbus_types.py create mode 100644 firmware/opt/dbus-fz-sonick-48tl-with-s3/ext/velib_python/ve_utils.py create mode 100644 firmware/opt/dbus-fz-sonick-48tl-with-s3/ext/velib_python/vedbus.py create mode 100755 firmware/opt/dbus-fz-sonick-48tl-with-s3/old_signals.py create mode 100644 firmware/opt/dbus-fz-sonick-48tl-with-s3/service/down create mode 100644 firmware/opt/dbus-fz-sonick-48tl-with-s3/service/log/down create mode 100755 firmware/opt/dbus-fz-sonick-48tl-with-s3/service/log/run create mode 100755 firmware/opt/dbus-fz-sonick-48tl-with-s3/service/run create mode 100644 firmware/opt/dbus-fz-sonick-48tl-with-s3/signals.py create mode 100755 firmware/opt/dbus-fz-sonick-48tl-with-s3/start.sh create mode 100755 python/dbus-fz-sonick-48tl-with-s3/old_signals.py create mode 100755 python/dbus-fz-sonick-48tl-with-s3/service/run diff --git a/csharp/App/ResetBms/ResetBms.csproj b/csharp/App/ResetBms/ResetBms.csproj new file mode 100644 index 000000000..394fd6b96 --- /dev/null +++ b/csharp/App/ResetBms/ResetBms.csproj @@ -0,0 +1,14 @@ + + + + + InnovEnergy.App.ResetBms + + + + + + + + + diff --git a/firmware/opt/dbus-fz-sonick-48tl-with-s3/__init__.py b/firmware/opt/dbus-fz-sonick-48tl-with-s3/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/firmware/opt/dbus-fz-sonick-48tl-with-s3/config.py b/firmware/opt/dbus-fz-sonick-48tl-with-s3/config.py new file mode 100755 index 000000000..1d4962daa --- /dev/null +++ b/firmware/opt/dbus-fz-sonick-48tl-with-s3/config.py @@ -0,0 +1,59 @@ +import serial +import logging +from data import read_file_one_line + +# dbus configuration + +CONNECTION = 'Modbus RTU' +PRODUCT_NAME = 'FIAMM 48TL Series Battery' +PRODUCT_ID = 0xB012 # assigned by victron +DEVICE_INSTANCE = 1 +SERVICE_NAME_PREFIX = 'com.victronenergy.battery.' + + +# driver configuration + +SOFTWARE_VERSION = '3.0.0' +UPDATE_INTERVAL = 2000 # milliseconds +#LOG_LEVEL = logging.INFO +LOG_LEVEL = logging.DEBUG + + +# battery config + +V_MAX = 54.2 +V_MIN = 42 +R_STRING_MIN = 0.125 +R_STRING_MAX = 0.250 +I_MAX_PER_STRING = 15 +AH_PER_STRING = 40 +NUM_OF_STRINGS_PER_BATTERY = 5 + +# modbus configuration + +BASE_ADDRESS = 999 +NO_OF_REGISTERS = 64 +MAX_SLAVE_ADDRESS = 25 + + +# RS 485 configuration + +PARITY = serial.PARITY_ODD +TIMEOUT = 0.1 # seconds +BAUD_RATE = 115200 +BYTE_SIZE = 8 +STOP_BITS = 1 +MODE = 'rtu' + +# InnovEnergy IOT configuration + +INSTALLATION_NAME = read_file_one_line('/data/innovenergy/openvpn/installation-name') +INNOVENERGY_SERVER_IP = '10.2.0.1' +INNOVENERGY_SERVER_PORT = 8134 +INNOVENERGY_PROTOCOL_VERSION = '48TL200V3' + + +# S3 Credentials +S3BUCKET = "5-c0436b6a-d276-4cd8-9c44-1eae86cf5d0e" +S3KEY = "EXO6bb63d9bbe5f938a68fa444b" +S3SECRET = "A4-5wIjIlAqn-p0cUkQu0f9fBIrX1V5PGTBDwjsrlR8" diff --git a/firmware/opt/dbus-fz-sonick-48tl-with-s3/controller.py b/firmware/opt/dbus-fz-sonick-48tl-with-s3/controller.py new file mode 100755 index 000000000..749093592 --- /dev/null +++ b/firmware/opt/dbus-fz-sonick-48tl-with-s3/controller.py @@ -0,0 +1,644 @@ +#!/usr/bin/python -u +# coding=utf-8 + +import logging +import os +import time +import states as State +import target_type as TargetType + +from random import randint +from python_libs.ie_dbus.dbus_service import DBusService +from python_libs.ie_utils.main_loop import run_on_main_loop + +# noinspection PyUnreachableCode +if False: + from typing import NoReturn, Optional, Any, Iterable, List + +logging.basicConfig(level=logging.INFO) +_log = logging.getLogger(__name__) + +VERSION = '1.0.0' +PRODUCT = 'Controller' + +GRID_SERVICE_PREFIX = 'com.victronenergy.grid.' +BATTERY_SERVICE_PREFIX = 'com.victronenergy.battery.' +INVERTER_SERVICE_PREFIX = 'com.victronenergy.vebus.' +SYSTEM_SERVICE_PREFIX = 'com.victronenergy.system' +HUB4_SERVICE_PREFIX = 'com.victronenergy.hub4' +SETTINGS_SERVICE_PREFIX = 'com.victronenergy.settings' + +UPDATE_PERIOD_MS = 2000 +MAX_POWER_PER_BATTERY = 2500 + +MAX_DAYS_WITHOUT_EOC = 7 +SECONDS_PER_DAY = 24 * 60 * 60 + +GRID_SET_POINT_SETTING = PRODUCT + '/GridSetPoint' +LAST_EOC_SETTING = PRODUCT + '/LastEOC' +CALIBRATION_CHARGE_START_TIME_OF_DAY_SETTING = PRODUCT + '/CalibrationChargeStartTime' + +HEAT_LOSS = 150 # W +P_CONST = 0.5 # W/W + +Epoch = int +Seconds = int + + +def time_now(): + return int(time.time()) + + +class Controller(object): + + def __init__(self, measurement, target, target_type, state): + # type: (float, float, int, int) -> NoReturn + self.target_type = target_type + self.target = target + self.measurement = measurement + self.state = state + + d_p = target - measurement + self.delta = d_p * P_CONST + + @staticmethod + def min(controllers): + # type: (Iterable[Controller]) -> Controller + return min(controllers, key=lambda c: c.delta) + + @staticmethod + def max(controllers): + # type: (Iterable[Controller]) -> Controller + return max(controllers, key=lambda c: c.delta) + + def clamp(self, lower_limit_controllers, upper_limit_controllers): + # type: (List[Controller],List[Controller]) -> Controller + c_min = Controller.min(upper_limit_controllers + [self]) + return Controller.max(lower_limit_controllers + [c_min]) + + +# noinspection PyMethodMayBeStatic +class InnovEnergyController(DBusService): + + def __init__(self): + + super(InnovEnergyController, self).__init__(PRODUCT.lower()) + + self.settings.add_setting(path=LAST_EOC_SETTING, default_value=0) # unix epoch timestamp + self.settings.add_setting(path=GRID_SET_POINT_SETTING, default_value=0) # grid setpoint, Watts + + self.settings.add_setting(path=CALIBRATION_CHARGE_START_TIME_OF_DAY_SETTING, default_value=32400) # 09:00 + + self.own_properties.set('/ProductName', PRODUCT) + self.own_properties.set('/Mgmt/ProcessName', __file__) + self.own_properties.set('/Mgmt/ProcessVersion', VERSION) + self.own_properties.set('/Mgmt/Connection', 'dbus') + self.own_properties.set('/ProductId', PRODUCT) + self.own_properties.set('/FirmwareVersion', VERSION) + self.own_properties.set('/HardwareVersion', VERSION) + self.own_properties.set('/Connected', 1) + self.own_properties.set('/TimeToCalibrationCharge', 'unknown') + self.own_properties.set('/State', 0) + + self.phases = [ + p for p in ['/Hub4/L1/AcPowerSetpoint', '/Hub4/L2/AcPowerSetpoint', '/Hub4/L3/AcPowerSetpoint'] + if self.remote_properties.exists(self.inverter_service + p) + ] + + self.n_phases = len(self.phases) + print ('The system has ' + str(self.n_phases) + ' phase' + ('s' if self.n_phases != 1 else '')) + + self.max_inverter_power = 32700 + # ^ defined in https://github.com/victronenergy/dbus_modbustcp/blob/master/CCGX-Modbus-TCP-register-list.xlsx + + def clamp_power_command(self, value): + # type: (float) -> int + + value = max(value, -self.max_inverter_power) + value = min(value, self.max_inverter_power) + + return int(value) + + def get_service(self, prefix): + # type: (str) -> Optional[unicode] + service = next((s for s in self.available_services if s.startswith(prefix)), None) + + if service is None: + raise Exception('no service matching ' + prefix + '* available') + + return service + + def is_service_available(self, prefix): + # type: (str) -> bool + return next((True for s in self.available_services if s.startswith(prefix)), False) + + @property + def battery_service(self): + # type: () -> Optional[unicode] + return self.get_service(BATTERY_SERVICE_PREFIX) + + @property + def battery_available(self): + # type: () -> bool + return self.is_service_available(BATTERY_SERVICE_PREFIX) + + @property + def grid_service(self): + # type: () -> Optional[unicode] + return self.get_service(GRID_SERVICE_PREFIX) + + @property + def grid_meter_available(self): + # type: () -> bool + return self.is_service_available(GRID_SERVICE_PREFIX) + + @property + def inverter_service(self): + # type: () -> Optional[unicode] + return self.get_service(INVERTER_SERVICE_PREFIX) + + @property + def inverter_available(self): + # type: () -> bool + return self.is_service_available(INVERTER_SERVICE_PREFIX) + + @property + def system_service(self): + # type: () -> Optional[unicode] + return self.get_service(SYSTEM_SERVICE_PREFIX) + + @property + def system_service_available(self): + # type: () -> bool + return self.is_service_available(SYSTEM_SERVICE_PREFIX) + + @property + def hub4_service(self): + # type: () -> Optional[unicode] + return self.get_service(HUB4_SERVICE_PREFIX) + + @property + def hub4_service_available(self): + # type: () -> bool + return self.is_service_available(HUB4_SERVICE_PREFIX) + + @property + def inverter_power_setpoint(self): + # type: () -> float + return sum((self.get_inverter_prop(p) for p in self.phases)) + + def get_battery_prop(self, dbus_path): + # type: (str) -> Any + battery_service = self.battery_service + return self.remote_properties.get(battery_service + dbus_path).value + + def get_grid_prop(self, dbus_path): + # type: (str) -> Any + return self.remote_properties.get(self.grid_service + dbus_path).value + + def get_inverter_prop(self, dbus_path): + # type: (str) -> Any + return self.remote_properties.get(self.inverter_service + dbus_path).value + + def get_system_prop(self, dbus_path): + # type: (str) -> Any + system_service = self.system_service + return self.remote_properties.get(system_service + dbus_path).value + + def get_hub4_prop(self, dbus_path): + # type: (str) -> Any + hub4_service = self.hub4_service + return self.remote_properties.get(hub4_service + dbus_path).value + + def set_settings_prop(self, dbus_path, value): + # type: (str, Any) -> bool + return self.remote_properties.set(SETTINGS_SERVICE_PREFIX + dbus_path, value) + + def set_inverter_prop(self, dbus_path, value): + # type: (str, Any) -> bool + inverter_service = self.inverter_service + return self.remote_properties.set(inverter_service + dbus_path, value) + + @property + def max_battery_charge_power(self): + # type: () -> int + return self.get_battery_prop('/Info/MaxChargePower') + + @property + def max_battery_discharge_power(self): + # type: () -> int + return self.get_battery_prop('/Info/MaxDischargePower') + + @property + def max_configured_charge_power(self): + # type: () -> Optional[int] + max_power = self.settings.get('/Settings/CGwacs/MaxChargePower') + return max_power if max_power >= 0 else None + + @property + def max_configured_discharge_power(self): # unsigned + # type: () -> Optional[int] + max_power = self.settings.get('/Settings/CGwacs/MaxDischargePower') + return max_power if max_power >= 0 else None + + @property + def max_charge_power(self): + # type: () -> int + if self.max_configured_charge_power is None: + return self.max_battery_charge_power + else: + return min(self.max_battery_charge_power, self.max_configured_charge_power) + + @property + def max_discharge_power(self): # unsigned + # type: () -> int + if self.max_configured_discharge_power is None: + return self.max_battery_discharge_power + else: + return min(self.max_battery_discharge_power, self.max_configured_discharge_power) + + def set_inverter_power_setpoint(self, power): + # type: (float) -> NoReturn + + if self.settings.get('/Settings/CGwacs/BatteryLife/State') == 9: + self.settings.set('/Settings/CGwacs/BatteryLife/State', 0) # enables scheduled charge + self.settings.set('/Settings/CGwacs/Hub4Mode', 3) # disable hub4 + self.set_inverter_prop('/Hub4/DisableCharge', 0) + self.set_inverter_prop('/Hub4/DisableFeedIn', 0) + + power = self.clamp_power_command(power / self.n_phases) + for p in self.phases: + self.set_inverter_prop(p, power + randint(-1, 1)) # use randint to force dbus re-send + + def set_controller_state(self, state): + # type: (int) -> NoReturn + self.own_properties.set('/State', state) + + @property + def grid_power(self): + # type: () -> Optional[float] + try: + return self.get_grid_prop('/Ac/Power') + except: + return None + + @property + def battery_cold(self): + # type: () -> bool + return self.get_battery_prop('/IoStatus/BatteryCold') == 1 + + @property + def eoc_reached(self): + # type: () -> bool + if not self.battery_available: + return False + + return min(self.get_battery_prop('/EOCReached')) == 1 + + @property + def battery_power(self): + # type: () -> float + return self.get_battery_prop('/Dc/0/Power') + + @property + def inverter_ac_in_power(self): + # type: () -> float + return self.get_inverter_prop('/Ac/ActiveIn/P') + + @property + def inverter_ac_out_power(self): + # type: () -> float + return self.get_inverter_prop('/Ac/Out/P') + + @property + def soc(self): + # type: () -> float + return self.get_battery_prop('/Soc') + + @property + def n_batteries(self): + # type: () -> int + return self.get_battery_prop('/NbOfBatteries') + + @property + def min_soc(self): + # type: () -> float + return self.settings.get('/Settings/CGwacs/BatteryLife/MinimumSocLimit') + + @property + def should_hold_min_soc(self): + # type: () -> bool + return self.min_soc <= self.soc <= self.min_soc + 5 + + @property + def utc_offset(self): + # type: () -> int + + # stackoverflow.com/a/1301528 + # stackoverflow.com/a/3168394 + + os.environ['TZ'] = self.settings.get('/Settings/System/TimeZone') + time.tzset() + is_dst = time.daylight and time.localtime().tm_isdst > 0 + return -(time.altzone if is_dst else time.timezone) + + @property + def grid_set_point(self): + # type: () -> float + return self.settings.get('/Settings/CGwacs/AcPowerSetPoint') + + @property + def time_to_calibration_charge_str(self): + # type: () -> str + return self.own_properties.get('/TimeToCalibrationCharge').text + + @property + def calibration_charge_deadline(self): + # type: () -> Epoch + + utc_offset = self.utc_offset + ultimate_deadline = self.settings.get(LAST_EOC_SETTING) + MAX_DAYS_WITHOUT_EOC * SECONDS_PER_DAY + midnight_before_udl = int((ultimate_deadline + utc_offset) / SECONDS_PER_DAY) * SECONDS_PER_DAY - utc_offset # round off to last midnight + + dead_line = midnight_before_udl + self.calibration_charge_start_time_of_day + + while dead_line > ultimate_deadline: # should fire at most once, but let's be defensive... + dead_line -= SECONDS_PER_DAY # too late, advance one day + + return dead_line + + @property + def time_to_calibration_charge(self): + # type: () -> Seconds + return self.calibration_charge_deadline - time_now() + + @property + def grid_blackout(self): + # type: () -> bool + return self.get_inverter_prop('/Leds/Mains') < 1 + + @property + def scheduled_charge(self): + # type: () -> bool + return self.get_hub4_prop('/Overrides/ForceCharge') != 0 + + @property + def calibration_charge_start_time_of_day(self): + # type: () -> Seconds + return self.settings.get(CALIBRATION_CHARGE_START_TIME_OF_DAY_SETTING) # seconds since midnight + + @property + def must_do_calibration_charge(self): + # type: () -> bool + return self.time_to_calibration_charge <= 0 + + def controller_charge_to_min_soc(self): + # type: () -> Controller + + return Controller( + measurement=self.battery_power, + target=self.max_charge_power, + target_type=TargetType.BATTERY_DC, + state=State.CHARGE_TO_MIN_SOC + ) + + def controller_hold_min_soc(self): + # type: () -> Controller + + # TODO: explain + + a = -4 * HEAT_LOSS * self.n_batteries + b = -a * (self.min_soc + .5) + + target_dc_power = a * self.soc + b + + return Controller( + measurement = self.battery_power, + target = target_dc_power, + target_type = TargetType.BATTERY_DC, + state = State.HOLD_MIN_SOC + ) + + def controller_calibration_charge(self): + # type: () -> Controller + + return Controller( + measurement = self.battery_power, + target = self.max_charge_power, + target_type = TargetType.BATTERY_DC, + state = State.CALIBRATION_CHARGE + ) + + def controller_limit_discharge_power(self): # signed + # type: () -> Controller + + return Controller( + measurement = self.battery_power, + target = -self.max_discharge_power, # add sign! + target_type = TargetType.BATTERY_DC, + state = State.LIMIT_DISCHARGE_POWER + ) + + def controller_limit_charge_power(self): + # type: () -> Controller + return Controller( + measurement = self.battery_power, + target = self.max_charge_power, + target_type = TargetType.BATTERY_DC, + state = State.LIMIT_CHARGE_POWER + ) + + def controller_optimize_self_consumption(self): + # type: () -> Controller + + return Controller( + measurement = self.grid_power, + target = self.grid_set_point, + target_type = TargetType.GRID_AC, + state = State.OPTIMIZE_SELF_CONSUMPTION + ) + + def controller_heating(self): + # type: () -> Controller + + return Controller( + measurement = self.battery_power, + target = self.max_charge_power, + target_type = TargetType.BATTERY_DC, + state = State.HEATING + ) + + def controller_scheduled_charge(self): + # type: () -> Controller + + return Controller( + measurement = self.battery_power, + target = self.max_charge_power, + target_type = TargetType.BATTERY_DC, + state = State.SCHEDULED_CHARGE + ) + + def controller_no_grid_meter(self): + # type: () -> Controller + + return Controller( + measurement = self.battery_power, + target = self.max_charge_power, + target_type = TargetType.BATTERY_DC, + state = State.NO_GRID_METER_AVAILABLE + ) + + def controller_no_battery(self): + # type: () -> Controller + + return Controller( + measurement = self.inverter_ac_in_power, + target = 0, + target_type = TargetType.INVERTER_AC_IN, + state = State.NO_BATTERY_AVAILABLE + ) + + def controller_bridge_grid_blackout(self): + # type: () -> Controller + + return Controller( + measurement = 0, + target = 0, + target_type = TargetType.GRID_AC, + state = State.BRIDGE_GRID_BLACKOUT + ) + + def update_eoc(self): + + if self.eoc_reached: + print('battery has reached EOC') + self.settings.set(LAST_EOC_SETTING, time_now()) + + self.publish_time_to_calibration_charge() + + def publish_time_to_calibration_charge(self): + + total_seconds = self.time_to_calibration_charge + + if total_seconds <= 0: + time_to_eoc_str = 'now' + else: + total_minutes, seconds = divmod(total_seconds, 60) + total_hours, minutes = divmod(total_minutes, 60) + total_days, hours = divmod(total_hours, 24) + + days_str = (str(total_days) + 'd') if total_days > 0 else '' + hours_str = (str(hours) + 'h') if total_hours > 0 else '' + minutes_str = (str(minutes) + 'm') if total_days == 0 else '' + + time_to_eoc_str = "{0} {1} {2}".format(days_str, hours_str, minutes_str).strip() + + self.own_properties.set('/TimeToCalibrationCharge', time_to_eoc_str) + + def print_system_stats(self, controller): + # type: (Controller) -> NoReturn + + def soc_setpoint(): + if controller.state == State.CALIBRATION_CHARGE or controller.state == State.NO_GRID_METER_AVAILABLE: + return ' => 100%' + if controller.state == State.CHARGE_TO_MIN_SOC: + return ' => ' + str(int(self.min_soc)) + '%' + return '' + + def setpoint(target_type): + if target_type != controller.target_type: + return '' + return ' => ' + str(int(controller.target)) + 'W' + + def p(power): + # type: (Optional[float]) -> str + if power is None: + return ' --- W' + else: + return str(int(power)) + 'W' + + ac_loads = None if self.grid_power is None else self.grid_power - self.inverter_ac_in_power + delta = p(controller.delta) if controller.delta < 0 else '+' + p(controller.delta) + battery_power = self.battery_power if self.battery_available else None + soc_ = str(self.soc) + '%' if self.battery_available else '---' + + print (State.name_of[controller.state]) + print ('') + print ('time to CC: ' + self.time_to_calibration_charge_str) + print (' SOC: ' + soc_ + soc_setpoint()) + print (' grid: ' + p(self.grid_power) + setpoint(TargetType.GRID_AC)) + print (' battery: ' + p(battery_power) + setpoint(TargetType.BATTERY_DC)) + print (' AC in: ' + p(self.inverter_ac_in_power) + ' ' + delta) + print (' AC out: ' + p(self.inverter_ac_out_power)) + print (' AC loads: ' + p(ac_loads)) + + def choose_controller(self): + # type: () -> Controller + + if self.grid_blackout: + return self.controller_bridge_grid_blackout() + + if not self.battery_available: + return self.controller_no_battery() + + if self.battery_cold: + return self.controller_heating() + + if self.scheduled_charge: + return self.controller_scheduled_charge() + + if self.must_do_calibration_charge: + return self.controller_calibration_charge() + + if self.soc < self.min_soc: + return self.controller_charge_to_min_soc() + + if not self.grid_meter_available: + return self.controller_no_grid_meter() + + hold_min_soc = self.controller_hold_min_soc() + limit_discharge_power = self.controller_limit_discharge_power() # signed + + lower_limit = [limit_discharge_power, hold_min_soc] + + # No upper limit. We no longer actively limit charge power. DC/DC Charger inside the BMS will do that for us. + upper_limit = [] + + optimize_self_consumption = self.controller_optimize_self_consumption() + + return optimize_self_consumption.clamp(lower_limit, upper_limit) + + def update(self): + + print('iteration started\n') + + self.update_eoc() + + if self.inverter_available: + + controller = self.choose_controller() + power = self.inverter_ac_in_power + controller.delta + + self.set_inverter_power_setpoint(power) + self.set_controller_state(controller.state) + self.print_system_stats(controller) # for debug + + else: + self.set_controller_state(State.NO_INVERTER_AVAILABLE) + print('inverter not available!') + + print('\niteration finished\n') + + +def main(): + + print('starting ' + __file__) + + with InnovEnergyController() as service: + run_on_main_loop(service.update, UPDATE_PERIOD_MS) + + print(__file__ + ' has shut down') + + +if __name__ == '__main__': + main() diff --git a/firmware/opt/dbus-fz-sonick-48tl-with-s3/convert.py b/firmware/opt/dbus-fz-sonick-48tl-with-s3/convert.py new file mode 100755 index 000000000..7138d856a --- /dev/null +++ b/firmware/opt/dbus-fz-sonick-48tl-with-s3/convert.py @@ -0,0 +1,192 @@ +import struct + +import config as cfg +from data import LedState, BatteryStatus + +# trick the pycharm type-checker into thinking Callable is in scope, not used at runtime +# noinspection PyUnreachableCode +if False: + from typing import Callable, List, Iterable, Union, AnyStr, Any + + +def read_bool(base_register, bit): + # type: (int, int) -> Callable[[BatteryStatus], bool] + + # TODO: explain base register offset + register = base_register + int(bit/16) + bit = bit % 16 + + def get_value(status): + # type: (BatteryStatus) -> bool + value = status.modbus_data[register - cfg.BASE_ADDRESS] + return value & (1 << bit) > 0 + + return get_value + + +def read_float(register, scale_factor=1.0, offset=0.0): + # type: (int, float, float) -> Callable[[BatteryStatus], float] + + def get_value(status): + # type: (BatteryStatus) -> float + value = status.modbus_data[register - cfg.BASE_ADDRESS] + + if value >= 0x8000: # convert to signed int16 + value -= 0x10000 # fiamm stores their integers signed AND with sign-offset @#%^&! + + return (value + offset) * scale_factor + + return get_value + + +def read_registers(register, count): + # type: (int, int) -> Callable[[BatteryStatus], List[int]] + + start = register - cfg.BASE_ADDRESS + end = start + count + + def get_value(status): + # type: (BatteryStatus) -> List[int] + return [x for x in status.modbus_data[start:end]] + + return get_value + + +def comma_separated(values): + # type: (Iterable[str]) -> str + return ", ".join(set(values)) + + +def count_bits(base_register, nb_of_registers, nb_of_bits, first_bit=0): + # type: (int, int, int, int) -> Callable[[BatteryStatus], int] + + get_registers = read_registers(base_register, nb_of_registers) + end_bit = first_bit + nb_of_bits + + def get_value(status): + # type: (BatteryStatus) -> int + + registers = get_registers(status) + bin_registers = [bin(x)[-1:1:-1] for x in registers] # reverse the bits in each register so that bit0 is to the left + str_registers = [str(x).ljust(16, "0") for x in bin_registers] # add leading zeroes, so all registers are 16 chars long + bit_string = ''.join(str_registers) # join them, one long string of 0s and 1s + filtered_bits = bit_string[first_bit:end_bit] # take the first nb_of_bits bits starting at first_bit + + return filtered_bits.count('1') # count 1s + + return get_value + + +def read_led_state(register, led): + # type: (int, int) -> Callable[[BatteryStatus], int] + + read_lo = read_bool(register, led * 2) + read_hi = read_bool(register, led * 2 + 1) + + def get_value(status): + # type: (BatteryStatus) -> int + + lo = read_lo(status) + hi = read_hi(status) + + if hi: + if lo: + return LedState.blinking_fast + else: + return LedState.blinking_slow + else: + if lo: + return LedState.on + else: + return LedState.off + + return get_value + + +# noinspection PyShadowingNames +def unit(unit): + # type: (unicode) -> Callable[[unicode], unicode] + + def get_text(v): + # type: (unicode) -> unicode + return "{0}{1}".format(str(v), unit) + + return get_text + + +def const(constant): + # type: (any) -> Callable[[any], any] + def get(*args): + return constant + return get + + +def mean(numbers): + # type: (List[Union[float,int]]) -> float + return float(sum(numbers)) / len(numbers) + + +def first(ts, default=None): + return next((t for t in ts), default) + + +def bitfields_to_str(lists): + # type: (List[List[int]]) -> str + + def or_lists(): + # type: () -> Iterable[int] + + length = len(first(lists)) + n_lists = len(lists) + + for i in range(0, length): + e = 0 + for l in range(0, n_lists): + e = e | lists[l][i] + yield e + + hexed = [ + '{0:0>4X}'.format(x) + for x in or_lists() + ] + + return ' '.join(hexed) + + +def pack_string(string): + # type: (AnyStr) -> Any + data = string.encode('UTF-8') + return struct.pack('B', len(data)) + data + + +def read_bitmap(register): + # type: (int) -> Callable[[BatteryStatus], int] + + def get_value(status): + # type: (BatteryStatus) -> int + value = status.modbus_data[register - cfg.BASE_ADDRESS] + return value + + return get_value + +def return_in_list(ts): + return ts + +def first(ts): + return next(t for t in ts) + +def read_hex_string(register, count): + # type: (int, int) -> Callable[[BatteryStatus], str] + """ + reads count consecutive modbus registers from start_address, + and returns a hex representation of it: + e.g. for count=4: DEAD BEEF DEAD BEEF. + """ + start = register - cfg.BASE_ADDRESS + end = start + count + + def get_value(status): + # type: (BatteryStatus) -> str + return ' '.join(['{0:0>4X}'.format(x) for x in status.modbus_data[start:end]]) + + return get_value diff --git a/firmware/opt/dbus-fz-sonick-48tl-with-s3/data.py b/firmware/opt/dbus-fz-sonick-48tl-with-s3/data.py new file mode 100755 index 000000000..9bff4ff93 --- /dev/null +++ b/firmware/opt/dbus-fz-sonick-48tl-with-s3/data.py @@ -0,0 +1,134 @@ +import config as cfg + + +# trick the pycharm type-checker into thinking Callable is in scope, not used at runtime +# noinspection PyUnreachableCode +if False: + from typing import Callable, List, Optional, AnyStr, Union, Any + + +class LedState(object): + """ + from page 6 of the '48TLxxx ModBus Protocol doc' + """ + off = 0 + on = 1 + blinking_slow = 2 + blinking_fast = 3 + + +class LedColor(object): + green = 0 + amber = 1 + blue = 2 + red = 3 + + +class ServiceSignal(object): + + def __init__(self, dbus_path, get_value_or_const, unit=''): + # type: (str, Union[Callable[[],Any],Any], Optional[AnyStr] )->None + + self.get_value_or_const = get_value_or_const + self.dbus_path = dbus_path + self.unit = unit + + @property + def value(self): + try: + return self.get_value_or_const() # callable + except: + return self.get_value_or_const # value + + +class BatterySignal(object): + + def __init__(self, dbus_path, aggregate, get_value, unit=''): + # type: (str, Callable[[List[any]],any], Callable[[BatteryStatus],any], Optional[AnyStr] )->None + """ + A Signal holds all information necessary for the handling of a + certain datum (e.g. voltage) published by the battery. + + :param dbus_path: str + object_path on DBus where the datum needs to be published + + :param aggregate: Iterable[any] -> any + function that combines the values of multiple batteries into one. + e.g. sum for currents, or mean for voltages + + :param get_value: (BatteryStatus) -> any + function to extract the datum from the modbus record, + """ + + self.dbus_path = dbus_path + self.aggregate = aggregate + self.get_value = get_value + self.unit = unit + + +class Battery(object): + + """ Data record to hold hardware and firmware specs of the battery """ + + def __init__(self, slave_address, hardware_version, firmware_version, bms_version, ampere_hours): + # type: (int, str, str, str, int) -> None + self.slave_address = slave_address + self.hardware_version = hardware_version + self.firmware_version = firmware_version + self.bms_version = bms_version + self.ampere_hours = ampere_hours + self.n_strings = int(ampere_hours/cfg.AH_PER_STRING) + self.i_max = self.n_strings * cfg.I_MAX_PER_STRING + self.v_min = cfg.V_MIN + self.v_max = cfg.V_MAX + self.r_int_min = cfg.R_STRING_MIN / self.n_strings + self.r_int_max = cfg.R_STRING_MAX / self.n_strings + + def __str__(self): + return 'slave address = {0}\nhardware version = {1}\nfirmware version = {2}\nbms version = {3}\nampere hours = {4}'.format( + self.slave_address, self.hardware_version, self.firmware_version, self.bms_version, str(self.ampere_hours)) + + +class BatteryStatus(object): + """ + record holding the current status of a battery + """ + def __init__(self, battery, modbus_data): + # type: (Battery, List[int]) -> None + + self.battery = battery + self.modbus_data = modbus_data + + def serialize(self): + # type: () -> str + + b = self.battery + + s = cfg.INNOVENERGY_PROTOCOL_VERSION + '\n' + s += cfg.INSTALLATION_NAME + '\n' + s += str(b.slave_address) + '\n' + s += b.hardware_version + '\n' + s += b.firmware_version + '\n' + s += b.bms_version + '\n' + s += str(b.ampere_hours) + '\n' + + for d in self.modbus_data: + s += str(d) + '\n' + + return s + + +def read_file_one_line(file_name): + + with open(file_name, 'r') as file: + return file.read().replace('\n', '').replace('\r', '').strip() + + +class CsvSignal(object): + def __init__(self, name, get_value, get_text=None): + self.name = name + self.get_value = get_value if callable(get_value) else lambda _: get_value + self.get_text = get_text + + if get_text is None: + self.get_text = "" 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 new file mode 100755 index 000000000..87a64c631 --- /dev/null +++ b/firmware/opt/dbus-fz-sonick-48tl-with-s3/dbus-fzsonick-48tl.py @@ -0,0 +1,674 @@ +#!/usr/bin/python2 -u +# coding=utf-8 + +import logging +import re +import socket +import sys +import gobject +import signals +import config as cfg + +from dbus.mainloop.glib import DBusGMainLoop +from pymodbus.client.sync import ModbusSerialClient as Modbus +from pymodbus.exceptions import ModbusException, ModbusIOException +from pymodbus.other_message import ReportSlaveIdRequest +from pymodbus.pdu import ExceptionResponse +from pymodbus.register_read_message import ReadInputRegistersResponse +from data import BatteryStatus, BatterySignal, Battery, ServiceSignal +from python_libs.ie_dbus.dbus_service import DBusService + +import time +import os +import csv +import pika +import zipfile +import hashlib +import base64 +import hmac +import requests +from datetime import datetime +import io +import json +from convert import first +CSV_DIR = "/data/csv_files/" +INSTALLATION_NAME_FILE = '/data/innovenergy/openvpn/installation-name' + +# trick the pycharm type-checker into thinking Callable is in scope, not used at runtime +# noinspection PyUnreachableCode +if False: + from typing import Callable, List, Iterable, NoReturn + + +RESET_REGISTER = 0x2087 + + +def compress_csv_data(csv_data, file_name="data.csv"): + memory_stream = io.BytesIO() + + # Create a zip archive in the memory buffer + with zipfile.ZipFile(memory_stream, 'w', zipfile.ZIP_DEFLATED) as archive: + # Add CSV data to the ZIP archive using writestr + archive.writestr(file_name, csv_data.encode('utf-8')) + + # Get the compressed byte array from the memory buffer + compressed_bytes = memory_stream.getvalue() + + # Encode the compressed byte array as a Base64 string + base64_string = base64.b64encode(compressed_bytes).decode('utf-8') + + return base64_string + +class S3config: + def __init__(self): + self.bucket = cfg.S3BUCKET + self.region = "sos-ch-dk-2" + self.provider = "exo.io" + self.key = cfg.S3KEY + self.secret = cfg.S3SECRET + self.content_type = "application/base64; charset=utf-8" + + @property + def host(self): + return "{}.{}.{}".format(self.bucket, self.region, self.provider) + + @property + def url(self): + return "https://{}".format(self.host) + + def create_put_request(self, s3_path, data): + headers = self._create_request("PUT", s3_path) + url = "{}/{}".format(self.url, s3_path) + response = requests.put(url, headers=headers, data=data) + return response + + def _create_request(self, method, s3_path): + date = datetime.utcnow().strftime('%a, %d %b %Y %H:%M:%S GMT') + auth = self._create_authorization(method, self.bucket, s3_path, date, self.key, self.secret, self.content_type) + headers = { + "Host": self.host, + "Date": date, + "Authorization": auth, + "Content-Type": self.content_type + } + return headers + + @staticmethod + def _create_authorization(method, bucket, s3_path, date, s3_key, s3_secret, content_type="", md5_hash=""): + payload = "{}\n{}\n{}\n{}\n/{}/{}".format( + method, md5_hash, content_type, date, bucket.strip('/'), s3_path.strip('/') + ) + signature = base64.b64encode( + hmac.new(s3_secret.encode(), payload.encode(), hashlib.sha1).digest() + ).decode() + return "AWS {}:{}".format(s3_key, signature) + + +def SubscribeToQueue(): + try: + connection = pika.BlockingConnection(pika.ConnectionParameters(host="10.2.0.11", + port=5672, + virtual_host="/", + credentials=pika.PlainCredentials("producer", "b187ceaddb54d5485063ddc1d41af66f"))) + channel = connection.channel() + channel.queue_declare(queue="statusQueue", durable=True) + print("Subscribed to queue") + except Exception as ex: + print("An error occurred while connecting to the RabbitMQ queue:", ex) + return channel + + +previous_warnings = {} +previous_alarms = {} + +class MessageType: + ALARM_OR_WARNING = "AlarmOrWarning" + HEARTBEAT = "Heartbeat" + +class AlarmOrWarning: + def __init__(self, description, created_by): + self.date = datetime.now().strftime('%Y-%m-%d') + self.time = datetime.now().strftime('%H:%M:%S') + self.description = description + self.created_by = created_by + + def to_dict(self): + return { + "Date": self.date, + "Time": self.time, + "Description": self.description, + "CreatedBy": self.created_by + } + +channel = SubscribeToQueue() +# Create an S3config instance +s3_config = S3config() +INSTALLATION_ID=int(s3_config.bucket.split('-')[0]) +PRODUCT_ID = 1 +is_first_update = True +prev_status = 0 +subscribed_to_queue_first_time = False +heartbit_interval = 0 + +def update_state_from_dictionaries(current_warnings, current_alarms, node_numbers): + global previous_warnings, previous_alarms, INSTALLATION_ID, PRODUCT_ID, is_first_update, channel, prev_status, heartbit_interval, subscribed_to_queue_first_time + + heartbit_interval += 1 + + if is_first_update: + changed_warnings = current_warnings + changed_alarms = current_alarms + is_first_update = False + else: + changed_alarms = {} + changed_warnings = {} + # calculate the diff in warnings and alarms + prev_alarm_value_list = list(previous_alarms.values()) + alarm_keys = list(previous_alarms.keys()) + + for i, alarm in enumerate(current_alarms.values()): + if alarm != prev_alarm_value_list[i]: + changed_alarms[alarm_keys[i]] = True + else: + changed_alarms[alarm_keys[i]] = False + + prev_warning_value_list=list(previous_warnings.values()) + warning_keys=list(previous_warnings.keys()) + + for i, warning in enumerate(current_warnings.values()): + if warning!=prev_warning_value_list[i]: + changed_warnings[warning_keys[i]]=True + else: + changed_warnings[warning_keys[i]]=False + + status_message = { + "InstallationId": INSTALLATION_ID, + "Product": PRODUCT_ID, + "Status": 0, + "Type": 1, + "Warnings": [], + "Alarms": [] + } + + 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) + + warnings_number_list = [] + for node_number in node_numbers: + cnt = 0 + for warning_value in current_warnings.values(): + 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()) + + 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()) + + if any(current_alarms.values()): + status_message["Status"]=2 + + if not any(current_alarms.values()) and any(current_warnings.values()): + status_message["Status"]=1 + + if not any(current_alarms.values()) and not any(current_warnings.values()): + status_message["Status"]=0 + + if status_message["Status"]!=prev_status or len(status_message["Warnings"])>0 or len(status_message["Alarms"])>0: + prev_status=status_message["Status"] + status_message["Type"]=0 + status_message = json.dumps(status_message) + channel.basic_publish(exchange="", routing_key="statusQueue", body=status_message) + print(status_message) + print("Message sent successfully") + elif heartbit_interval>=15 or not subscribed_to_queue_first_time: + print("Send heartbit message to rabbitmq") + heartbit_interval=0 + subscribed_to_queue_first_time=True + status_message = json.dumps(status_message) + channel.basic_publish(exchange="", routing_key="statusQueue", body=status_message) + + previous_warnings = current_warnings.copy() + previous_alarms = current_alarms.copy() + + return status_message, alarms_number_list, warnings_number_list + +def read_csv_as_string(file_path): + """ + Reads a CSV file from the given path and returns its content as a single string. + """ + try: + # Note: 'encoding' is not available in open() in Python 2.7, so we'll use 'codecs' module. + import codecs + with codecs.open(file_path, 'r', encoding='utf-8') as file: + return file.read() + except IOError as e: + if e.errno == 2: # errno 2 corresponds to "No such file or directory" + print("Error: The file {} does not exist.".format(file_path)) + else: + print("IO error occurred: {}".format(str(e))) + return None + + + +def init_modbus(tty): + # type: (str) -> Modbus + + logging.debug('initializing Modbus') + + return Modbus( + port='/dev/' + tty, + method=cfg.MODE, + baudrate=cfg.BAUD_RATE, + stopbits=cfg.STOP_BITS, + bytesize=cfg.BYTE_SIZE, + timeout=cfg.TIMEOUT, + parity=cfg.PARITY) + + +def init_udp_socket(): + # type: () -> socket + + s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + s.setblocking(False) + + return s + + +def report_slave_id(modbus, slave_address): + # type: (Modbus, int) -> str + + slave = str(slave_address) + + logging.debug('requesting slave id from node ' + slave) + + with modbus: + + request = ReportSlaveIdRequest(unit=slave_address) + response = modbus.execute(request) + + if response is ExceptionResponse or issubclass(type(response), ModbusException): + raise Exception('failed to get slave id from ' + slave + ' : ' + str(response)) + + return response.identifier + + +def identify_battery(modbus, slave_address): + # type: (Modbus, int) -> Battery + + logging.info('identifying battery...') + + hardware_version, bms_version, ampere_hours = parse_slave_id(modbus, slave_address) + firmware_version = read_firmware_version(modbus, slave_address) + + specs = Battery( + slave_address=slave_address, + hardware_version=hardware_version, + firmware_version=firmware_version, + bms_version=bms_version, + ampere_hours=ampere_hours) + + logging.info('battery identified:\n{0}'.format(str(specs))) + + return specs + + +def identify_batteries(modbus): + # type: (Modbus) -> List[Battery] + + def _identify_batteries(): + slave_address = 0 + n_missing = -255 + + while n_missing < 3: + slave_address += 1 + try: + yield identify_battery(modbus, slave_address) + n_missing = 0 + except Exception as e: + logging.info('failed to identify battery at {0} : {1}'.format(str(slave_address), str(e))) + n_missing += 1 + + logging.info('giving up searching for further batteries') + + batteries = list(_identify_batteries()) # dont be lazy! + + n = len(batteries) + logging.info('found ' + str(n) + (' battery' if n == 1 else ' batteries')) + + return batteries + + +def parse_slave_id(modbus, slave_address): + # type: (Modbus, int) -> (str, str, int) + + slave_id = report_slave_id(modbus, slave_address) + + sid = re.sub(r'[^\x20-\x7E]', '', slave_id) # remove weird special chars + + match = re.match('(?P48TL(?P[0-9]+)) *(?P.*)', sid) + + if match is None: + raise Exception('no known battery found') + + return match.group('hw').strip(), match.group('bms').strip(), int(match.group('ah').strip()) + + +def read_firmware_version(modbus, slave_address): + # type: (Modbus, int) -> str + + logging.debug('reading firmware version') + + with modbus: + + response = read_modbus_registers(modbus, slave_address, base_address=1054, count=1) + register = response.registers[0] + + return '{0:0>4X}'.format(register) + + +def read_modbus_registers(modbus, slave_address, base_address=cfg.BASE_ADDRESS, count=cfg.NO_OF_REGISTERS): + # type: (Modbus, int, int, int) -> ReadInputRegistersResponse + + logging.debug('requesting modbus registers {0}-{1}'.format(base_address, base_address + count)) + + return modbus.read_input_registers( + address=base_address, + count=count, + unit=slave_address) + + +def read_battery_status(modbus, battery): + # type: (Modbus, Battery) -> BatteryStatus + """ + Read the modbus registers containing the battery's status info. + """ + + logging.debug('reading battery status') + + with modbus: + data = read_modbus_registers(modbus, battery.slave_address) + return BatteryStatus(battery, data.registers) + + +def publish_values_on_dbus(service, battery_signals, battery_statuses): + # type: (DBusService, Iterable[BatterySignal], Iterable[BatteryStatus]) -> () + + publish_individuals(service, battery_signals, battery_statuses) + publish_aggregates(service, battery_signals, battery_statuses) + + +def publish_aggregates(service, signals, battery_statuses): + # type: (DBusService, Iterable[BatterySignal], Iterable[BatteryStatus]) -> () + + for s in signals: + if s.aggregate is None: + continue + values = [s.get_value(battery_status) for battery_status in battery_statuses] + value = s.aggregate(values) + service.own_properties.set(s.dbus_path, value, s.unit) + + +def publish_individuals(service, signals, battery_statuses): + # type: (DBusService, Iterable[BatterySignal], Iterable[BatteryStatus]) -> () + + for signal in signals: + for battery_status in battery_statuses: + address = battery_status.battery.slave_address + dbus_path = '/_Battery/' + str(address) + signal.dbus_path + value = signal.get_value(battery_status) + service.own_properties.set(dbus_path, value, signal.unit) + + +def publish_service_signals(service, signals): + # type: (DBusService, Iterable[ServiceSignal]) -> NoReturn + + for signal in signals: + service.own_properties.set(signal.dbus_path, signal.value, signal.unit) + + +def upload_status_to_innovenergy(sock, statuses): + # type: (socket, Iterable[BatteryStatus]) -> bool + + logging.debug('upload status') + + try: + for s in statuses: + sock.sendto(s.serialize(), (cfg.INNOVENERGY_SERVER_IP, cfg.INNOVENERGY_SERVER_PORT)) + except: + logging.debug('FAILED') + return False + else: + return True + + +def print_usage(): + print ('Usage: ' + __file__ + ' ') + print ('Example: ' + __file__ + ' ttyUSB0') + + +def parse_cmdline_args(argv): + # type: (List[str]) -> str + + if len(argv) == 0: + logging.info('missing command line argument for tty device') + print_usage() + sys.exit(1) + + return argv[0] + + +def reset_batteries(modbus, batteries): + # type: (Modbus, Iterable[Battery]) -> NoReturn + + logging.info('Resetting batteries...') + + for battery in batteries: + + result = modbus.write_registers(RESET_REGISTER, [1], unit=battery.slave_address) + + # expecting a ModbusIOException (timeout) + # BMS can no longer reply because it is already reset + success = isinstance(result, ModbusIOException) + + outcome = 'successfully' if success else 'FAILED to' + logging.info('Battery {0} {1} reset'.format(str(battery.slave_address), outcome)) + + logging.info('Shutting down fz-sonick driver') + exit(0) + + +alive = True # global alive flag, watchdog_task clears it, update_task sets it + + +def create_update_task(modbus, service, batteries): + # type: (Modbus, DBusService, Iterable[Battery]) -> Callable[[],bool] + """ + Creates an update task which runs the main update function + and resets the alive flag + """ + _socket = init_udp_socket() + _signals = signals.init_battery_signals() + + csv_signals = signals.create_csv_signals(first(batteries).firmware_version) + node_numbers = [battery.slave_address for battery in batteries] + warnings_signals, alarm_signals = signals.read_warning_and_alarm_flags() + current_warnings = {} + current_alarms = {} + + def update_task(): + # type: () -> bool + + global alive + + logging.debug('starting update cycle') + + if service.own_properties.get('/ResetBatteries').value == 1: + reset_batteries(modbus, batteries) + + statuses = [read_battery_status(modbus, battery) for battery in 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) + value = s.get_value(statuses[i]) + current_warnings[signal_name] = value + for s in alarm_signals: + signal_name = insert_id(s.name, i+1) + value = s.get_value(statuses[i]) + current_alarms[signal_name] = value + + status_message, alarms_number_list, warnings_number_list = update_state_from_dictionaries(current_warnings, current_alarms, node_numbers) + + publish_values_on_dbus(service, _signals, statuses) + + create_csv_files(csv_signals, statuses, node_numbers, alarms_number_list, warnings_number_list) + + upload_status_to_innovenergy(_socket, statuses) + + logging.debug('finished update cycle\n') + + alive = True + + return True + + return update_task + +def manage_csv_files(directory_path, max_files=20): + csv_files = [f for f in os.listdir(directory_path)] + 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: + file_to_delete = os.path.join(directory_path, csv_files.pop(0)) + os.remove(file_to_delete) +def insert_id(path, id_number): + parts = path.split("/") + insert_position = parts.index("Devices") + 1 + parts.insert(insert_position, str(id_number)) + return "/".join(parts) + +def create_csv_files(signals, statuses, node_numbers, alarms_number_list, warnings_number_list): + timestamp = int(time.time()) + if timestamp % 2 != 0: + timestamp-=1 + if not os.path.exists(CSV_DIR): + os.makedirs(CSV_DIR) + csv_filename = "{}.csv".format(timestamp) + csv_path = os.path.join(CSV_DIR, csv_filename) + + with open(csv_path, 'ab') as csvfile: + csv_writer = csv.writer(csvfile, delimiter=';') + nodes_config_path = "/Config/Devices/BatteryNodes" + nodes_list = ",".join(str(node) for node in node_numbers) + config_row = [nodes_config_path, nodes_list, ""] + csv_writer.writerow(config_row) + for i, node in enumerate(node_numbers): + csv_writer.writerow(["/Battery/Devices/{}/Alarms".format(str(i+1)), alarms_number_list[i], ""]) + csv_writer.writerow(["/Battery/Devices/{}/Warnings".format(str(i+1)), warnings_number_list[i], ""]) + for s in signals: + signal_name = insert_id(s.name, i+1) + value = s.get_value(statuses[i]) + row_values = [signal_name, value, s.get_text] + csv_writer.writerow(row_values) + + csv_data = read_csv_as_string(csv_path) + + if csv_data is None: + print("error while reading csv as string") + return + + # zip-comp additions + compressed_csv = compress_csv_data(csv_data) + compressed_filename = "{}.csv".format(timestamp) + + response = s3_config.create_put_request(compressed_filename, compressed_csv) + if response.status_code == 200: + #os.remove(csv_path) + print("Success") + else: + failed_dir = os.path.join(CSV_DIR, "failed") + if not os.path.exists(failed_dir): + os.makedirs(failed_dir) + failed_path = os.path.join(failed_dir, csv_filename) + os.rename(csv_path, failed_path) + print("Uploading failed") + manage_csv_files(failed_dir, 10) + + manage_csv_files(CSV_DIR) + + +def create_watchdog_task(main_loop): + # type: (DBusGMainLoop) -> Callable[[],bool] + """ + Creates a Watchdog task that monitors the alive flag. + The watchdog kills the main loop if the alive flag is not periodically reset by the update task. + Who watches the watchdog? + """ + def watchdog_task(): + # type: () -> bool + + global alive + + if alive: + logging.debug('watchdog_task: update_task is alive') + alive = False + return True + else: + logging.info('watchdog_task: killing main loop because update_task is no longer alive') + main_loop.quit() + return False + + return watchdog_task + + +def main(argv): + # type: (List[str]) -> () + print("INSIDE DBUS SONICK") + logging.basicConfig(level=cfg.LOG_LEVEL) + logging.info('starting ' + __file__) + + tty = parse_cmdline_args(argv) + modbus = init_modbus(tty) + + batteries = identify_batteries(modbus) + + if len(batteries) <= 0: + sys.exit(2) + + service = DBusService(service_name=cfg.SERVICE_NAME_PREFIX + tty) + + service.own_properties.set('/ResetBatteries', value=False, writable=True) # initial value = False + + main_loop = gobject.MainLoop() + + service_signals = signals.init_service_signals(batteries) + publish_service_signals(service, service_signals) + + update_task = create_update_task(modbus, service, batteries) + update_task() # run it right away, so that all props are initialized before anyone can ask + watchdog_task = create_watchdog_task(main_loop) + + gobject.timeout_add(cfg.UPDATE_INTERVAL * 2, watchdog_task, priority = gobject.PRIORITY_LOW) # add watchdog first + gobject.timeout_add(cfg.UPDATE_INTERVAL, update_task, priority = gobject.PRIORITY_LOW) # call update once every update_interval + + logging.info('starting gobject.MainLoop') + main_loop.run() + logging.info('gobject.MainLoop was shut down') + + sys.exit(0xFF) # reaches this only on error + + +main(sys.argv[1:]) diff --git a/firmware/opt/dbus-fz-sonick-48tl-with-s3/dbus_types.py b/firmware/opt/dbus-fz-sonick-48tl-with-s3/dbus_types.py new file mode 100644 index 000000000..a5fcc6e8a --- /dev/null +++ b/firmware/opt/dbus-fz-sonick-48tl-with-s3/dbus_types.py @@ -0,0 +1,156 @@ +from logging import getLogger + +import dbus + + +_log = getLogger(__name__) + +# noinspection PyUnreachableCode +if False: + from typing import Any, Union, Dict + DbusString = Union[dbus.String, dbus.UTF8String, dbus.ObjectPath, dbus.Signature] + DbusInt = Union[dbus.Int16, dbus.Int32, dbus.Int64] + DbusDouble = dbus.Double + DbusBool = dbus.Boolean + + DbusStringVariant = DbusString # TODO: variant_level constraint ? + DbusIntVariant = DbusInt + DbusDoubleVariant = DbusDouble + DbusBoolVariant = DbusBool + + DbusValue = Union[DbusString, DbusInt, DbusDouble, DbusBool, DBUS_NONE] + DbusVariant = Union[DbusStringVariant, DbusIntVariant, DbusDoubleVariant, DbusBoolVariant, DBUS_NONE] + + DbusTextDict = dbus.Dictionary + DbusVariantDict = dbus.Dictionary + + DbusType = Union[DbusValue, DbusVariant, DbusVariantDict, DbusTextDict] + +DBUS_NONE = dbus.Array([], signature=dbus.Signature('i'), variant_level=1) # DEFINED by victron + +MAX_INT16 = 2 ** 15 - 1 +MAX_INT32 = 2 ** 31 - 1 + + +def dbus_uint32(value): + # type: (int) -> dbus.UInt32 + if value < 0: + raise Exception('cannot convert negative value to UInt32') + + return dbus.UInt32(value) + + +def dbus_int(value): + # type: (Union[int, long]) -> Union[dbus.Int16, dbus.Int32, dbus.Int64] + abs_value = abs(value) + if abs_value < MAX_INT16: + return dbus.Int16(value) + elif abs_value < MAX_INT32: + return dbus.Int32(value) + else: + return dbus.Int64(value) + + +def dbus_string(value): + # type: (Union[str, unicode]) -> DbusString + if isinstance(value, unicode): + return dbus.UTF8String(value) + else: + return dbus.String(value) + + +def dbus_double(value): + # type: (float) -> DbusDouble + return dbus.Double(value) + + +def dbus_bool(value): + # type: (bool) -> DbusBool + return dbus.Boolean(value) + + +# VARIANTS + +def dbus_int_variant(value): + # type: (Union[int, long]) -> DbusIntVariant + abs_value = abs(value) + if abs_value < MAX_INT16: + return dbus.Int16(value, variant_level=1) + elif abs_value < MAX_INT32: + return dbus.Int32(value, variant_level=1) + else: + return dbus.Int64(value, variant_level=1) + + +def dbus_string_variant(value): + # type: (Union[str, unicode]) -> DbusStringVariant + if isinstance(value, unicode): + return dbus.UTF8String(value, variant_level=1) + else: + return dbus.String(value, variant_level=1) + + +def dbus_double_variant(value): + # type: (float) -> DbusDoubleVariant + return dbus.Double(value, variant_level=1) + + +def dbus_bool_variant(value): + # type: (bool) -> DbusBoolVariant + return dbus.Boolean(value, variant_level=1) + + +def dbus_variant(value): + # type: (Any) -> DbusVariant + + if value is None: + return DBUS_NONE + if isinstance(value, float): + return dbus_double_variant(value) + if isinstance(value, bool): + return dbus_bool_variant(value) + if isinstance(value, (int, long)): + return dbus_int_variant(value) + if isinstance(value, (str, unicode)): + return dbus_string_variant(value) + # TODO: container types + if isinstance(value, list): + # Convert each element in the list to a dbus variant + dbus_array = [dbus_variant(item) for item in value] + if not dbus_array: + return dbus.Array([], signature='v') # Empty array with variant type + first_element = value[0] + if isinstance(first_element, float): + signature = 'd' + elif isinstance(first_element, bool): + signature = 'b' + elif isinstance(first_element, (int, long)): + signature = 'x' + elif isinstance(first_element, (str, unicode)): + signature = 's' + else: + signature = 'v' # default to variant if unknown + return dbus.Array(dbus_array, signature=signature) + + raise TypeError('unsupported python type: ' + str(type(value)) + ' ' + str(value)) + + +def dbus_value(value): + # type: (Any) -> DbusVariant + + if value is None: + return DBUS_NONE + if isinstance(value, float): + return dbus_double(value) + if isinstance(value, bool): + return dbus_bool(value) + if isinstance(value, (int, long)): + return dbus_int(value) + if isinstance(value, (str, unicode)): + return dbus_string_variant(value) + # TODO: container types + + raise TypeError('unsupported python type: ' + str(type(value)) + ' ' + str(value)) + + + diff --git a/firmware/opt/dbus-fz-sonick-48tl-with-s3/ext/velib_python/ve_utils.py b/firmware/opt/dbus-fz-sonick-48tl-with-s3/ext/velib_python/ve_utils.py new file mode 100644 index 000000000..459584bab --- /dev/null +++ b/firmware/opt/dbus-fz-sonick-48tl-with-s3/ext/velib_python/ve_utils.py @@ -0,0 +1,202 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +from traceback import print_exc +from os import _exit as os_exit +from os import statvfs +import logging +from functools import update_wrapper +import dbus +logger = logging.getLogger(__name__) + +VEDBUS_INVALID = dbus.Array([], signature=dbus.Signature('i'), variant_level=1) + +# Use this function to make sure the code quits on an unexpected exception. Make sure to use it +# when using gobject.idle_add and also gobject.timeout_add. +# Without this, the code will just keep running, since gobject does not stop the mainloop on an +# exception. +# Example: gobject.idle_add(exit_on_error, myfunc, arg1, arg2) +def exit_on_error(func, *args, **kwargs): + try: + return func(*args, **kwargs) + except: + try: + print 'exit_on_error: there was an exception. Printing stacktrace will be tryed and then exit' + print_exc() + except: + pass + + # sys.exit() is not used, since that throws an exception, which does not lead to a program + # halt when used in a dbus callback, see connection.py in the Python/Dbus libraries, line 230. + os_exit(1) + + +__vrm_portal_id = None +def get_vrm_portal_id(): + # For the CCGX, the definition of the VRM Portal ID is that it is the mac address of the onboard- + # ethernet port (eth0), stripped from its colons (:) and lower case. + + # nice coincidence is that this also works fine when running on your (linux) development computer. + + global __vrm_portal_id + + if __vrm_portal_id: + return __vrm_portal_id + + # Assume we are on linux + import fcntl, socket, struct + + s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + info = fcntl.ioctl(s.fileno(), 0x8927, struct.pack('256s', 'eth0'[:15])) + __vrm_portal_id = ''.join(['%02x' % ord(char) for char in info[18:24]]) + + return __vrm_portal_id + + +# See VE.Can registers - public.docx for definition of this conversion +def convert_vreg_version_to_readable(version): + def str_to_arr(x, length): + a = [] + for i in range(0, len(x), length): + a.append(x[i:i+length]) + return a + + x = "%x" % version + x = x.upper() + + if len(x) == 5 or len(x) == 3 or len(x) == 1: + x = '0' + x + + a = str_to_arr(x, 2); + + # remove the first 00 if there are three bytes and it is 00 + if len(a) == 3 and a[0] == '00': + a.remove(0); + + # if we have two or three bytes now, and the first character is a 0, remove it + if len(a) >= 2 and a[0][0:1] == '0': + a[0] = a[0][1]; + + result = '' + for item in a: + result += ('.' if result != '' else '') + item + + + result = 'v' + result + + return result + + +def get_free_space(path): + result = -1 + + try: + s = statvfs(path) + result = s.f_frsize * s.f_bavail # Number of free bytes that ordinary users + except Exception, ex: + logger.info("Error while retrieving free space for path %s: %s" % (path, ex)) + + return result + + +def get_load_averages(): + c = read_file('/proc/loadavg') + return c.split(' ')[:3] + + +# Returns False if it cannot find a machine name. Otherwise returns the string +# containing the name +def get_machine_name(): + c = read_file('/proc/device-tree/model') + + if c != False: + return c.strip('\x00') + + return read_file('/etc/venus/machine') + + +# Returns False if it cannot open the file. Otherwise returns its rstripped contents +def read_file(path): + content = False + + try: + with open(path, 'r') as f: + content = f.read().rstrip() + except Exception, ex: + logger.debug("Error while reading %s: %s" % (path, ex)) + + return content + + +def wrap_dbus_value(value): + if value is None: + return VEDBUS_INVALID + if isinstance(value, float): + return dbus.Double(value, variant_level=1) + if isinstance(value, bool): + return dbus.Boolean(value, variant_level=1) + if isinstance(value, int): + return dbus.Int32(value, variant_level=1) + if isinstance(value, str): + return dbus.String(value, variant_level=1) + if isinstance(value, unicode): + return dbus.String(value, variant_level=1) + if isinstance(value, list): + if len(value) == 0: + # If the list is empty we cannot infer the type of the contents. So assume unsigned integer. + # A (signed) integer is dangerous, because an empty list of signed integers is used to encode + # an invalid value. + return dbus.Array([], signature=dbus.Signature('u'), variant_level=1) + return dbus.Array([wrap_dbus_value(x) for x in value], variant_level=1) + if isinstance(value, long): + return dbus.Int64(value, variant_level=1) + if isinstance(value, dict): + # Wrapping the keys of the dictionary causes D-Bus errors like: + # 'arguments to dbus_message_iter_open_container() were incorrect, + # assertion "(type == DBUS_TYPE_ARRAY && contained_signature && + # *contained_signature == DBUS_DICT_ENTRY_BEGIN_CHAR) || (contained_signature == NULL || + # _dbus_check_is_valid_signature (contained_signature))" failed in file ...' + return dbus.Dictionary({(k, wrap_dbus_value(v)) for k, v in value.items()}, variant_level=1) + return value + + +dbus_int_types = (dbus.Int32, dbus.UInt32, dbus.Byte, dbus.Int16, dbus.UInt16, dbus.UInt32, dbus.Int64, dbus.UInt64) + + +def unwrap_dbus_value(val): + """Converts D-Bus values back to the original type. For example if val is of type DBus.Double, + a float will be returned.""" + if isinstance(val, dbus_int_types): + return int(val) + if isinstance(val, dbus.Double): + return float(val) + if isinstance(val, dbus.Array): + v = [unwrap_dbus_value(x) for x in val] + return None if len(v) == 0 else v + if isinstance(val, (dbus.Signature, dbus.String)): + return unicode(val) + # Python has no byte type, so we convert to an integer. + if isinstance(val, dbus.Byte): + return int(val) + if isinstance(val, dbus.ByteArray): + return "".join([str(x) for x in val]) + if isinstance(val, (list, tuple)): + return [unwrap_dbus_value(x) for x in val] + if isinstance(val, (dbus.Dictionary, dict)): + # Do not unwrap the keys, see comment in wrap_dbus_value + return dict([(x, unwrap_dbus_value(y)) for x, y in val.items()]) + if isinstance(val, dbus.Boolean): + return bool(val) + return val + +class reify(object): + """ Decorator to replace a property of an object with the calculated value, + to make it concrete. """ + def __init__(self, wrapped): + self.wrapped = wrapped + update_wrapper(self, wrapped) + def __get__(self, inst, objtype=None): + if inst is None: + return self + v = self.wrapped(inst) + setattr(inst, self.wrapped.__name__, v) + return v diff --git a/firmware/opt/dbus-fz-sonick-48tl-with-s3/ext/velib_python/vedbus.py b/firmware/opt/dbus-fz-sonick-48tl-with-s3/ext/velib_python/vedbus.py new file mode 100644 index 000000000..2dbed13e2 --- /dev/null +++ b/firmware/opt/dbus-fz-sonick-48tl-with-s3/ext/velib_python/vedbus.py @@ -0,0 +1,496 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import dbus.service +import logging +import traceback +import os +import weakref +from ve_utils import wrap_dbus_value, unwrap_dbus_value + +# vedbus contains three classes: +# VeDbusItemImport -> use this to read data from the dbus, ie import +# VeDbusItemExport -> use this to export data to the dbus (one value) +# VeDbusService -> use that to create a service and export several values to the dbus + +# Code for VeDbusItemImport is copied from busitem.py and thereafter modified. +# All projects that used busitem.py need to migrate to this package. And some +# projects used to define there own equivalent of VeDbusItemExport. Better to +# use VeDbusItemExport, or even better the VeDbusService class that does it all for you. + +# TODOS +# 1 check for datatypes, it works now, but not sure if all is compliant with +# com.victronenergy.BusItem interface definition. See also the files in +# tests_and_examples. And see 'if type(v) == dbus.Byte:' on line 102. Perhaps +# something similar should also be done in VeDbusBusItemExport? +# 2 Shouldn't VeDbusBusItemExport inherit dbus.service.Object? +# 7 Make hard rules for services exporting data to the D-Bus, in order to make tracking +# changes possible. Does everybody first invalidate its data before leaving the bus? +# And what about before taking one object away from the bus, instead of taking the +# whole service offline? +# They should! And after taking one value away, do we need to know that someone left +# the bus? Or we just keep that value in invalidated for ever? Result is that we can't +# see the difference anymore between an invalidated value and a value that was first on +# the bus and later not anymore. See comments above VeDbusItemImport as well. +# 9 there are probably more todos in the code below. + +# Some thoughts with regards to the data types: +# +# Text from: http://dbus.freedesktop.org/doc/dbus-python/doc/tutorial.html#data-types +# --- +# Variants are represented by setting the variant_level keyword argument in the +# constructor of any D-Bus data type to a value greater than 0 (variant_level 1 +# means a variant containing some other data type, variant_level 2 means a variant +# containing a variant containing some other data type, and so on). If a non-variant +# is passed as an argument but introspection indicates that a variant is expected, +# it'll automatically be wrapped in a variant. +# --- +# +# Also the different dbus datatypes, such as dbus.Int32, and dbus.UInt32 are a subclass +# of Python int. dbus.String is a subclass of Python standard class unicode, etcetera +# +# So all together that explains why we don't need to explicitly convert back and forth +# between the dbus datatypes and the standard python datatypes. Note that all datatypes +# in python are objects. Even an int is an object. + +# The signature of a variant is 'v'. + +# Export ourselves as a D-Bus service. +class VeDbusService(object): + def __init__(self, servicename, bus=None): + # dict containing the VeDbusItemExport objects, with their path as the key. + self._dbusobjects = {} + self._dbusnodes = {} + + # dict containing the onchange callbacks, for each object. Object path is the key + self._onchangecallbacks = {} + + # Connect to session bus whenever present, else use the system bus + self._dbusconn = bus or (dbus.SessionBus() if 'DBUS_SESSION_BUS_ADDRESS' in os.environ else dbus.SystemBus()) + + # make the dbus connection available to outside, could make this a true property instead, but ach.. + self.dbusconn = self._dbusconn + + # Register ourselves on the dbus, trigger an error if already in use (do_not_queue) + self._dbusname = dbus.service.BusName(servicename, self._dbusconn, do_not_queue=True) + + # Add the root item that will return all items as a tree + self._dbusnodes['/'] = self._create_tree_export(self._dbusconn, '/', self._get_tree_dict) + + logging.info("registered ourselves on D-Bus as %s" % servicename) + + def _get_tree_dict(self, path, get_text=False): + logging.debug("_get_tree_dict called for %s" % path) + r = {} + px = path + if not px.endswith('/'): + px += '/' + for p, item in self._dbusobjects.items(): + if p.startswith(px): + v = item.GetText() if get_text else wrap_dbus_value(item.local_get_value()) + r[p[len(px):]] = v + logging.debug(r) + return r + + # To force immediate deregistering of this dbus service and all its object paths, explicitly + # call __del__(). + def __del__(self): + for node in self._dbusnodes.values(): + node.__del__() + self._dbusnodes.clear() + for item in self._dbusobjects.values(): + item.__del__() + self._dbusobjects.clear() + if self._dbusname: + self._dbusname.__del__() # Forces call to self._bus.release_name(self._name), see source code + self._dbusname = None + + # @param callbackonchange function that will be called when this value is changed. First parameter will + # be the path of the object, second the new value. This callback should return + # True to accept the change, False to reject it. + def add_path(self, path, value, description="", writeable=False, + onchangecallback=None, gettextcallback=None): + + if onchangecallback is not None: + self._onchangecallbacks[path] = onchangecallback + + item = VeDbusItemExport( + self._dbusconn, path, value, description, writeable, + self._value_changed, gettextcallback, deletecallback=self._item_deleted) + + spl = path.split('/') + for i in range(2, len(spl)): + subPath = '/'.join(spl[:i]) + if subPath not in self._dbusnodes and subPath not in self._dbusobjects: + self._dbusnodes[subPath] = self._create_tree_export(self._dbusconn, subPath, self._get_tree_dict) + self._dbusobjects[path] = item + logging.debug('added %s with start value %s. Writeable is %s' % (path, value, writeable)) + + # Add the mandatory paths, as per victron dbus api doc + def add_mandatory_paths(self, processname, processversion, connection, + deviceinstance, productid, productname, firmwareversion, hardwareversion, connected): + self.add_path('/Mgmt/ProcessName', processname) + self.add_path('/Mgmt/ProcessVersion', processversion) + self.add_path('/Mgmt/Connection', connection) + + # Create rest of the mandatory objects + self.add_path('/DeviceInstance', deviceinstance) + self.add_path('/ProductId', productid) + self.add_path('/ProductName', productname) + self.add_path('/FirmwareVersion', firmwareversion) + self.add_path('/HardwareVersion', hardwareversion) + self.add_path('/Connected', connected) + + def _create_tree_export(self, bus, objectPath, get_value_handler): + return VeDbusTreeExport(bus, objectPath, get_value_handler) + + # Callback function that is called from the VeDbusItemExport objects when a value changes. This function + # maps the change-request to the onchangecallback given to us for this specific path. + def _value_changed(self, path, newvalue): + if path not in self._onchangecallbacks: + return True + + return self._onchangecallbacks[path](path, newvalue) + + def _item_deleted(self, path): + self._dbusobjects.pop(path) + for np in self._dbusnodes.keys(): + if np != '/': + for ip in self._dbusobjects: + if ip.startswith(np + '/'): + break + else: + self._dbusnodes[np].__del__() + self._dbusnodes.pop(np) + + def __getitem__(self, path): + return self._dbusobjects[path].local_get_value() + + def __setitem__(self, path, newvalue): + self._dbusobjects[path].local_set_value(newvalue) + + def __delitem__(self, path): + self._dbusobjects[path].__del__() # Invalidates and then removes the object path + assert path not in self._dbusobjects + + def __contains__(self, path): + return path in self._dbusobjects + +""" +Importing basics: + - If when we power up, the D-Bus service does not exist, or it does exist and the path does not + yet exist, still subscribe to a signal: as soon as it comes online it will send a signal with its + initial value, which VeDbusItemImport will receive and use to update local cache. And, when set, + call the eventCallback. + - If when we power up, save it + - When using get_value, know that there is no difference between services (or object paths) that don't + exist and paths that are invalid (= empty array, see above). Both will return None. In case you do + really want to know ifa path exists or not, use the exists property. + - When a D-Bus service leaves the D-Bus, it will first invalidate all its values, and send signals + with that update, and only then leave the D-Bus. (or do we need to subscribe to the NameOwnerChanged- + signal!?!) To be discussed and make sure. Not really urgent, since all existing code that uses this + class already subscribes to the NameOwnerChanged signal, and subsequently removes instances of this + class. + +Read when using this class: +Note that when a service leaves that D-Bus without invalidating all its exported objects first, for +example because it is killed, VeDbusItemImport doesn't have a clue. So when using VeDbusItemImport, +make sure to also subscribe to the NamerOwnerChanged signal on bus-level. Or just use dbusmonitor, +because that takes care of all of that for you. +""" +class VeDbusItemImport(object): + ## Constructor + # @param bus the bus-object (SESSION or SYSTEM). + # @param serviceName the dbus-service-name (string), for example 'com.victronenergy.battery.ttyO1' + # @param path the object-path, for example '/Dc/V' + # @param eventCallback function that you want to be called on a value change + # @param createSignal only set this to False if you use this function to one time read a value. When + # leaving it to True, make sure to also subscribe to the NameOwnerChanged signal + # elsewhere. See also note some 15 lines up. + def __init__(self, bus, serviceName, path, eventCallback=None, createsignal=True): + # TODO: is it necessary to store _serviceName and _path? Isn't it + # stored in the bus_getobjectsomewhere? + self._serviceName = serviceName + self._path = path + self._match = None + # TODO: _proxy is being used in settingsdevice.py, make a getter for that + self._proxy = bus.get_object(serviceName, path, introspect=False) + self.eventCallback = eventCallback + + assert eventCallback is None or createsignal == True + if createsignal: + self._match = self._proxy.connect_to_signal( + "PropertiesChanged", weak_functor(self._properties_changed_handler)) + + # store the current value in _cachedvalue. When it doesn't exists set _cachedvalue to + # None, same as when a value is invalid + self._cachedvalue = None + try: + v = self._proxy.GetValue() + except dbus.exceptions.DBusException: + pass + else: + self._cachedvalue = unwrap_dbus_value(v) + + def __del__(self): + if self._match != None: + self._match.remove() + self._match = None + self._proxy = None + + def _refreshcachedvalue(self): + self._cachedvalue = unwrap_dbus_value(self._proxy.GetValue()) + + ## Returns the path as a string, for example '/AC/L1/V' + @property + def path(self): + return self._path + + ## Returns the dbus service name as a string, for example com.victronenergy.vebus.ttyO1 + @property + def serviceName(self): + return self._serviceName + + ## Returns the value of the dbus-item. + # the type will be a dbus variant, for example dbus.Int32(0, variant_level=1) + # this is not a property to keep the name consistant with the com.victronenergy.busitem interface + # returns None when the property is invalid + def get_value(self): + return self._cachedvalue + + ## Writes a new value to the dbus-item + def set_value(self, newvalue): + r = self._proxy.SetValue(wrap_dbus_value(newvalue)) + + # instead of just saving the value, go to the dbus and get it. So we have the right type etc. + if r == 0: + self._refreshcachedvalue() + + return r + + ## Returns the text representation of the value. + # For example when the value is an enum/int GetText might return the string + # belonging to that enum value. Another example, for a voltage, GetValue + # would return a float, 12.0Volt, and GetText could return 12 VDC. + # + # Note that this depends on how the dbus-producer has implemented this. + def get_text(self): + return self._proxy.GetText() + + ## Returns true of object path exists, and false if it doesn't + @property + def exists(self): + # TODO: do some real check instead of this crazy thing. + r = False + try: + r = self._proxy.GetValue() + r = True + except dbus.exceptions.DBusException: + pass + + return r + + ## callback for the trigger-event. + # @param eventCallback the event-callback-function. + @property + def eventCallback(self): + return self._eventCallback + + @eventCallback.setter + def eventCallback(self, eventCallback): + self._eventCallback = eventCallback + + ## Is called when the value of the imported bus-item changes. + # Stores the new value in our local cache, and calls the eventCallback, if set. + def _properties_changed_handler(self, changes): + if "Value" in changes: + changes['Value'] = unwrap_dbus_value(changes['Value']) + self._cachedvalue = changes['Value'] + if self._eventCallback: + # The reason behind this try/except is to prevent errors silently ending up the an error + # handler in the dbus code. + try: + self._eventCallback(self._serviceName, self._path, changes) + except: + traceback.print_exc() + os._exit(1) # sys.exit() is not used, since that also throws an exception + + +class VeDbusTreeExport(dbus.service.Object): + def __init__(self, bus, objectPath, get_value_handler): + dbus.service.Object.__init__(self, bus, objectPath) + self._get_value_handler = get_value_handler + logging.debug("VeDbusTreeExport %s has been created" % objectPath) + + def __del__(self): + # self._get_path() will raise an exception when retrieved after the call to .remove_from_connection, + # so we need a copy. + path = self._get_path() + if path is None: + return + self.remove_from_connection() + logging.debug("VeDbusTreeExport %s has been removed" % path) + + def _get_path(self): + if len(self._locations) == 0: + return None + return self._locations[0][1] + + @dbus.service.method('com.victronenergy.BusItem', out_signature='v') + def GetValue(self): + value = self._get_value_handler(self._get_path()) + return dbus.Dictionary(value, signature=dbus.Signature('sv'), variant_level=1) + + @dbus.service.method('com.victronenergy.BusItem', out_signature='v') + def GetText(self): + return self._get_value_handler(self._get_path(), True) + + def local_get_value(self): + return self._get_value_handler(self.path) + + +class VeDbusItemExport(dbus.service.Object): + ## Constructor of VeDbusItemExport + # + # Use this object to export (publish), values on the dbus + # Creates the dbus-object under the given dbus-service-name. + # @param bus The dbus object. + # @param objectPath The dbus-object-path. + # @param value Value to initialize ourselves with, defaults to None which means Invalid + # @param description String containing a description. Can be called over the dbus with GetDescription() + # @param writeable what would this do!? :). + # @param callback Function that will be called when someone else changes the value of this VeBusItem + # over the dbus. First parameter passed to callback will be our path, second the new + # value. This callback should return True to accept the change, False to reject it. + def __init__(self, bus, objectPath, value=None, description=None, writeable=False, + onchangecallback=None, gettextcallback=None, deletecallback=None): + dbus.service.Object.__init__(self, bus, objectPath) + self._onchangecallback = onchangecallback + self._gettextcallback = gettextcallback + self._value = value + self._description = description + self._writeable = writeable + self._deletecallback = deletecallback + + # To force immediate deregistering of this dbus object, explicitly call __del__(). + def __del__(self): + # self._get_path() will raise an exception when retrieved after the + # call to .remove_from_connection, so we need a copy. + path = self._get_path() + if path == None: + return + if self._deletecallback is not None: + self._deletecallback(path) + self.local_set_value(None) + self.remove_from_connection() + logging.debug("VeDbusItemExport %s has been removed" % path) + + def _get_path(self): + if len(self._locations) == 0: + return None + return self._locations[0][1] + + ## Sets the value. And in case the value is different from what it was, a signal + # will be emitted to the dbus. This function is to be used in the python code that + # is using this class to export values to the dbus. + # set value to None to indicate that it is Invalid + def local_set_value(self, newvalue): + if self._value == newvalue: + return + + self._value = newvalue + + changes = {} + changes['Value'] = wrap_dbus_value(newvalue) + changes['Text'] = self.GetText() + self.PropertiesChanged(changes) + + def local_get_value(self): + return self._value + + # ==== ALL FUNCTIONS BELOW THIS LINE WILL BE CALLED BY OTHER PROCESSES OVER THE DBUS ==== + + ## Dbus exported method SetValue + # Function is called over the D-Bus by other process. It will first check (via callback) if new + # value is accepted. And it is, stores it and emits a changed-signal. + # @param value The new value. + # @return completion-code When successful a 0 is return, and when not a -1 is returned. + @dbus.service.method('com.victronenergy.BusItem', in_signature='v', out_signature='i') + def SetValue(self, newvalue): + if not self._writeable: + return 1 # NOT OK + + newvalue = unwrap_dbus_value(newvalue) + + if newvalue == self._value: + return 0 # OK + + # call the callback given to us, and check if new value is OK. + if (self._onchangecallback is None or + (self._onchangecallback is not None and self._onchangecallback(self.__dbus_object_path__, newvalue))): + + self.local_set_value(newvalue) + return 0 # OK + + return 2 # NOT OK + + ## Dbus exported method GetDescription + # + # Returns the a description. + # @param language A language code (e.g. ISO 639-1 en-US). + # @param length Lenght of the language string. + # @return description + @dbus.service.method('com.victronenergy.BusItem', in_signature='si', out_signature='s') + def GetDescription(self, language, length): + return self._description if self._description is not None else 'No description given' + + ## Dbus exported method GetValue + # Returns the value. + # @return the value when valid, and otherwise an empty array + @dbus.service.method('com.victronenergy.BusItem', out_signature='v') + def GetValue(self): + return wrap_dbus_value(self._value) + + ## Dbus exported method GetText + # Returns the value as string of the dbus-object-path. + # @return text A text-value. '---' when local value is invalid + @dbus.service.method('com.victronenergy.BusItem', out_signature='s') + def GetText(self): + if self._value is None: + return '---' + + # Default conversion from dbus.Byte will get you a character (so 'T' instead of '84'), so we + # have to convert to int first. Note that if a dbus.Byte turns up here, it must have come from + # the application itself, as all data from the D-Bus should have been unwrapped by now. + if self._gettextcallback is None and type(self._value) == dbus.Byte: + return str(int(self._value)) + + if self._gettextcallback is None and self.__dbus_object_path__ == '/ProductId': + return "0x%X" % self._value + + if self._gettextcallback is None: + return str(self._value) + + return self._gettextcallback(self.__dbus_object_path__, self._value) + + ## The signal that indicates that the value has changed. + # Other processes connected to this BusItem object will have subscribed to the + # event when they want to track our state. + @dbus.service.signal('com.victronenergy.BusItem', signature='a{sv}') + def PropertiesChanged(self, changes): + pass + +## This class behaves like a regular reference to a class method (eg. self.foo), but keeps a weak reference +## to the object which method is to be called. +## Use this object to break circular references. +class weak_functor: + def __init__(self, f): + self._r = weakref.ref(f.__self__) + self._f = weakref.ref(f.__func__) + + def __call__(self, *args, **kargs): + r = self._r() + f = self._f() + if r == None or f == None: + return + f(r, *args, **kargs) diff --git a/firmware/opt/dbus-fz-sonick-48tl-with-s3/old_signals.py b/firmware/opt/dbus-fz-sonick-48tl-with-s3/old_signals.py new file mode 100755 index 000000000..79bdc97a1 --- /dev/null +++ b/firmware/opt/dbus-fz-sonick-48tl-with-s3/old_signals.py @@ -0,0 +1,547 @@ +# coding=utf-8 + +import config as cfg +from convert import mean, read_float, read_led_state, read_bool, count_bits, comma_separated, read_bitmap, return_in_list, first, read_hex_string +from data import BatterySignal, Battery, LedColor, ServiceSignal, BatteryStatus, LedState, CsvSignal + +# noinspection PyUnreachableCode +if False: + from typing import List, Iterable + + +def init_service_signals(batteries): + print("INSIDE INIT SERVICE SIGNALS") + # type: (List[Battery]) -> Iterable[ServiceSignal] + + n_batteries = len(batteries) + product_name = cfg.PRODUCT_NAME + ' x' + str(n_batteries) + + return [ + ServiceSignal('/NbOfBatteries', n_batteries), # TODO: nb of operational batteries + ServiceSignal('/Mgmt/ProcessName', __file__), + ServiceSignal('/Mgmt/ProcessVersion', cfg.SOFTWARE_VERSION), + ServiceSignal('/Mgmt/Connection', cfg.CONNECTION), + ServiceSignal('/DeviceInstance', cfg.DEVICE_INSTANCE), + ServiceSignal('/ProductName', product_name), + ServiceSignal('/ProductId', cfg.PRODUCT_ID), + ServiceSignal('/Connected', 1) + ] + + +def init_battery_signals(): + # type: () -> Iterable[BatterySignal] + print("START INIT SIGNALS") + read_voltage = read_float(register=999, scale_factor=0.01, offset=0) + read_current = read_float(register=1000, scale_factor=0.01, offset=-10000) + + read_led_amber = read_led_state(register=1004, led=LedColor.amber) + read_led_green = read_led_state(register=1004, led=LedColor.green) + read_led_blue = read_led_state(register=1004, led=LedColor.blue) + read_led_red = read_led_state(register=1004, led=LedColor.red) + + def read_power(status): + # type: (BatteryStatus) -> int + return int(read_current(status) * read_voltage(status)) + + def calc_power_limit_imposed_by_voltage_limit(v, i, v_limit, r_int): + # type: (float, float, float, float) -> float + + dv = v_limit - v + di = dv / r_int + p_limit = v_limit * (i + di) + + return p_limit + + def calc_power_limit_imposed_by_current_limit(v, i, i_limit, r_int): + # type: (float, float, float, float) -> float + + di = i_limit - i + dv = di * r_int + p_limit = i_limit * (v + dv) + + return p_limit + + def calc_max_charge_power(status): + # type: (BatteryStatus) -> int + n_strings = number_of_active_strings(status) + i_max = n_strings * cfg.I_MAX_PER_STRING + v_max = cfg.V_MAX + r_int_min = cfg.R_STRING_MIN / n_strings + r_int_max = cfg.R_STRING_MAX / n_strings + + v = read_voltage(status) + i = read_current(status) + + p_limits = [ + calc_power_limit_imposed_by_voltage_limit(v, i, v_max, r_int_min), + calc_power_limit_imposed_by_voltage_limit(v, i, v_max, r_int_max), + calc_power_limit_imposed_by_current_limit(v, i, i_max, r_int_min), + calc_power_limit_imposed_by_current_limit(v, i, i_max, r_int_max), + ] + + p_limit = min(p_limits) # p_limit is normally positive here (signed) + p_limit = max(p_limit, 0) # charge power must not become negative + + return int(p_limit) + + def calc_max_discharge_power(status): + n_strings = number_of_active_strings(status) + max_discharge_current = n_strings*cfg.I_MAX_PER_STRING + return int(max_discharge_current*read_voltage(status)) + + def read_battery_cold(status): + return \ + read_led_green(status) >= LedState.blinking_slow and \ + read_led_blue(status) >= LedState.blinking_slow + + def read_soc(status): + soc = read_float(register=1053, scale_factor=0.1, offset=0)(status) + + # if the SOC is 100 but EOC is not yet reached, report 99.9 instead of 100 + if soc > 99.9 and not read_eoc_reached(status): + return 99.9 + if soc >= 99.9 and read_eoc_reached(status): + return 100 + + return soc + + def hex_string_to_ascii(hex_string): + # Ensure the hex_string is correctly formatted without spaces + hex_string = hex_string.replace(" ", "") + # Convert every two characters (a byte) in the hex string to ASCII + ascii_string = ''.join([chr(int(hex_string[i:i+2], 16)) for i in range(0, len(hex_string), 2)]) + return ascii_string + + battery_status_reader = read_hex_string(1060,2) + + def read_eoc_reached(status): + battery_status_string = battery_status_reader(status) + return hex_string_to_ascii(battery_status_string) == "EOC_" + + read_limb_bitmap = read_bitmap(1059) + + def interpret_limb_bitmap(bitmap_value): + #print("DIABASE TIN TIMI KAI MPIKE STIN INTERPRET LIMB BITMAP") + # The bit for string 1 also monitors all 5 strings: 0000 0000 means All 5 strings activated. 0000 0001 means string 1 disabled. + string1_disabled = int((bitmap_value & 0b00001) != 0) + string2_disabled = int((bitmap_value & 0b00010) != 0) + string3_disabled = int((bitmap_value & 0b00100) != 0) + string4_disabled = int((bitmap_value & 0b01000) != 0) + string5_disabled = int((bitmap_value & 0b10000) != 0) + n_limb_strings = string1_disabled+string2_disabled+string3_disabled+string4_disabled+string5_disabled + #print("KAI I TIMI EINAI: ", n_limb_strings) + return n_limb_strings + + def limp_strings_value(status): + return interpret_limb_bitmap(read_limb_bitmap(status)) + + def number_of_active_strings(status): + return cfg.NUM_OF_STRINGS_PER_BATTERY - limp_strings_value(status) + + def max_discharge_current(status): + #print("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAinside discharge current") + #exit(0) + return number_of_active_strings(status) * cfg.I_MAX_PER_STRING + + def max_charge_current(status): + return status.battery.ampere_hours/2 + + def read_switch_closed(status): + value = read_bool(base_register=1013, bit=0)(status) + if value: + return False + return True + + def read_alarm_out_active(status): + value = read_bool(base_register=1013, bit=1)(status) + if value: + return False + return True + + def read_aux_relay(status): + value = read_bool(base_register=1013, bit=4)(status) + if value: + return False + return True + + return [ + BatterySignal('/TimeToTOCRequest', max, read_float(register=1052)), + BatterySignal('/EOCReached', return_in_list, read_eoc_reached), + BatterySignal('/NumOfLimbStrings', return_in_list, limp_strings_value), + BatterySignal('/Dc/0/Voltage', mean, get_value=read_voltage, unit='V'), + BatterySignal('/Dc/0/Current', sum, get_value=read_current, unit='A'), + BatterySignal('/Dc/0/Power', sum, get_value=read_power, unit='W'), + + BatterySignal('/BussVoltage', mean, read_float(register=1001, scale_factor=0.01, offset=0), unit='V'), + BatterySignal('/Soc', mean, read_soc, unit='%'), + BatterySignal('/LowestSoc', min, read_float(register=1053, scale_factor=0.1, offset=0), unit='%'), + BatterySignal('/Dc/0/Temperature', mean, read_float(register=1003, scale_factor=0.1, offset=-400), unit='C'), + BatterySignal('/Dc/0/LowestTemperature', min, read_float(register=1003, scale_factor=0.1, offset=-400), unit='C'), + + #BatterySignal('/NumberOfWarningFlags', sum, count_bits(base_register=1005, nb_of_registers=3, nb_of_bits=47)), + BatterySignal('/WarningFlags/TaM1', return_in_list, read_bool(base_register=1005, bit=1)), + BatterySignal('/WarningFlags/TbM1', return_in_list, read_bool(base_register=1005, bit=4)), + BatterySignal('/WarningFlags/VBm1', return_in_list, read_bool(base_register=1005, bit=6)), + BatterySignal('/WarningFlags/VBM1', return_in_list, read_bool(base_register=1005, bit=8)), + BatterySignal('/WarningFlags/IDM1', return_in_list, read_bool(base_register=1005, bit=10)), + BatterySignal('/WarningFlags/vsm1', return_in_list, read_bool(base_register=1005, bit=22)), + BatterySignal('/WarningFlags/vsM1', return_in_list, read_bool(base_register=1005, bit=24)), + BatterySignal('/WarningFlags/iCM1', return_in_list, read_bool(base_register=1005, bit=26)), + BatterySignal('/WarningFlags/iDM1', return_in_list, read_bool(base_register=1005, bit=28)), + BatterySignal('/WarningFlags/MID1', return_in_list, read_bool(base_register=1005, bit=30)), + BatterySignal('/WarningFlags/BLPW', return_in_list, read_bool(base_register=1005, bit=32)), + BatterySignal('/WarningFlags/CCBF', return_in_list, read_bool(base_register=1005, bit=33)), + BatterySignal('/WarningFlags/Ah_W', return_in_list, read_bool(base_register=1005, bit=35)), + BatterySignal('/WarningFlags/MPMM', return_in_list, read_bool(base_register=1005, bit=38)), + #BatterySignal('/WarningFlags/TCMM', any, read_bool(base_register=1005, bit=39)), + BatterySignal('/WarningFlags/TCdi', return_in_list, read_bool(base_register=1005, bit=40)), + #BatterySignal('/WarningFlags/WMTO', any, read_bool(base_register=1005, bit=41)), + BatterySignal('/WarningFlags/LMPW', return_in_list, read_bool(base_register=1005, bit=44)), + #BatterySignal('/WarningFlags/CELL1', any, read_bool(base_register=1005, bit=46)), + BatterySignal('/WarningFlags/TOCW', return_in_list, read_bool(base_register=1005, bit=47)), + BatterySignal('/WarningFlags/BUSL', return_in_list, read_bool(base_register=1005, bit=49)), + + #BatterySignal('/NumberOfAlarmFlags', sum, count_bits(base_register=1009, nb_of_registers=3, nb_of_bits=47)), + BatterySignal('/AlarmFlags/Tam', return_in_list, read_bool(base_register=1005, bit=0)), + BatterySignal('/AlarmFlags/TaM2', return_in_list, read_bool(base_register=1005, bit=2)), + BatterySignal('/AlarmFlags/Tbm', return_in_list, read_bool(base_register=1005, bit=3)), + BatterySignal('/AlarmFlags/TbM2', return_in_list, read_bool(base_register=1005, bit=5)), + BatterySignal('/AlarmFlags/VBm2', return_in_list, read_bool(base_register=1005, bit=7)), + BatterySignal('/AlarmFlags/VBM2', return_in_list, read_bool(base_register=1005, bit=9)), + BatterySignal('/AlarmFlags/IDM2', return_in_list, read_bool(base_register=1005, bit=11)), + BatterySignal('/AlarmFlags/ISOB', return_in_list, read_bool(base_register=1005, bit=12)), + BatterySignal('/AlarmFlags/MSWE', return_in_list, read_bool(base_register=1005, bit=13)), + BatterySignal('/AlarmFlags/FUSE', return_in_list, read_bool(base_register=1005, bit=14)), + BatterySignal('/AlarmFlags/HTRE', return_in_list, read_bool(base_register=1005, bit=15)), + BatterySignal('/AlarmFlags/TCPE', return_in_list, read_bool(base_register=1005, bit=16)), + BatterySignal('/AlarmFlags/STRE', return_in_list, read_bool(base_register=1005, bit=17)), + BatterySignal('/AlarmFlags/CME', return_in_list, read_bool(base_register=1005, bit=18)), + BatterySignal('/AlarmFlags/HWFL', return_in_list, read_bool(base_register=1005, bit=19)), + BatterySignal('/AlarmFlags/HWEM', return_in_list, read_bool(base_register=1005, bit=20)), + BatterySignal('/AlarmFlags/ThM', return_in_list, read_bool(base_register=1005, bit=21)), + #BatterySignal('/AlarmFlags/vsm1', any, read_bool(base_register=1005, bit=22)), + BatterySignal('/AlarmFlags/vsm2', return_in_list, read_bool(base_register=1005, bit=23)), + BatterySignal('/AlarmFlags/vsM2', return_in_list, read_bool(base_register=1005, bit=25)), + BatterySignal('/AlarmFlags/iCM2', return_in_list, read_bool(base_register=1005, bit=27)), + BatterySignal('/AlarmFlags/iDM2', return_in_list, read_bool(base_register=1005, bit=29)), + BatterySignal('/AlarmFlags/MID2', return_in_list, read_bool(base_register=1005, bit=31)), + #BatterySignal('/AlarmFlags/CCBF', any, read_bool(base_register=1005, bit=33)), + #BatterySignal('/AlarmFlags/AhFL', any, read_bool(base_register=1005, bit=34)), + #BatterySignal('/AlarmFlags/TbCM', any, read_bool(base_register=1005, bit=36)), + #BatterySignal('/AlarmFlags/BRNF', any, read_bool(base_register=1005, bit=37)), + BatterySignal('/AlarmFlags/HTFS', return_in_list, read_bool(base_register=1005, bit=42)), + BatterySignal('/AlarmFlags/DATA', return_in_list, read_bool(base_register=1005, bit=43)), + BatterySignal('/AlarmFlags/LMPA', return_in_list, read_bool(base_register=1005, bit=45)), + BatterySignal('/AlarmFlags/HEBT', return_in_list, read_bool(base_register=1005, bit=46)), + #BatterySignal('/AlarmFlags/bit47AlarmDummy', any,read_bool(base_register=1005, bit=47)), + BatterySignal('/AlarmFlags/CURM', return_in_list, read_bool(base_register=1005, bit=48)), + + BatterySignal('/Diagnostics/LedStatus/Red', first, read_led_red), + BatterySignal('/Diagnostics/LedStatus/Blue', first, read_led_blue), + BatterySignal('/Diagnostics/LedStatus/Green', first, read_led_green), + BatterySignal('/Diagnostics/LedStatus/Amber', first, read_led_amber), + + BatterySignal('/Diagnostics/IoStatus/MainSwitchClosed', return_in_list, read_switch_closed), + BatterySignal('/Diagnostics/IoStatus/AlarmOutActive', return_in_list, read_alarm_out_active), + BatterySignal('/Diagnostics/IoStatus/InternalFanActive', return_in_list, read_bool(base_register=1013, bit=2)), + BatterySignal('/Diagnostics/IoStatus/VoltMeasurementAllowed', return_in_list, read_bool(base_register=1013, bit=3)), + BatterySignal('/Diagnostics/IoStatus/AuxRelay', return_in_list, read_aux_relay), + BatterySignal('/Diagnostics/IoStatus/RemoteState', return_in_list, read_bool(base_register=1013, bit=5)), + BatterySignal('/Diagnostics/IoStatus/RiscOn', return_in_list, read_bool(base_register=1013, bit=6)), + + BatterySignal('/IoStatus/BatteryCold', any, read_battery_cold), + + # see protocol doc page 7 + BatterySignal('/Info/MaxDischargeCurrent', sum, max_discharge_current, unit='A'), + BatterySignal('/Info/MaxChargeCurrent', sum, max_charge_current, unit='A'), + BatterySignal('/Info/MaxChargeVoltage', min, lambda bs: bs.battery.v_max, unit='V'), + BatterySignal('/Info/MinDischargeVoltage', max, lambda bs: bs.battery.v_min, unit='V'), + BatterySignal('/Info/BatteryLowVoltage' , max, lambda bs: bs.battery.v_min-2, unit='V'), + BatterySignal('/Info/NumberOfStrings', sum, number_of_active_strings), + + BatterySignal('/Info/MaxChargePower', sum, calc_max_charge_power), + BatterySignal('/Info/MaxDischargePower', sum, calc_max_discharge_power), + + BatterySignal('/FirmwareVersion', comma_separated, lambda bs: bs.battery.firmware_version), + BatterySignal('/HardwareVersion', comma_separated, lambda bs: bs.battery.hardware_version), + BatterySignal('/BmsVersion', comma_separated, lambda bs: bs.battery.bms_version) + + ] + + +def create_csv_signals(firmware_version): + read_voltage = read_float(register=999, scale_factor=0.01, offset=0) + read_current = read_float(register=1000, scale_factor=0.01, offset=-10000) + read_limb_bitmap = read_bitmap(1059) + + def read_power(status): + return int(read_current(status) * read_voltage(status)) + + def string1_disabled(status): + bitmap_value = read_limb_bitmap(status) + return int((bitmap_value & 0b00001) != 0) + + def string2_disabled(status): + bitmap_value = read_limb_bitmap(status) + return int((bitmap_value & 0b00010) != 0) + + def string3_disabled(status): + bitmap_value = read_limb_bitmap(status) + return int((bitmap_value & 0b00100) != 0) + + def string4_disabled(status): + bitmap_value = read_limb_bitmap(status) + return int((bitmap_value & 0b01000) != 0) + + def string5_disabled(status): + bitmap_value = read_limb_bitmap(status) + return int((bitmap_value & 0b10000) != 0) + + read_limb_bitmap = read_bitmap(1059) + + def interpret_limb_bitmap(bitmap_value): + #print("DIABASE TIN TIMI KAI MPIKE STIN INTERPRET LIMB BITMAP") + # The bit for string 1 also monitors all 5 strings: 0000 0000 means All 5 strings activated. 0000 0001 means string 1 disabled. + string1_disabled = int((bitmap_value & 0b00001) != 0) + string2_disabled = int((bitmap_value & 0b00010) != 0) + string3_disabled = int((bitmap_value & 0b00100) != 0) + string4_disabled = int((bitmap_value & 0b01000) != 0) + string5_disabled = int((bitmap_value & 0b10000) != 0) + n_limb_strings = string1_disabled+string2_disabled+string3_disabled+string4_disabled+string5_disabled + #print("KAI I TIMI EINAI: ", n_limb_strings) + return n_limb_strings + + + def limp_strings_value(status): + return interpret_limb_bitmap(read_limb_bitmap(status)) + + def calc_max_charge_power(status): + # type: (BatteryStatus) -> int + n_strings = cfg.NUM_OF_STRINGS_PER_BATTERY-limp_strings_value(status) + i_max = n_strings * cfg.I_MAX_PER_STRING + v_max = cfg.V_MAX + r_int_min = cfg.R_STRING_MIN / n_strings + r_int_max = cfg.R_STRING_MAX / n_strings + + v = read_voltage(status) + i = read_current(status) + + p_limits = [ + calc_power_limit_imposed_by_voltage_limit(v, i, v_max, r_int_min), + calc_power_limit_imposed_by_voltage_limit(v, i, v_max, r_int_max), + calc_power_limit_imposed_by_current_limit(v, i, i_max, r_int_min), + calc_power_limit_imposed_by_current_limit(v, i, i_max, r_int_max), + ] + + p_limit = min(p_limits) # p_limit is normally positive here (signed) + p_limit = max(p_limit, 0) # charge power must not become negative + + return int(p_limit) + + def calc_max_discharge_power(status): + n_strings = cfg.NUM_OF_STRINGS_PER_BATTERY-limp_strings_value(status) + max_discharge_current = n_strings*cfg.I_MAX_PER_STRING + return int(max_discharge_current*read_voltage(status)) + + total_current = read_float(register=1062, scale_factor=0.01, offset=-10000) + + def read_total_current(status): + return total_current(status) + + def read_heating_current(status): + return total_current(status) - read_current(status) + + def read_heating_power(status): + return read_voltage(status) * read_heating_current(status) + + soc_ah = read_float(register=1002, scale_factor=0.1, offset=-10000) + + def read_soc_ah(status): + return soc_ah(status) + + def return_led_state(status, color): + led_state = read_led_state(register=1004, led=color)(status) + if led_state == LedState.blinking_fast or led_state == LedState.blinking_slow: + return "Blinking" + elif led_state == LedState.on: + return "On" + elif led_state == LedState.off: + return "Off" + return "Unknown" + + def return_led_state_blue(status): + return return_led_state(status, LedColor.blue) + + def return_led_state_red(status): + return return_led_state(status, LedColor.red) + + def return_led_state_green(status): + return return_led_state(status, LedColor.green) + + def return_led_state_amber(status): + return return_led_state(status, LedColor.amber) + + def read_switch_closed(status): + value = read_bool(base_register=1013, bit=0)(status) + if value: + return False + return True + + def read_alarm_out_active(status): + value = read_bool(base_register=1013, bit=1)(status) + if value: + return False + return True + + def read_aux_relay(status): + value = read_bool(base_register=1013, bit=4)(status) + if value: + return False + return True + + battery_status_reader = read_hex_string(1060,2) + + def hex_string_to_ascii(hex_string): + # Ensure the hex_string is correctly formatted without spaces + hex_string = hex_string.replace(" ", "") + # Convert every two characters (a byte) in the hex string to ASCII + ascii_string = ''.join([chr(int(hex_string[i:i+2], 16)) for i in range(0, len(hex_string), 2)]) + return ascii_string + + def read_eoc_reached(status): + battery_status_string = battery_status_reader(status) + return hex_string_to_ascii(battery_status_string) == "EOC_" + + def read_serial_number(status): + serial_regs = [1055, 1056, 1057, 1058] + serial_parts = [] + for reg in serial_regs: + # reading each register as a single hex value + hex_value_fun = read_hex_string(reg, 1) + hex_value = hex_value_fun(status) + # append without spaces and leading zeros stripped if any + serial_parts.append(hex_value.replace(' ', '')) + # concatenate all parts to form the full serial number + serial_number = ''.join(serial_parts).rstrip('0') + return serial_number + + def time_since_toc_in_time_format(status): + time_in_minutes = read_float(register=1052)(status) + # Convert minutes to total seconds + total_seconds = int(time_in_minutes * 60) + # Calculate days, hours, minutes, and seconds + days = total_seconds // (24 * 3600) + total_seconds = total_seconds % (24 * 3600) + hours = total_seconds // 3600 + total_seconds %= 3600 + minutes = total_seconds // 60 + seconds = total_seconds % 60 + # Format the string to show days.hours:minutes:seconds + return "{}.{:02}:{:02}:{:02}".format(days, hours, minutes, seconds) + + def calc_power_limit_imposed_by_voltage_limit(v, i, v_limit, r_int): + # type: (float, float, float, float) -> float + + dv = v_limit - v + di = dv / r_int + p_limit = v_limit * (i + di) + + return p_limit + + def calc_power_limit_imposed_by_current_limit(v, i, i_limit, r_int): + # type: (float, float, float, float) -> float + + di = i_limit - i + dv = di * r_int + p_limit = i_limit * (v + dv) + + return p_limit + + + return [ + CsvSignal('/Battery/Devices/FwVersion', firmware_version), + CsvSignal('/Battery/Devices/Dc/Power', read_power, 'W'), + CsvSignal('/Battery/Devices/Dc/Voltage', read_voltage, 'V'), + CsvSignal('/Battery/Devices/Soc', read_float(register=1053, scale_factor=0.1, offset=0), '%'), + CsvSignal('/Battery/Devices/Temperatures/Cells/Average', read_float(register=1003, scale_factor=0.1, offset=-400), 'C'), + CsvSignal('/Battery/Devices/Dc/Current', read_current, 'A'), + CsvSignal('/Battery/Devices/BusCurrent', read_total_current, 'A'), + CsvSignal('/Battery/Devices/CellsCurrent', read_current, 'A'), + CsvSignal('/Battery/Devices/HeatingCurrent', read_heating_current, 'A'), + CsvSignal('/Battery/Devices/HeatingPower', read_heating_power, 'W'), + CsvSignal('/Battery/Devices/SOCAh', read_soc_ah), + CsvSignal('/Battery/Devices/Leds/Blue', return_led_state_blue), + CsvSignal('/Battery/Devices/Leds/Red', return_led_state_red), + CsvSignal('/Battery/Devices/Leds/Green', return_led_state_green), + CsvSignal('/Battery/Devices/Leds/Amber', return_led_state_amber), + CsvSignal('/Battery/Devices/BatteryStrings/String1Active', string1_disabled), + CsvSignal('/Battery/Devices/BatteryStrings/String2Active', string2_disabled), + CsvSignal('/Battery/Devices/BatteryStrings/String3Active', string3_disabled), + CsvSignal('/Battery/Devices/BatteryStrings/String4Active', string4_disabled), + CsvSignal('/Battery/Devices/BatteryStrings/String5Active', string5_disabled), + CsvSignal('/Battery/Devices/IoStatus/ConnectedToDcBus', read_switch_closed), + CsvSignal('/Battery/Devices/IoStatus/AlarmOutActive', read_alarm_out_active), + CsvSignal('/Battery/Devices/IoStatus/InternalFanActive', read_bool(base_register=1013, bit=2)), + CsvSignal('/Battery/Devices/IoStatus/VoltMeasurementAllowed', read_bool(base_register=1013, bit=3)), + CsvSignal('/Battery/Devices/IoStatus/AuxRelayBus', read_aux_relay), + CsvSignal('/Battery/Devices/IoStatus/RemoteStateActive', read_bool(base_register=1013, bit=5)), + CsvSignal('/Battery/Devices/IoStatus/RiscActive', read_bool(base_register=1013, bit=6)), + CsvSignal('/Battery/Devices/Eoc', read_eoc_reached), + CsvSignal('/Battery/Devices/SerialNumber', read_serial_number), + CsvSignal('/Battery/Devices/TimeSinceTOC', time_since_toc_in_time_format), + CsvSignal('/Battery/Devices/MaxChargePower', calc_max_charge_power), + CsvSignal('/Battery/Devices/MaxDischargePower', calc_max_discharge_power), + ] + + +def read_warning_and_alarm_flags(): + return [ + # Warnings + CsvSignal('/Battery/Devices/WarningFlags/TaM1', read_bool(base_register=1005, bit=1)), + CsvSignal('/Battery/Devices/WarningFlags/TbM1', read_bool(base_register=1005, bit=4)), + CsvSignal('/Battery/Devices/WarningFlags/VBm1', read_bool(base_register=1005, bit=6)), + CsvSignal('/Battery/Devices/WarningFlags/VBM1', read_bool(base_register=1005, bit=8)), + CsvSignal('/Battery/Devices/WarningFlags/IDM1', read_bool(base_register=1005, bit=10)), + CsvSignal('/Battery/Devices/WarningFlags/vsm1', read_bool(base_register=1005, bit=22)), + CsvSignal('/Battery/Devices/WarningFlags/vsM1', read_bool(base_register=1005, bit=24)), + CsvSignal('/Battery/Devices/WarningFlags/iCM1', read_bool(base_register=1005, bit=26)), + CsvSignal('/Battery/Devices/WarningFlags/iDM1', read_bool(base_register=1005, bit=28)), + CsvSignal('/Battery/Devices/WarningFlags/MID1', read_bool(base_register=1005, bit=30)), + CsvSignal('/Battery/Devices/WarningFlags/BLPW', read_bool(base_register=1005, bit=32)), + CsvSignal('/Battery/Devices/WarningFlags/CCBF', read_bool(base_register=1005, bit=33)), + CsvSignal('/Battery/Devices/WarningFlags/Ah_W', read_bool(base_register=1005, bit=35)), + CsvSignal('/Battery/Devices/WarningFlags/MPMM', read_bool(base_register=1005, bit=38)), + CsvSignal('/Battery/Devices/WarningFlags/TCdi', read_bool(base_register=1005, bit=40)), + CsvSignal('/Battery/Devices/WarningFlags/LMPW', read_bool(base_register=1005, bit=44)), + CsvSignal('/Battery/Devices/WarningFlags/TOCW', read_bool(base_register=1005, bit=47)), + CsvSignal('/Battery/Devices/WarningFlags/BUSL', read_bool(base_register=1005, bit=49)), + ], [ + # Alarms + CsvSignal('/Battery/Devices/AlarmFlags/Tam', read_bool(base_register=1005, bit=0)), + CsvSignal('/Battery/Devices/AlarmFlags/TaM2', read_bool(base_register=1005, bit=2)), + CsvSignal('/Battery/Devices/AlarmFlags/Tbm', read_bool(base_register=1005, bit=3)), + CsvSignal('/Battery/Devices/AlarmFlags/TbM2', read_bool(base_register=1005, bit=5)), + CsvSignal('/Battery/Devices/AlarmFlags/VBm2', read_bool(base_register=1005, bit=7)), + CsvSignal('/Battery/Devices/AlarmFlags/VBM2', read_bool(base_register=1005, bit=9)), + CsvSignal('/Battery/Devices/AlarmFlags/IDM2', read_bool(base_register=1005, bit=11)), + CsvSignal('/Battery/Devices/AlarmFlags/ISOB', read_bool(base_register=1005, bit=12)), + CsvSignal('/Battery/Devices/AlarmFlags/MSWE', read_bool(base_register=1005, bit=13)), + CsvSignal('/Battery/Devices/AlarmFlags/FUSE', read_bool(base_register=1005, bit=14)), + CsvSignal('/Battery/Devices/AlarmFlags/HTRE', read_bool(base_register=1005, bit=15)), + CsvSignal('/Battery/Devices/AlarmFlags/TCPE', read_bool(base_register=1005, bit=16)), + CsvSignal('/Battery/Devices/AlarmFlags/STRE', read_bool(base_register=1005, bit=17)), + CsvSignal('/Battery/Devices/AlarmFlags/CME', read_bool(base_register=1005, bit=18)), + CsvSignal('/Battery/Devices/AlarmFlags/HWFL', read_bool(base_register=1005, bit=19)), + CsvSignal('/Battery/Devices/AlarmFlags/HWEM', read_bool(base_register=1005, bit=20)), + CsvSignal('/Battery/Devices/AlarmFlags/ThM', read_bool(base_register=1005, bit=21)), + CsvSignal('/Battery/Devices/AlarmFlags/vsm2', read_bool(base_register=1005, bit=23)), + CsvSignal('/Battery/Devices/AlarmFlags/vsM2', read_bool(base_register=1005, bit=25)), + CsvSignal('/Battery/Devices/AlarmFlags/iCM2', read_bool(base_register=1005, bit=27)), + CsvSignal('/Battery/Devices/AlarmFlags/iDM2', read_bool(base_register=1005, bit=29)), + CsvSignal('/Battery/Devices/AlarmFlags/MID2', read_bool(base_register=1005, bit=31)), + CsvSignal('/Battery/Devices/AlarmFlags/HTFS', read_bool(base_register=1005, bit=42)), + CsvSignal('/Battery/Devices/AlarmFlags/DATA', read_bool(base_register=1005, bit=43)), + CsvSignal('/Battery/Devices/AlarmFlags/LMPA', read_bool(base_register=1005, bit=45)), + CsvSignal('/Battery/Devices/AlarmFlags/HEBT', read_bool(base_register=1005, bit=46)), + CsvSignal('/Battery/Devices/AlarmFlags/CURM', read_bool(base_register=1005, bit=48)), + ] diff --git a/firmware/opt/dbus-fz-sonick-48tl-with-s3/service/down b/firmware/opt/dbus-fz-sonick-48tl-with-s3/service/down new file mode 100644 index 000000000..e69de29bb diff --git a/firmware/opt/dbus-fz-sonick-48tl-with-s3/service/log/down b/firmware/opt/dbus-fz-sonick-48tl-with-s3/service/log/down new file mode 100644 index 000000000..e69de29bb diff --git a/firmware/opt/dbus-fz-sonick-48tl-with-s3/service/log/run b/firmware/opt/dbus-fz-sonick-48tl-with-s3/service/log/run new file mode 100755 index 000000000..74e759d9b --- /dev/null +++ b/firmware/opt/dbus-fz-sonick-48tl-with-s3/service/log/run @@ -0,0 +1,3 @@ +#!/bin/sh +exec 2>&1 +exec multilog t s25000 n4 /var/log/dbus-fzsonick-48tl.TTY diff --git a/firmware/opt/dbus-fz-sonick-48tl-with-s3/service/run b/firmware/opt/dbus-fz-sonick-48tl-with-s3/service/run new file mode 100755 index 000000000..7f5301435 --- /dev/null +++ b/firmware/opt/dbus-fz-sonick-48tl-with-s3/service/run @@ -0,0 +1,4 @@ +#!/bin/sh +exec 2>&1 + +exec softlimit -d 100000000 -s 1000000 -a 100000000 /opt/innovenergy/dbus-fzsonick-48tl/start.sh TTY diff --git a/firmware/opt/dbus-fz-sonick-48tl-with-s3/signals.py b/firmware/opt/dbus-fz-sonick-48tl-with-s3/signals.py new file mode 100644 index 000000000..e35c95603 --- /dev/null +++ b/firmware/opt/dbus-fz-sonick-48tl-with-s3/signals.py @@ -0,0 +1,374 @@ +# coding=utf-8 + +import config as cfg +from convert import mean, read_float, read_led_state, read_bool, count_bits, comma_separated, read_bitmap, return_in_list, first, read_hex_string +from data import BatterySignal, Battery, LedColor, ServiceSignal, BatteryStatus, LedState, CsvSignal + +# noinspection PyUnreachableCode +if False: + from typing import List, Iterable + +def read_voltage(): + return read_float(register=999, scale_factor=0.01, offset=0) + +def read_current(): + return read_float(register=1000, scale_factor=0.01, offset=-10000) + +def read_limb_bitmap(): + return read_bitmap(1059) + +def read_power(status): + return int(read_current()(status) * read_voltage()(status)) + +def interpret_limb_bitmap(bitmap_value): + string1_disabled = int((bitmap_value & 0b00001) != 0) + string2_disabled = int((bitmap_value & 0b00010) != 0) + string3_disabled = int((bitmap_value & 0b00100) != 0) + string4_disabled = int((bitmap_value & 0b01000) != 0) + string5_disabled = int((bitmap_value & 0b10000) != 0) + n_limb_strings = string1_disabled + string2_disabled + string3_disabled + string4_disabled + string5_disabled + return n_limb_strings + +def limp_strings_value(status): + return interpret_limb_bitmap(read_limb_bitmap()(status)) + +def calc_power_limit_imposed_by_voltage_limit(v, i, v_limit, r_int): + dv = v_limit - v + di = dv / r_int + p_limit = v_limit * (i + di) + return p_limit + +def calc_power_limit_imposed_by_current_limit(v, i, i_limit, r_int): + di = i_limit - i + dv = di * r_int + p_limit = i_limit * (v + dv) + return p_limit + +def calc_max_charge_power(status): + n_strings = cfg.NUM_OF_STRINGS_PER_BATTERY - limp_strings_value(status) + i_max = n_strings * cfg.I_MAX_PER_STRING + v_max = cfg.V_MAX + r_int_min = cfg.R_STRING_MIN / n_strings + r_int_max = cfg.R_STRING_MAX / n_strings + + v = read_voltage()(status) + i = read_current()(status) + + p_limits = [ + calc_power_limit_imposed_by_voltage_limit(v, i, v_max, r_int_min), + calc_power_limit_imposed_by_voltage_limit(v, i, v_max, r_int_max), + calc_power_limit_imposed_by_current_limit(v, i, i_max, r_int_min), + calc_power_limit_imposed_by_current_limit(v, i, i_max, r_int_max), + ] + + p_limit = min(p_limits) + p_limit = max(p_limit, 0) + return int(p_limit) + +def calc_max_discharge_power(status): + n_strings = cfg.NUM_OF_STRINGS_PER_BATTERY - limp_strings_value(status) + max_discharge_current = n_strings * cfg.I_MAX_PER_STRING + return int(max_discharge_current * read_voltage()(status)) + +def read_switch_closed(status): + value = read_bool(base_register=1013, bit=0)(status) + if value: + return False + return True + +def read_alarm_out_active(status): + value = read_bool(base_register=1013, bit=1)(status) + if value: + return False + return True + +def read_aux_relay(status): + value = read_bool(base_register=1013, bit=4)(status) + if value: + return False + return True + +def hex_string_to_ascii(hex_string): + hex_string = hex_string.replace(" ", "") + ascii_string = ''.join([chr(int(hex_string[i:i+2], 16)) for i in range(0, len(hex_string), 2)]) + return ascii_string + +def init_service_signals(batteries): + print("INSIDE INIT SERVICE SIGNALS") + n_batteries = len(batteries) + product_name = cfg.PRODUCT_NAME + ' x' + str(n_batteries) + return [ + ServiceSignal('/NbOfBatteries', n_batteries), + ServiceSignal('/Mgmt/ProcessName', __file__), + ServiceSignal('/Mgmt/ProcessVersion', cfg.SOFTWARE_VERSION), + ServiceSignal('/Mgmt/Connection', cfg.CONNECTION), + ServiceSignal('/DeviceInstance', cfg.DEVICE_INSTANCE), + ServiceSignal('/ProductName', product_name), + ServiceSignal('/ProductId', cfg.PRODUCT_ID), + ServiceSignal('/Connected', 1) + ] + +def init_battery_signals(): + print("START INIT SIGNALS") + battery_status_reader = read_hex_string(1060, 2) + + def read_eoc_reached(status): + battery_status_string = battery_status_reader(status) + return hex_string_to_ascii(battery_status_string) == "EOC_" + + def read_battery_cold(status): + return \ + read_led_state(register=1004, led=LedColor.green)(status) >= LedState.blinking_slow and \ + read_led_state(register=1004, led=LedColor.blue)(status) >= LedState.blinking_slow + + def read_soc(status): + soc = read_float(register=1053, scale_factor=0.1, offset=0)(status) + if soc > 99.9 and not read_eoc_reached(status): + return 99.9 + if soc >= 99.9 and read_eoc_reached(status): + return 100 + return soc + + def number_of_active_strings(status): + return cfg.NUM_OF_STRINGS_PER_BATTERY - limp_strings_value(status) + + def max_discharge_current(status): + return number_of_active_strings(status) * cfg.I_MAX_PER_STRING + + def max_charge_current(status): + return status.battery.ampere_hours / 2 + + return [ + BatterySignal('/TimeToTOCRequest', max, read_float(register=1052)), + BatterySignal('/EOCReached', return_in_list, read_eoc_reached), + BatterySignal('/NumOfLimbStrings', return_in_list, limp_strings_value), + BatterySignal('/Dc/0/Voltage', mean, get_value=read_voltage(), unit='V'), + BatterySignal('/Dc/0/Current', sum, get_value=read_current(), unit='A'), + BatterySignal('/Dc/0/Power', sum, get_value=read_power, unit='W'), + BatterySignal('/BussVoltage', mean, read_float(register=1001, scale_factor=0.01, offset=0), unit='V'), + BatterySignal('/Soc', mean, read_soc, unit='%'), + BatterySignal('/LowestSoc', min, read_float(register=1053, scale_factor=0.1, offset=0), unit='%'), + BatterySignal('/Dc/0/Temperature', mean, read_float(register=1003, scale_factor=0.1, offset=-400), unit='C'), + BatterySignal('/Dc/0/LowestTemperature', min, read_float(register=1003, scale_factor=0.1, offset=-400), unit='C'), + BatterySignal('/WarningFlags/TaM1', return_in_list, read_bool(base_register=1005, bit=1)), + BatterySignal('/WarningFlags/TbM1', return_in_list, read_bool(base_register=1005, bit=4)), + BatterySignal('/WarningFlags/VBm1', return_in_list, read_bool(base_register=1005, bit=6)), + BatterySignal('/WarningFlags/VBM1', return_in_list, read_bool(base_register=1005, bit=8)), + BatterySignal('/WarningFlags/IDM1', return_in_list, read_bool(base_register=1005, bit=10)), + BatterySignal('/WarningFlags/vsm1', return_in_list, read_bool(base_register=1005, bit=22)), + BatterySignal('/WarningFlags/vsM1', return_in_list, read_bool(base_register=1005, bit=24)), + BatterySignal('/WarningFlags/iCM1', return_in_list, read_bool(base_register=1005, bit=26)), + BatterySignal('/WarningFlags/iDM1', return_in_list, read_bool(base_register=1005, bit=28)), + BatterySignal('/WarningFlags/MID1', return_in_list, read_bool(base_register=1005, bit=30)), + BatterySignal('/WarningFlags/BLPW', return_in_list, read_bool(base_register=1005, bit=32)), + BatterySignal('/WarningFlags/CCBF', return_in_list, read_bool(base_register=1005, bit=33)), + BatterySignal('/WarningFlags/Ah_W', return_in_list, read_bool(base_register=1005, bit=35)), + BatterySignal('/WarningFlags/MPMM', return_in_list, read_bool(base_register=1005, bit=38)), + BatterySignal('/WarningFlags/TCdi', return_in_list, read_bool(base_register=1005, bit=40)), + BatterySignal('/WarningFlags/LMPW', return_in_list, read_bool(base_register=1005, bit=44)), + BatterySignal('/WarningFlags/TOCW', return_in_list, read_bool(base_register=1005, bit=47)), + BatterySignal('/WarningFlags/BUSL', return_in_list, read_bool(base_register=1005, bit=49)), + BatterySignal('/AlarmFlags/Tam', return_in_list, read_bool(base_register=1005, bit=0)), + BatterySignal('/AlarmFlags/TaM2', return_in_list, read_bool(base_register=1005, bit=2)), + BatterySignal('/AlarmFlags/Tbm', return_in_list, read_bool(base_register=1005, bit=3)), + BatterySignal('/AlarmFlags/TbM2', return_in_list, read_bool(base_register=1005, bit=5)), + BatterySignal('/AlarmFlags/VBm2', return_in_list, read_bool(base_register=1005, bit=7)), + BatterySignal('/AlarmFlags/VBM2', return_in_list, read_bool(base_register=1005, bit=9)), + BatterySignal('/AlarmFlags/IDM2', return_in_list, read_bool(base_register=1005, bit=11)), + BatterySignal('/AlarmFlags/ISOB', return_in_list, read_bool(base_register=1005, bit=12)), + BatterySignal('/AlarmFlags/MSWE', return_in_list, read_bool(base_register=1005, bit=13)), + BatterySignal('/AlarmFlags/FUSE', return_in_list, read_bool(base_register=1005, bit=14)), + BatterySignal('/AlarmFlags/HTRE', return_in_list, read_bool(base_register=1005, bit=15)), + BatterySignal('/AlarmFlags/TCPE', return_in_list, read_bool(base_register=1005, bit=16)), + BatterySignal('/AlarmFlags/STRE', return_in_list, read_bool(base_register=1005, bit=17)), + BatterySignal('/AlarmFlags/CME', return_in_list, read_bool(base_register=1005, bit=18)), + BatterySignal('/AlarmFlags/HWFL', return_in_list, read_bool(base_register=1005, bit=19)), + BatterySignal('/AlarmFlags/HWEM', return_in_list, read_bool(base_register=1005, bit=20)), + BatterySignal('/AlarmFlags/ThM', return_in_list, read_bool(base_register=1005, bit=21)), + BatterySignal('/AlarmFlags/vsm2', return_in_list, read_bool(base_register=1005, bit=23)), + BatterySignal('/AlarmFlags/vsM2', return_in_list, read_bool(base_register=1005, bit=25)), + BatterySignal('/AlarmFlags/iCM2', return_in_list, read_bool(base_register=1005, bit=27)), + BatterySignal('/AlarmFlags/iDM2', return_in_list, read_bool(base_register=1005, bit=29)), + BatterySignal('/AlarmFlags/MID2', return_in_list, read_bool(base_register=1005, bit=31)), + BatterySignal('/AlarmFlags/HTFS', return_in_list, read_bool(base_register=1005, bit=42)), + BatterySignal('/AlarmFlags/DATA', return_in_list, read_bool(base_register=1005, bit=43)), + BatterySignal('/AlarmFlags/LMPA', return_in_list, read_bool(base_register=1005, bit=45)), + BatterySignal('/AlarmFlags/HEBT', return_in_list, read_bool(base_register=1005, bit=46)), + BatterySignal('/AlarmFlags/CURM', return_in_list, read_bool(base_register=1005, bit=48)), + BatterySignal('/Diagnostics/LedStatus/Red', first, read_led_state(register=1004, led=LedColor.red)), + BatterySignal('/Diagnostics/LedStatus/Blue', first, read_led_state(register=1004, led=LedColor.blue)), + BatterySignal('/Diagnostics/LedStatus/Green', first, read_led_state(register=1004, led=LedColor.green)), + BatterySignal('/Diagnostics/LedStatus/Amber', first, read_led_state(register=1004, led=LedColor.amber)), + BatterySignal('/Diagnostics/IoStatus/MainSwitchClosed', return_in_list, read_switch_closed), + BatterySignal('/Diagnostics/IoStatus/AlarmOutActive', return_in_list, read_alarm_out_active), + BatterySignal('/Diagnostics/IoStatus/InternalFanActive', return_in_list, read_bool(base_register=1013, bit=2)), + BatterySignal('/Diagnostics/IoStatus/VoltMeasurementAllowed', return_in_list, read_bool(base_register=1013, bit=3)), + BatterySignal('/Diagnostics/IoStatus/AuxRelay', return_in_list, read_aux_relay), + BatterySignal('/Diagnostics/IoStatus/RemoteState', return_in_list, read_bool(base_register=1013, bit=5)), + BatterySignal('/Diagnostics/IoStatus/RiscOn', return_in_list, read_bool(base_register=1013, bit=6)), + BatterySignal('/IoStatus/BatteryCold', any, read_battery_cold), + BatterySignal('/Info/MaxDischargeCurrent', sum, max_discharge_current, unit='A'), + BatterySignal('/Info/MaxChargeCurrent', sum, max_charge_current, unit='A'), + BatterySignal('/Info/MaxChargeVoltage', min, lambda bs: bs.battery.v_max, unit='V'), + BatterySignal('/Info/MinDischargeVoltage', max, lambda bs: bs.battery.v_min, unit='V'), + BatterySignal('/Info/BatteryLowVoltage', max, lambda bs: bs.battery.v_min - 2, unit='V'), + BatterySignal('/Info/NumberOfStrings', sum, number_of_active_strings), + BatterySignal('/Info/MaxChargePower', sum, calc_max_charge_power), + BatterySignal('/Info/MaxDischargePower', sum, calc_max_discharge_power), + BatterySignal('/FirmwareVersion', comma_separated, lambda bs: bs.battery.firmware_version), + BatterySignal('/HardwareVersion', comma_separated, lambda bs: bs.battery.hardware_version), + BatterySignal('/BmsVersion', comma_separated, lambda bs: bs.battery.bms_version) + ] + +def create_csv_signals(firmware_version): + total_current = read_float(register=1062, scale_factor=0.01, offset=-10000) + + def read_total_current(status): + return total_current(status) + + def read_heating_current(status): + return total_current(status) - read_current()(status) + + def read_heating_power(status): + return read_voltage()(status) * read_heating_current(status) + + soc_ah = read_float(register=1002, scale_factor=0.1, offset=-10000) + + def read_soc_ah(status): + return soc_ah(status) + + def return_led_state(status, color): + led_state = read_led_state(register=1004, led=color)(status) + if led_state == LedState.blinking_fast or led_state == LedState.blinking_slow: + return "Blinking" + elif led_state == LedState.on: + return "On" + elif led_state == LedState.off: + return "Off" + return "Unknown" + + def return_led_state_blue(status): + return return_led_state(status, LedColor.blue) + + def return_led_state_red(status): + return return_led_state(status, LedColor.red) + + def return_led_state_green(status): + return return_led_state(status, LedColor.green) + + def return_led_state_amber(status): + return return_led_state(status, LedColor.amber) + + battery_status_reader = read_hex_string(1060, 2) + + def read_eoc_reached(status): + battery_status_string = battery_status_reader(status) + return hex_string_to_ascii(battery_status_string) == "EOC_" + + def read_serial_number(status): + serial_regs = [1055, 1056, 1057, 1058] + serial_parts = [] + for reg in serial_regs: + hex_value_fun = read_hex_string(reg, 1) + hex_value = hex_value_fun(status) + serial_parts.append(hex_value.replace(' ', '')) + serial_number = ''.join(serial_parts).rstrip('0') + return serial_number + + def time_since_toc_in_time_format(status): + time_in_minutes = read_float(register=1052)(status) + total_seconds = int(time_in_minutes * 60) + days = total_seconds // (24 * 3600) + total_seconds = total_seconds % (24 * 3600) + hours = total_seconds // 3600 + total_seconds %= 3600 + minutes = total_seconds // 60 + seconds = total_seconds % 60 + return "{}.{:02}:{:02}:{:02}".format(days, hours, minutes, seconds) + + return [ + CsvSignal('/Battery/Devices/FwVersion', firmware_version), + CsvSignal('/Battery/Devices/Dc/Power', read_power, 'W'), + CsvSignal('/Battery/Devices/Dc/Voltage', read_voltage(), 'V'), + CsvSignal('/Battery/Devices/Soc', read_float(register=1053, scale_factor=0.1, offset=0), '%'), + CsvSignal('/Battery/Devices/Temperatures/Cells/Average', read_float(register=1003, scale_factor=0.1, offset=-400), 'C'), + CsvSignal('/Battery/Devices/Dc/Current', read_current(), 'A'), + CsvSignal('/Battery/Devices/BusCurrent', read_total_current, 'A'), + CsvSignal('/Battery/Devices/CellsCurrent', read_current(), 'A'), + CsvSignal('/Battery/Devices/HeatingCurrent', read_heating_current, 'A'), + CsvSignal('/Battery/Devices/HeatingPower', read_heating_power, 'W'), + CsvSignal('/Battery/Devices/SOCAh', read_soc_ah), + CsvSignal('/Battery/Devices/Leds/Blue', return_led_state_blue), + CsvSignal('/Battery/Devices/Leds/Red', return_led_state_red), + CsvSignal('/Battery/Devices/Leds/Green', return_led_state_green), + CsvSignal('/Battery/Devices/Leds/Amber', return_led_state_amber), + CsvSignal('/Battery/Devices/BatteryStrings/String1Active', lambda status: int((read_limb_bitmap()(status) & 0b00001) != 0)), + CsvSignal('/Battery/Devices/BatteryStrings/String2Active', lambda status: int((read_limb_bitmap()(status) & 0b00010) != 0)), + CsvSignal('/Battery/Devices/BatteryStrings/String3Active', lambda status: int((read_limb_bitmap()(status) & 0b00100) != 0)), + CsvSignal('/Battery/Devices/BatteryStrings/String4Active', lambda status: int((read_limb_bitmap()(status) & 0b01000) != 0)), + CsvSignal('/Battery/Devices/BatteryStrings/String5Active', lambda status: int((read_limb_bitmap()(status) & 0b10000) != 0)), + CsvSignal('/Battery/Devices/IoStatus/ConnectedToDcBus', read_switch_closed), + CsvSignal('/Battery/Devices/IoStatus/AlarmOutActive', read_alarm_out_active), + CsvSignal('/Battery/Devices/IoStatus/InternalFanActive', read_bool(base_register=1013, bit=2)), + CsvSignal('/Battery/Devices/IoStatus/VoltMeasurementAllowed', read_bool(base_register=1013, bit=3)), + CsvSignal('/Battery/Devices/IoStatus/AuxRelayBus', read_aux_relay), + CsvSignal('/Battery/Devices/IoStatus/RemoteStateActive', read_bool(base_register=1013, bit=5)), + CsvSignal('/Battery/Devices/IoStatus/RiscActive', read_bool(base_register=1013, bit=6)), + CsvSignal('/Battery/Devices/Eoc', read_eoc_reached), + CsvSignal('/Battery/Devices/SerialNumber', read_serial_number), + CsvSignal('/Battery/Devices/TimeSinceTOC', time_since_toc_in_time_format), + CsvSignal('/Battery/Devices/MaxChargePower', calc_max_charge_power), + CsvSignal('/Battery/Devices/MaxDischargePower', calc_max_discharge_power), + ] + +def read_warning_and_alarm_flags(): + return [ + # Warnings + CsvSignal('/Battery/Devices/WarningFlags/TaM1', read_bool(base_register=1005, bit=1)), + CsvSignal('/Battery/Devices/WarningFlags/TbM1', read_bool(base_register=1005, bit=4)), + CsvSignal('/Battery/Devices/WarningFlags/VBm1', read_bool(base_register=1005, bit=6)), + CsvSignal('/Battery/Devices/WarningFlags/VBM1', read_bool(base_register=1005, bit=8)), + CsvSignal('/Battery/Devices/WarningFlags/IDM1', read_bool(base_register=1005, bit=10)), + CsvSignal('/Battery/Devices/WarningFlags/vsm1', read_bool(base_register=1005, bit=22)), + CsvSignal('/Battery/Devices/WarningFlags/vsM1', read_bool(base_register=1005, bit=24)), + CsvSignal('/Battery/Devices/WarningFlags/iCM1', read_bool(base_register=1005, bit=26)), + CsvSignal('/Battery/Devices/WarningFlags/iDM1', read_bool(base_register=1005, bit=28)), + CsvSignal('/Battery/Devices/WarningFlags/MID1', read_bool(base_register=1005, bit=30)), + CsvSignal('/Battery/Devices/WarningFlags/BLPW', read_bool(base_register=1005, bit=32)), + CsvSignal('/Battery/Devices/WarningFlags/CCBF', read_bool(base_register=1005, bit=33)), + CsvSignal('/Battery/Devices/WarningFlags/Ah_W', read_bool(base_register=1005, bit=35)), + CsvSignal('/Battery/Devices/WarningFlags/MPMM', read_bool(base_register=1005, bit=38)), + CsvSignal('/Battery/Devices/WarningFlags/TCdi', read_bool(base_register=1005, bit=40)), + CsvSignal('/Battery/Devices/WarningFlags/LMPW', read_bool(base_register=1005, bit=44)), + CsvSignal('/Battery/Devices/WarningFlags/TOCW', read_bool(base_register=1005, bit=47)), + CsvSignal('/Battery/Devices/WarningFlags/BUSL', read_bool(base_register=1005, bit=49)), + ], [ + # Alarms + CsvSignal('/Battery/Devices/AlarmFlags/Tam', read_bool(base_register=1005, bit=0)), + CsvSignal('/Battery/Devices/AlarmFlags/TaM2', read_bool(base_register=1005, bit=2)), + CsvSignal('/Battery/Devices/AlarmFlags/Tbm', read_bool(base_register=1005, bit=3)), + CsvSignal('/Battery/Devices/AlarmFlags/TbM2', read_bool(base_register=1005, bit=5)), + CsvSignal('/Battery/Devices/AlarmFlags/VBm2', read_bool(base_register=1005, bit=7)), + CsvSignal('/Battery/Devices/AlarmFlags/VBM2', read_bool(base_register=1005, bit=9)), + CsvSignal('/Battery/Devices/AlarmFlags/IDM2', read_bool(base_register=1005, bit=11)), + CsvSignal('/Battery/Devices/AlarmFlags/ISOB', read_bool(base_register=1005, bit=12)), + CsvSignal('/Battery/Devices/AlarmFlags/MSWE', read_bool(base_register=1005, bit=13)), + CsvSignal('/Battery/Devices/AlarmFlags/FUSE', read_bool(base_register=1005, bit=14)), + CsvSignal('/Battery/Devices/AlarmFlags/HTRE', read_bool(base_register=1005, bit=15)), + CsvSignal('/Battery/Devices/AlarmFlags/TCPE', read_bool(base_register=1005, bit=16)), + CsvSignal('/Battery/Devices/AlarmFlags/STRE', read_bool(base_register=1005, bit=17)), + CsvSignal('/Battery/Devices/AlarmFlags/CME', read_bool(base_register=1005, bit=18)), + CsvSignal('/Battery/Devices/AlarmFlags/HWFL', read_bool(base_register=1005, bit=19)), + CsvSignal('/Battery/Devices/AlarmFlags/HWEM', read_bool(base_register=1005, bit=20)), + CsvSignal('/Battery/Devices/AlarmFlags/ThM', read_bool(base_register=1005, bit=21)), + CsvSignal('/Battery/Devices/AlarmFlags/vsm2', read_bool(base_register=1005, bit=23)), + CsvSignal('/Battery/Devices/AlarmFlags/vsM2', read_bool(base_register=1005, bit=25)), + CsvSignal('/Battery/Devices/AlarmFlags/iCM2', read_bool(base_register=1005, bit=27)), + CsvSignal('/Battery/Devices/AlarmFlags/iDM2', read_bool(base_register=1005, bit=29)), + CsvSignal('/Battery/Devices/AlarmFlags/MID2', read_bool(base_register=1005, bit=31)), + CsvSignal('/Battery/Devices/AlarmFlags/HTFS', read_bool(base_register=1005, bit=42)), + CsvSignal('/Battery/Devices/AlarmFlags/DATA', read_bool(base_register=1005, bit=43)), + CsvSignal('/Battery/Devices/AlarmFlags/LMPA', read_bool(base_register=1005, bit=45)), + CsvSignal('/Battery/Devices/AlarmFlags/HEBT', read_bool(base_register=1005, bit=46)), + CsvSignal('/Battery/Devices/AlarmFlags/CURM', read_bool(base_register=1005, bit=48)), + ] diff --git a/firmware/opt/dbus-fz-sonick-48tl-with-s3/start.sh b/firmware/opt/dbus-fz-sonick-48tl-with-s3/start.sh new file mode 100755 index 000000000..83860d3e4 --- /dev/null +++ b/firmware/opt/dbus-fz-sonick-48tl-with-s3/start.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +. /opt/victronenergy/serial-starter/run-service.sh + +app="/opt/innovenergy/dbus-fzsonick-48tl/dbus-fzsonick-48tl.py" +args="$tty" +start $args diff --git a/python/dbus-fz-sonick-48tl-with-s3/old_signals.py b/python/dbus-fz-sonick-48tl-with-s3/old_signals.py new file mode 100755 index 000000000..79bdc97a1 --- /dev/null +++ b/python/dbus-fz-sonick-48tl-with-s3/old_signals.py @@ -0,0 +1,547 @@ +# coding=utf-8 + +import config as cfg +from convert import mean, read_float, read_led_state, read_bool, count_bits, comma_separated, read_bitmap, return_in_list, first, read_hex_string +from data import BatterySignal, Battery, LedColor, ServiceSignal, BatteryStatus, LedState, CsvSignal + +# noinspection PyUnreachableCode +if False: + from typing import List, Iterable + + +def init_service_signals(batteries): + print("INSIDE INIT SERVICE SIGNALS") + # type: (List[Battery]) -> Iterable[ServiceSignal] + + n_batteries = len(batteries) + product_name = cfg.PRODUCT_NAME + ' x' + str(n_batteries) + + return [ + ServiceSignal('/NbOfBatteries', n_batteries), # TODO: nb of operational batteries + ServiceSignal('/Mgmt/ProcessName', __file__), + ServiceSignal('/Mgmt/ProcessVersion', cfg.SOFTWARE_VERSION), + ServiceSignal('/Mgmt/Connection', cfg.CONNECTION), + ServiceSignal('/DeviceInstance', cfg.DEVICE_INSTANCE), + ServiceSignal('/ProductName', product_name), + ServiceSignal('/ProductId', cfg.PRODUCT_ID), + ServiceSignal('/Connected', 1) + ] + + +def init_battery_signals(): + # type: () -> Iterable[BatterySignal] + print("START INIT SIGNALS") + read_voltage = read_float(register=999, scale_factor=0.01, offset=0) + read_current = read_float(register=1000, scale_factor=0.01, offset=-10000) + + read_led_amber = read_led_state(register=1004, led=LedColor.amber) + read_led_green = read_led_state(register=1004, led=LedColor.green) + read_led_blue = read_led_state(register=1004, led=LedColor.blue) + read_led_red = read_led_state(register=1004, led=LedColor.red) + + def read_power(status): + # type: (BatteryStatus) -> int + return int(read_current(status) * read_voltage(status)) + + def calc_power_limit_imposed_by_voltage_limit(v, i, v_limit, r_int): + # type: (float, float, float, float) -> float + + dv = v_limit - v + di = dv / r_int + p_limit = v_limit * (i + di) + + return p_limit + + def calc_power_limit_imposed_by_current_limit(v, i, i_limit, r_int): + # type: (float, float, float, float) -> float + + di = i_limit - i + dv = di * r_int + p_limit = i_limit * (v + dv) + + return p_limit + + def calc_max_charge_power(status): + # type: (BatteryStatus) -> int + n_strings = number_of_active_strings(status) + i_max = n_strings * cfg.I_MAX_PER_STRING + v_max = cfg.V_MAX + r_int_min = cfg.R_STRING_MIN / n_strings + r_int_max = cfg.R_STRING_MAX / n_strings + + v = read_voltage(status) + i = read_current(status) + + p_limits = [ + calc_power_limit_imposed_by_voltage_limit(v, i, v_max, r_int_min), + calc_power_limit_imposed_by_voltage_limit(v, i, v_max, r_int_max), + calc_power_limit_imposed_by_current_limit(v, i, i_max, r_int_min), + calc_power_limit_imposed_by_current_limit(v, i, i_max, r_int_max), + ] + + p_limit = min(p_limits) # p_limit is normally positive here (signed) + p_limit = max(p_limit, 0) # charge power must not become negative + + return int(p_limit) + + def calc_max_discharge_power(status): + n_strings = number_of_active_strings(status) + max_discharge_current = n_strings*cfg.I_MAX_PER_STRING + return int(max_discharge_current*read_voltage(status)) + + def read_battery_cold(status): + return \ + read_led_green(status) >= LedState.blinking_slow and \ + read_led_blue(status) >= LedState.blinking_slow + + def read_soc(status): + soc = read_float(register=1053, scale_factor=0.1, offset=0)(status) + + # if the SOC is 100 but EOC is not yet reached, report 99.9 instead of 100 + if soc > 99.9 and not read_eoc_reached(status): + return 99.9 + if soc >= 99.9 and read_eoc_reached(status): + return 100 + + return soc + + def hex_string_to_ascii(hex_string): + # Ensure the hex_string is correctly formatted without spaces + hex_string = hex_string.replace(" ", "") + # Convert every two characters (a byte) in the hex string to ASCII + ascii_string = ''.join([chr(int(hex_string[i:i+2], 16)) for i in range(0, len(hex_string), 2)]) + return ascii_string + + battery_status_reader = read_hex_string(1060,2) + + def read_eoc_reached(status): + battery_status_string = battery_status_reader(status) + return hex_string_to_ascii(battery_status_string) == "EOC_" + + read_limb_bitmap = read_bitmap(1059) + + def interpret_limb_bitmap(bitmap_value): + #print("DIABASE TIN TIMI KAI MPIKE STIN INTERPRET LIMB BITMAP") + # The bit for string 1 also monitors all 5 strings: 0000 0000 means All 5 strings activated. 0000 0001 means string 1 disabled. + string1_disabled = int((bitmap_value & 0b00001) != 0) + string2_disabled = int((bitmap_value & 0b00010) != 0) + string3_disabled = int((bitmap_value & 0b00100) != 0) + string4_disabled = int((bitmap_value & 0b01000) != 0) + string5_disabled = int((bitmap_value & 0b10000) != 0) + n_limb_strings = string1_disabled+string2_disabled+string3_disabled+string4_disabled+string5_disabled + #print("KAI I TIMI EINAI: ", n_limb_strings) + return n_limb_strings + + def limp_strings_value(status): + return interpret_limb_bitmap(read_limb_bitmap(status)) + + def number_of_active_strings(status): + return cfg.NUM_OF_STRINGS_PER_BATTERY - limp_strings_value(status) + + def max_discharge_current(status): + #print("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAinside discharge current") + #exit(0) + return number_of_active_strings(status) * cfg.I_MAX_PER_STRING + + def max_charge_current(status): + return status.battery.ampere_hours/2 + + def read_switch_closed(status): + value = read_bool(base_register=1013, bit=0)(status) + if value: + return False + return True + + def read_alarm_out_active(status): + value = read_bool(base_register=1013, bit=1)(status) + if value: + return False + return True + + def read_aux_relay(status): + value = read_bool(base_register=1013, bit=4)(status) + if value: + return False + return True + + return [ + BatterySignal('/TimeToTOCRequest', max, read_float(register=1052)), + BatterySignal('/EOCReached', return_in_list, read_eoc_reached), + BatterySignal('/NumOfLimbStrings', return_in_list, limp_strings_value), + BatterySignal('/Dc/0/Voltage', mean, get_value=read_voltage, unit='V'), + BatterySignal('/Dc/0/Current', sum, get_value=read_current, unit='A'), + BatterySignal('/Dc/0/Power', sum, get_value=read_power, unit='W'), + + BatterySignal('/BussVoltage', mean, read_float(register=1001, scale_factor=0.01, offset=0), unit='V'), + BatterySignal('/Soc', mean, read_soc, unit='%'), + BatterySignal('/LowestSoc', min, read_float(register=1053, scale_factor=0.1, offset=0), unit='%'), + BatterySignal('/Dc/0/Temperature', mean, read_float(register=1003, scale_factor=0.1, offset=-400), unit='C'), + BatterySignal('/Dc/0/LowestTemperature', min, read_float(register=1003, scale_factor=0.1, offset=-400), unit='C'), + + #BatterySignal('/NumberOfWarningFlags', sum, count_bits(base_register=1005, nb_of_registers=3, nb_of_bits=47)), + BatterySignal('/WarningFlags/TaM1', return_in_list, read_bool(base_register=1005, bit=1)), + BatterySignal('/WarningFlags/TbM1', return_in_list, read_bool(base_register=1005, bit=4)), + BatterySignal('/WarningFlags/VBm1', return_in_list, read_bool(base_register=1005, bit=6)), + BatterySignal('/WarningFlags/VBM1', return_in_list, read_bool(base_register=1005, bit=8)), + BatterySignal('/WarningFlags/IDM1', return_in_list, read_bool(base_register=1005, bit=10)), + BatterySignal('/WarningFlags/vsm1', return_in_list, read_bool(base_register=1005, bit=22)), + BatterySignal('/WarningFlags/vsM1', return_in_list, read_bool(base_register=1005, bit=24)), + BatterySignal('/WarningFlags/iCM1', return_in_list, read_bool(base_register=1005, bit=26)), + BatterySignal('/WarningFlags/iDM1', return_in_list, read_bool(base_register=1005, bit=28)), + BatterySignal('/WarningFlags/MID1', return_in_list, read_bool(base_register=1005, bit=30)), + BatterySignal('/WarningFlags/BLPW', return_in_list, read_bool(base_register=1005, bit=32)), + BatterySignal('/WarningFlags/CCBF', return_in_list, read_bool(base_register=1005, bit=33)), + BatterySignal('/WarningFlags/Ah_W', return_in_list, read_bool(base_register=1005, bit=35)), + BatterySignal('/WarningFlags/MPMM', return_in_list, read_bool(base_register=1005, bit=38)), + #BatterySignal('/WarningFlags/TCMM', any, read_bool(base_register=1005, bit=39)), + BatterySignal('/WarningFlags/TCdi', return_in_list, read_bool(base_register=1005, bit=40)), + #BatterySignal('/WarningFlags/WMTO', any, read_bool(base_register=1005, bit=41)), + BatterySignal('/WarningFlags/LMPW', return_in_list, read_bool(base_register=1005, bit=44)), + #BatterySignal('/WarningFlags/CELL1', any, read_bool(base_register=1005, bit=46)), + BatterySignal('/WarningFlags/TOCW', return_in_list, read_bool(base_register=1005, bit=47)), + BatterySignal('/WarningFlags/BUSL', return_in_list, read_bool(base_register=1005, bit=49)), + + #BatterySignal('/NumberOfAlarmFlags', sum, count_bits(base_register=1009, nb_of_registers=3, nb_of_bits=47)), + BatterySignal('/AlarmFlags/Tam', return_in_list, read_bool(base_register=1005, bit=0)), + BatterySignal('/AlarmFlags/TaM2', return_in_list, read_bool(base_register=1005, bit=2)), + BatterySignal('/AlarmFlags/Tbm', return_in_list, read_bool(base_register=1005, bit=3)), + BatterySignal('/AlarmFlags/TbM2', return_in_list, read_bool(base_register=1005, bit=5)), + BatterySignal('/AlarmFlags/VBm2', return_in_list, read_bool(base_register=1005, bit=7)), + BatterySignal('/AlarmFlags/VBM2', return_in_list, read_bool(base_register=1005, bit=9)), + BatterySignal('/AlarmFlags/IDM2', return_in_list, read_bool(base_register=1005, bit=11)), + BatterySignal('/AlarmFlags/ISOB', return_in_list, read_bool(base_register=1005, bit=12)), + BatterySignal('/AlarmFlags/MSWE', return_in_list, read_bool(base_register=1005, bit=13)), + BatterySignal('/AlarmFlags/FUSE', return_in_list, read_bool(base_register=1005, bit=14)), + BatterySignal('/AlarmFlags/HTRE', return_in_list, read_bool(base_register=1005, bit=15)), + BatterySignal('/AlarmFlags/TCPE', return_in_list, read_bool(base_register=1005, bit=16)), + BatterySignal('/AlarmFlags/STRE', return_in_list, read_bool(base_register=1005, bit=17)), + BatterySignal('/AlarmFlags/CME', return_in_list, read_bool(base_register=1005, bit=18)), + BatterySignal('/AlarmFlags/HWFL', return_in_list, read_bool(base_register=1005, bit=19)), + BatterySignal('/AlarmFlags/HWEM', return_in_list, read_bool(base_register=1005, bit=20)), + BatterySignal('/AlarmFlags/ThM', return_in_list, read_bool(base_register=1005, bit=21)), + #BatterySignal('/AlarmFlags/vsm1', any, read_bool(base_register=1005, bit=22)), + BatterySignal('/AlarmFlags/vsm2', return_in_list, read_bool(base_register=1005, bit=23)), + BatterySignal('/AlarmFlags/vsM2', return_in_list, read_bool(base_register=1005, bit=25)), + BatterySignal('/AlarmFlags/iCM2', return_in_list, read_bool(base_register=1005, bit=27)), + BatterySignal('/AlarmFlags/iDM2', return_in_list, read_bool(base_register=1005, bit=29)), + BatterySignal('/AlarmFlags/MID2', return_in_list, read_bool(base_register=1005, bit=31)), + #BatterySignal('/AlarmFlags/CCBF', any, read_bool(base_register=1005, bit=33)), + #BatterySignal('/AlarmFlags/AhFL', any, read_bool(base_register=1005, bit=34)), + #BatterySignal('/AlarmFlags/TbCM', any, read_bool(base_register=1005, bit=36)), + #BatterySignal('/AlarmFlags/BRNF', any, read_bool(base_register=1005, bit=37)), + BatterySignal('/AlarmFlags/HTFS', return_in_list, read_bool(base_register=1005, bit=42)), + BatterySignal('/AlarmFlags/DATA', return_in_list, read_bool(base_register=1005, bit=43)), + BatterySignal('/AlarmFlags/LMPA', return_in_list, read_bool(base_register=1005, bit=45)), + BatterySignal('/AlarmFlags/HEBT', return_in_list, read_bool(base_register=1005, bit=46)), + #BatterySignal('/AlarmFlags/bit47AlarmDummy', any,read_bool(base_register=1005, bit=47)), + BatterySignal('/AlarmFlags/CURM', return_in_list, read_bool(base_register=1005, bit=48)), + + BatterySignal('/Diagnostics/LedStatus/Red', first, read_led_red), + BatterySignal('/Diagnostics/LedStatus/Blue', first, read_led_blue), + BatterySignal('/Diagnostics/LedStatus/Green', first, read_led_green), + BatterySignal('/Diagnostics/LedStatus/Amber', first, read_led_amber), + + BatterySignal('/Diagnostics/IoStatus/MainSwitchClosed', return_in_list, read_switch_closed), + BatterySignal('/Diagnostics/IoStatus/AlarmOutActive', return_in_list, read_alarm_out_active), + BatterySignal('/Diagnostics/IoStatus/InternalFanActive', return_in_list, read_bool(base_register=1013, bit=2)), + BatterySignal('/Diagnostics/IoStatus/VoltMeasurementAllowed', return_in_list, read_bool(base_register=1013, bit=3)), + BatterySignal('/Diagnostics/IoStatus/AuxRelay', return_in_list, read_aux_relay), + BatterySignal('/Diagnostics/IoStatus/RemoteState', return_in_list, read_bool(base_register=1013, bit=5)), + BatterySignal('/Diagnostics/IoStatus/RiscOn', return_in_list, read_bool(base_register=1013, bit=6)), + + BatterySignal('/IoStatus/BatteryCold', any, read_battery_cold), + + # see protocol doc page 7 + BatterySignal('/Info/MaxDischargeCurrent', sum, max_discharge_current, unit='A'), + BatterySignal('/Info/MaxChargeCurrent', sum, max_charge_current, unit='A'), + BatterySignal('/Info/MaxChargeVoltage', min, lambda bs: bs.battery.v_max, unit='V'), + BatterySignal('/Info/MinDischargeVoltage', max, lambda bs: bs.battery.v_min, unit='V'), + BatterySignal('/Info/BatteryLowVoltage' , max, lambda bs: bs.battery.v_min-2, unit='V'), + BatterySignal('/Info/NumberOfStrings', sum, number_of_active_strings), + + BatterySignal('/Info/MaxChargePower', sum, calc_max_charge_power), + BatterySignal('/Info/MaxDischargePower', sum, calc_max_discharge_power), + + BatterySignal('/FirmwareVersion', comma_separated, lambda bs: bs.battery.firmware_version), + BatterySignal('/HardwareVersion', comma_separated, lambda bs: bs.battery.hardware_version), + BatterySignal('/BmsVersion', comma_separated, lambda bs: bs.battery.bms_version) + + ] + + +def create_csv_signals(firmware_version): + read_voltage = read_float(register=999, scale_factor=0.01, offset=0) + read_current = read_float(register=1000, scale_factor=0.01, offset=-10000) + read_limb_bitmap = read_bitmap(1059) + + def read_power(status): + return int(read_current(status) * read_voltage(status)) + + def string1_disabled(status): + bitmap_value = read_limb_bitmap(status) + return int((bitmap_value & 0b00001) != 0) + + def string2_disabled(status): + bitmap_value = read_limb_bitmap(status) + return int((bitmap_value & 0b00010) != 0) + + def string3_disabled(status): + bitmap_value = read_limb_bitmap(status) + return int((bitmap_value & 0b00100) != 0) + + def string4_disabled(status): + bitmap_value = read_limb_bitmap(status) + return int((bitmap_value & 0b01000) != 0) + + def string5_disabled(status): + bitmap_value = read_limb_bitmap(status) + return int((bitmap_value & 0b10000) != 0) + + read_limb_bitmap = read_bitmap(1059) + + def interpret_limb_bitmap(bitmap_value): + #print("DIABASE TIN TIMI KAI MPIKE STIN INTERPRET LIMB BITMAP") + # The bit for string 1 also monitors all 5 strings: 0000 0000 means All 5 strings activated. 0000 0001 means string 1 disabled. + string1_disabled = int((bitmap_value & 0b00001) != 0) + string2_disabled = int((bitmap_value & 0b00010) != 0) + string3_disabled = int((bitmap_value & 0b00100) != 0) + string4_disabled = int((bitmap_value & 0b01000) != 0) + string5_disabled = int((bitmap_value & 0b10000) != 0) + n_limb_strings = string1_disabled+string2_disabled+string3_disabled+string4_disabled+string5_disabled + #print("KAI I TIMI EINAI: ", n_limb_strings) + return n_limb_strings + + + def limp_strings_value(status): + return interpret_limb_bitmap(read_limb_bitmap(status)) + + def calc_max_charge_power(status): + # type: (BatteryStatus) -> int + n_strings = cfg.NUM_OF_STRINGS_PER_BATTERY-limp_strings_value(status) + i_max = n_strings * cfg.I_MAX_PER_STRING + v_max = cfg.V_MAX + r_int_min = cfg.R_STRING_MIN / n_strings + r_int_max = cfg.R_STRING_MAX / n_strings + + v = read_voltage(status) + i = read_current(status) + + p_limits = [ + calc_power_limit_imposed_by_voltage_limit(v, i, v_max, r_int_min), + calc_power_limit_imposed_by_voltage_limit(v, i, v_max, r_int_max), + calc_power_limit_imposed_by_current_limit(v, i, i_max, r_int_min), + calc_power_limit_imposed_by_current_limit(v, i, i_max, r_int_max), + ] + + p_limit = min(p_limits) # p_limit is normally positive here (signed) + p_limit = max(p_limit, 0) # charge power must not become negative + + return int(p_limit) + + def calc_max_discharge_power(status): + n_strings = cfg.NUM_OF_STRINGS_PER_BATTERY-limp_strings_value(status) + max_discharge_current = n_strings*cfg.I_MAX_PER_STRING + return int(max_discharge_current*read_voltage(status)) + + total_current = read_float(register=1062, scale_factor=0.01, offset=-10000) + + def read_total_current(status): + return total_current(status) + + def read_heating_current(status): + return total_current(status) - read_current(status) + + def read_heating_power(status): + return read_voltage(status) * read_heating_current(status) + + soc_ah = read_float(register=1002, scale_factor=0.1, offset=-10000) + + def read_soc_ah(status): + return soc_ah(status) + + def return_led_state(status, color): + led_state = read_led_state(register=1004, led=color)(status) + if led_state == LedState.blinking_fast or led_state == LedState.blinking_slow: + return "Blinking" + elif led_state == LedState.on: + return "On" + elif led_state == LedState.off: + return "Off" + return "Unknown" + + def return_led_state_blue(status): + return return_led_state(status, LedColor.blue) + + def return_led_state_red(status): + return return_led_state(status, LedColor.red) + + def return_led_state_green(status): + return return_led_state(status, LedColor.green) + + def return_led_state_amber(status): + return return_led_state(status, LedColor.amber) + + def read_switch_closed(status): + value = read_bool(base_register=1013, bit=0)(status) + if value: + return False + return True + + def read_alarm_out_active(status): + value = read_bool(base_register=1013, bit=1)(status) + if value: + return False + return True + + def read_aux_relay(status): + value = read_bool(base_register=1013, bit=4)(status) + if value: + return False + return True + + battery_status_reader = read_hex_string(1060,2) + + def hex_string_to_ascii(hex_string): + # Ensure the hex_string is correctly formatted without spaces + hex_string = hex_string.replace(" ", "") + # Convert every two characters (a byte) in the hex string to ASCII + ascii_string = ''.join([chr(int(hex_string[i:i+2], 16)) for i in range(0, len(hex_string), 2)]) + return ascii_string + + def read_eoc_reached(status): + battery_status_string = battery_status_reader(status) + return hex_string_to_ascii(battery_status_string) == "EOC_" + + def read_serial_number(status): + serial_regs = [1055, 1056, 1057, 1058] + serial_parts = [] + for reg in serial_regs: + # reading each register as a single hex value + hex_value_fun = read_hex_string(reg, 1) + hex_value = hex_value_fun(status) + # append without spaces and leading zeros stripped if any + serial_parts.append(hex_value.replace(' ', '')) + # concatenate all parts to form the full serial number + serial_number = ''.join(serial_parts).rstrip('0') + return serial_number + + def time_since_toc_in_time_format(status): + time_in_minutes = read_float(register=1052)(status) + # Convert minutes to total seconds + total_seconds = int(time_in_minutes * 60) + # Calculate days, hours, minutes, and seconds + days = total_seconds // (24 * 3600) + total_seconds = total_seconds % (24 * 3600) + hours = total_seconds // 3600 + total_seconds %= 3600 + minutes = total_seconds // 60 + seconds = total_seconds % 60 + # Format the string to show days.hours:minutes:seconds + return "{}.{:02}:{:02}:{:02}".format(days, hours, minutes, seconds) + + def calc_power_limit_imposed_by_voltage_limit(v, i, v_limit, r_int): + # type: (float, float, float, float) -> float + + dv = v_limit - v + di = dv / r_int + p_limit = v_limit * (i + di) + + return p_limit + + def calc_power_limit_imposed_by_current_limit(v, i, i_limit, r_int): + # type: (float, float, float, float) -> float + + di = i_limit - i + dv = di * r_int + p_limit = i_limit * (v + dv) + + return p_limit + + + return [ + CsvSignal('/Battery/Devices/FwVersion', firmware_version), + CsvSignal('/Battery/Devices/Dc/Power', read_power, 'W'), + CsvSignal('/Battery/Devices/Dc/Voltage', read_voltage, 'V'), + CsvSignal('/Battery/Devices/Soc', read_float(register=1053, scale_factor=0.1, offset=0), '%'), + CsvSignal('/Battery/Devices/Temperatures/Cells/Average', read_float(register=1003, scale_factor=0.1, offset=-400), 'C'), + CsvSignal('/Battery/Devices/Dc/Current', read_current, 'A'), + CsvSignal('/Battery/Devices/BusCurrent', read_total_current, 'A'), + CsvSignal('/Battery/Devices/CellsCurrent', read_current, 'A'), + CsvSignal('/Battery/Devices/HeatingCurrent', read_heating_current, 'A'), + CsvSignal('/Battery/Devices/HeatingPower', read_heating_power, 'W'), + CsvSignal('/Battery/Devices/SOCAh', read_soc_ah), + CsvSignal('/Battery/Devices/Leds/Blue', return_led_state_blue), + CsvSignal('/Battery/Devices/Leds/Red', return_led_state_red), + CsvSignal('/Battery/Devices/Leds/Green', return_led_state_green), + CsvSignal('/Battery/Devices/Leds/Amber', return_led_state_amber), + CsvSignal('/Battery/Devices/BatteryStrings/String1Active', string1_disabled), + CsvSignal('/Battery/Devices/BatteryStrings/String2Active', string2_disabled), + CsvSignal('/Battery/Devices/BatteryStrings/String3Active', string3_disabled), + CsvSignal('/Battery/Devices/BatteryStrings/String4Active', string4_disabled), + CsvSignal('/Battery/Devices/BatteryStrings/String5Active', string5_disabled), + CsvSignal('/Battery/Devices/IoStatus/ConnectedToDcBus', read_switch_closed), + CsvSignal('/Battery/Devices/IoStatus/AlarmOutActive', read_alarm_out_active), + CsvSignal('/Battery/Devices/IoStatus/InternalFanActive', read_bool(base_register=1013, bit=2)), + CsvSignal('/Battery/Devices/IoStatus/VoltMeasurementAllowed', read_bool(base_register=1013, bit=3)), + CsvSignal('/Battery/Devices/IoStatus/AuxRelayBus', read_aux_relay), + CsvSignal('/Battery/Devices/IoStatus/RemoteStateActive', read_bool(base_register=1013, bit=5)), + CsvSignal('/Battery/Devices/IoStatus/RiscActive', read_bool(base_register=1013, bit=6)), + CsvSignal('/Battery/Devices/Eoc', read_eoc_reached), + CsvSignal('/Battery/Devices/SerialNumber', read_serial_number), + CsvSignal('/Battery/Devices/TimeSinceTOC', time_since_toc_in_time_format), + CsvSignal('/Battery/Devices/MaxChargePower', calc_max_charge_power), + CsvSignal('/Battery/Devices/MaxDischargePower', calc_max_discharge_power), + ] + + +def read_warning_and_alarm_flags(): + return [ + # Warnings + CsvSignal('/Battery/Devices/WarningFlags/TaM1', read_bool(base_register=1005, bit=1)), + CsvSignal('/Battery/Devices/WarningFlags/TbM1', read_bool(base_register=1005, bit=4)), + CsvSignal('/Battery/Devices/WarningFlags/VBm1', read_bool(base_register=1005, bit=6)), + CsvSignal('/Battery/Devices/WarningFlags/VBM1', read_bool(base_register=1005, bit=8)), + CsvSignal('/Battery/Devices/WarningFlags/IDM1', read_bool(base_register=1005, bit=10)), + CsvSignal('/Battery/Devices/WarningFlags/vsm1', read_bool(base_register=1005, bit=22)), + CsvSignal('/Battery/Devices/WarningFlags/vsM1', read_bool(base_register=1005, bit=24)), + CsvSignal('/Battery/Devices/WarningFlags/iCM1', read_bool(base_register=1005, bit=26)), + CsvSignal('/Battery/Devices/WarningFlags/iDM1', read_bool(base_register=1005, bit=28)), + CsvSignal('/Battery/Devices/WarningFlags/MID1', read_bool(base_register=1005, bit=30)), + CsvSignal('/Battery/Devices/WarningFlags/BLPW', read_bool(base_register=1005, bit=32)), + CsvSignal('/Battery/Devices/WarningFlags/CCBF', read_bool(base_register=1005, bit=33)), + CsvSignal('/Battery/Devices/WarningFlags/Ah_W', read_bool(base_register=1005, bit=35)), + CsvSignal('/Battery/Devices/WarningFlags/MPMM', read_bool(base_register=1005, bit=38)), + CsvSignal('/Battery/Devices/WarningFlags/TCdi', read_bool(base_register=1005, bit=40)), + CsvSignal('/Battery/Devices/WarningFlags/LMPW', read_bool(base_register=1005, bit=44)), + CsvSignal('/Battery/Devices/WarningFlags/TOCW', read_bool(base_register=1005, bit=47)), + CsvSignal('/Battery/Devices/WarningFlags/BUSL', read_bool(base_register=1005, bit=49)), + ], [ + # Alarms + CsvSignal('/Battery/Devices/AlarmFlags/Tam', read_bool(base_register=1005, bit=0)), + CsvSignal('/Battery/Devices/AlarmFlags/TaM2', read_bool(base_register=1005, bit=2)), + CsvSignal('/Battery/Devices/AlarmFlags/Tbm', read_bool(base_register=1005, bit=3)), + CsvSignal('/Battery/Devices/AlarmFlags/TbM2', read_bool(base_register=1005, bit=5)), + CsvSignal('/Battery/Devices/AlarmFlags/VBm2', read_bool(base_register=1005, bit=7)), + CsvSignal('/Battery/Devices/AlarmFlags/VBM2', read_bool(base_register=1005, bit=9)), + CsvSignal('/Battery/Devices/AlarmFlags/IDM2', read_bool(base_register=1005, bit=11)), + CsvSignal('/Battery/Devices/AlarmFlags/ISOB', read_bool(base_register=1005, bit=12)), + CsvSignal('/Battery/Devices/AlarmFlags/MSWE', read_bool(base_register=1005, bit=13)), + CsvSignal('/Battery/Devices/AlarmFlags/FUSE', read_bool(base_register=1005, bit=14)), + CsvSignal('/Battery/Devices/AlarmFlags/HTRE', read_bool(base_register=1005, bit=15)), + CsvSignal('/Battery/Devices/AlarmFlags/TCPE', read_bool(base_register=1005, bit=16)), + CsvSignal('/Battery/Devices/AlarmFlags/STRE', read_bool(base_register=1005, bit=17)), + CsvSignal('/Battery/Devices/AlarmFlags/CME', read_bool(base_register=1005, bit=18)), + CsvSignal('/Battery/Devices/AlarmFlags/HWFL', read_bool(base_register=1005, bit=19)), + CsvSignal('/Battery/Devices/AlarmFlags/HWEM', read_bool(base_register=1005, bit=20)), + CsvSignal('/Battery/Devices/AlarmFlags/ThM', read_bool(base_register=1005, bit=21)), + CsvSignal('/Battery/Devices/AlarmFlags/vsm2', read_bool(base_register=1005, bit=23)), + CsvSignal('/Battery/Devices/AlarmFlags/vsM2', read_bool(base_register=1005, bit=25)), + CsvSignal('/Battery/Devices/AlarmFlags/iCM2', read_bool(base_register=1005, bit=27)), + CsvSignal('/Battery/Devices/AlarmFlags/iDM2', read_bool(base_register=1005, bit=29)), + CsvSignal('/Battery/Devices/AlarmFlags/MID2', read_bool(base_register=1005, bit=31)), + CsvSignal('/Battery/Devices/AlarmFlags/HTFS', read_bool(base_register=1005, bit=42)), + CsvSignal('/Battery/Devices/AlarmFlags/DATA', read_bool(base_register=1005, bit=43)), + CsvSignal('/Battery/Devices/AlarmFlags/LMPA', read_bool(base_register=1005, bit=45)), + CsvSignal('/Battery/Devices/AlarmFlags/HEBT', read_bool(base_register=1005, bit=46)), + CsvSignal('/Battery/Devices/AlarmFlags/CURM', read_bool(base_register=1005, bit=48)), + ] diff --git a/python/dbus-fz-sonick-48tl-with-s3/service/run b/python/dbus-fz-sonick-48tl-with-s3/service/run new file mode 100755 index 000000000..7f5301435 --- /dev/null +++ b/python/dbus-fz-sonick-48tl-with-s3/service/run @@ -0,0 +1,4 @@ +#!/bin/sh +exec 2>&1 + +exec softlimit -d 100000000 -s 1000000 -a 100000000 /opt/innovenergy/dbus-fzsonick-48tl/start.sh TTY From f55915073f9c1d91eae6ad82658c635f22dd7222 Mon Sep 17 00:00:00 2001 From: kostas Date: Mon, 3 Jun 2024 13:01:27 +0200 Subject: [PATCH 10/25] extarct s3 data with decompression --- .../old_signals.py | 547 ------------------ 1 file changed, 547 deletions(-) delete mode 100755 firmware/opt/dbus-fz-sonick-48tl-with-s3/old_signals.py diff --git a/firmware/opt/dbus-fz-sonick-48tl-with-s3/old_signals.py b/firmware/opt/dbus-fz-sonick-48tl-with-s3/old_signals.py deleted file mode 100755 index 79bdc97a1..000000000 --- a/firmware/opt/dbus-fz-sonick-48tl-with-s3/old_signals.py +++ /dev/null @@ -1,547 +0,0 @@ -# coding=utf-8 - -import config as cfg -from convert import mean, read_float, read_led_state, read_bool, count_bits, comma_separated, read_bitmap, return_in_list, first, read_hex_string -from data import BatterySignal, Battery, LedColor, ServiceSignal, BatteryStatus, LedState, CsvSignal - -# noinspection PyUnreachableCode -if False: - from typing import List, Iterable - - -def init_service_signals(batteries): - print("INSIDE INIT SERVICE SIGNALS") - # type: (List[Battery]) -> Iterable[ServiceSignal] - - n_batteries = len(batteries) - product_name = cfg.PRODUCT_NAME + ' x' + str(n_batteries) - - return [ - ServiceSignal('/NbOfBatteries', n_batteries), # TODO: nb of operational batteries - ServiceSignal('/Mgmt/ProcessName', __file__), - ServiceSignal('/Mgmt/ProcessVersion', cfg.SOFTWARE_VERSION), - ServiceSignal('/Mgmt/Connection', cfg.CONNECTION), - ServiceSignal('/DeviceInstance', cfg.DEVICE_INSTANCE), - ServiceSignal('/ProductName', product_name), - ServiceSignal('/ProductId', cfg.PRODUCT_ID), - ServiceSignal('/Connected', 1) - ] - - -def init_battery_signals(): - # type: () -> Iterable[BatterySignal] - print("START INIT SIGNALS") - read_voltage = read_float(register=999, scale_factor=0.01, offset=0) - read_current = read_float(register=1000, scale_factor=0.01, offset=-10000) - - read_led_amber = read_led_state(register=1004, led=LedColor.amber) - read_led_green = read_led_state(register=1004, led=LedColor.green) - read_led_blue = read_led_state(register=1004, led=LedColor.blue) - read_led_red = read_led_state(register=1004, led=LedColor.red) - - def read_power(status): - # type: (BatteryStatus) -> int - return int(read_current(status) * read_voltage(status)) - - def calc_power_limit_imposed_by_voltage_limit(v, i, v_limit, r_int): - # type: (float, float, float, float) -> float - - dv = v_limit - v - di = dv / r_int - p_limit = v_limit * (i + di) - - return p_limit - - def calc_power_limit_imposed_by_current_limit(v, i, i_limit, r_int): - # type: (float, float, float, float) -> float - - di = i_limit - i - dv = di * r_int - p_limit = i_limit * (v + dv) - - return p_limit - - def calc_max_charge_power(status): - # type: (BatteryStatus) -> int - n_strings = number_of_active_strings(status) - i_max = n_strings * cfg.I_MAX_PER_STRING - v_max = cfg.V_MAX - r_int_min = cfg.R_STRING_MIN / n_strings - r_int_max = cfg.R_STRING_MAX / n_strings - - v = read_voltage(status) - i = read_current(status) - - p_limits = [ - calc_power_limit_imposed_by_voltage_limit(v, i, v_max, r_int_min), - calc_power_limit_imposed_by_voltage_limit(v, i, v_max, r_int_max), - calc_power_limit_imposed_by_current_limit(v, i, i_max, r_int_min), - calc_power_limit_imposed_by_current_limit(v, i, i_max, r_int_max), - ] - - p_limit = min(p_limits) # p_limit is normally positive here (signed) - p_limit = max(p_limit, 0) # charge power must not become negative - - return int(p_limit) - - def calc_max_discharge_power(status): - n_strings = number_of_active_strings(status) - max_discharge_current = n_strings*cfg.I_MAX_PER_STRING - return int(max_discharge_current*read_voltage(status)) - - def read_battery_cold(status): - return \ - read_led_green(status) >= LedState.blinking_slow and \ - read_led_blue(status) >= LedState.blinking_slow - - def read_soc(status): - soc = read_float(register=1053, scale_factor=0.1, offset=0)(status) - - # if the SOC is 100 but EOC is not yet reached, report 99.9 instead of 100 - if soc > 99.9 and not read_eoc_reached(status): - return 99.9 - if soc >= 99.9 and read_eoc_reached(status): - return 100 - - return soc - - def hex_string_to_ascii(hex_string): - # Ensure the hex_string is correctly formatted without spaces - hex_string = hex_string.replace(" ", "") - # Convert every two characters (a byte) in the hex string to ASCII - ascii_string = ''.join([chr(int(hex_string[i:i+2], 16)) for i in range(0, len(hex_string), 2)]) - return ascii_string - - battery_status_reader = read_hex_string(1060,2) - - def read_eoc_reached(status): - battery_status_string = battery_status_reader(status) - return hex_string_to_ascii(battery_status_string) == "EOC_" - - read_limb_bitmap = read_bitmap(1059) - - def interpret_limb_bitmap(bitmap_value): - #print("DIABASE TIN TIMI KAI MPIKE STIN INTERPRET LIMB BITMAP") - # The bit for string 1 also monitors all 5 strings: 0000 0000 means All 5 strings activated. 0000 0001 means string 1 disabled. - string1_disabled = int((bitmap_value & 0b00001) != 0) - string2_disabled = int((bitmap_value & 0b00010) != 0) - string3_disabled = int((bitmap_value & 0b00100) != 0) - string4_disabled = int((bitmap_value & 0b01000) != 0) - string5_disabled = int((bitmap_value & 0b10000) != 0) - n_limb_strings = string1_disabled+string2_disabled+string3_disabled+string4_disabled+string5_disabled - #print("KAI I TIMI EINAI: ", n_limb_strings) - return n_limb_strings - - def limp_strings_value(status): - return interpret_limb_bitmap(read_limb_bitmap(status)) - - def number_of_active_strings(status): - return cfg.NUM_OF_STRINGS_PER_BATTERY - limp_strings_value(status) - - def max_discharge_current(status): - #print("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAinside discharge current") - #exit(0) - return number_of_active_strings(status) * cfg.I_MAX_PER_STRING - - def max_charge_current(status): - return status.battery.ampere_hours/2 - - def read_switch_closed(status): - value = read_bool(base_register=1013, bit=0)(status) - if value: - return False - return True - - def read_alarm_out_active(status): - value = read_bool(base_register=1013, bit=1)(status) - if value: - return False - return True - - def read_aux_relay(status): - value = read_bool(base_register=1013, bit=4)(status) - if value: - return False - return True - - return [ - BatterySignal('/TimeToTOCRequest', max, read_float(register=1052)), - BatterySignal('/EOCReached', return_in_list, read_eoc_reached), - BatterySignal('/NumOfLimbStrings', return_in_list, limp_strings_value), - BatterySignal('/Dc/0/Voltage', mean, get_value=read_voltage, unit='V'), - BatterySignal('/Dc/0/Current', sum, get_value=read_current, unit='A'), - BatterySignal('/Dc/0/Power', sum, get_value=read_power, unit='W'), - - BatterySignal('/BussVoltage', mean, read_float(register=1001, scale_factor=0.01, offset=0), unit='V'), - BatterySignal('/Soc', mean, read_soc, unit='%'), - BatterySignal('/LowestSoc', min, read_float(register=1053, scale_factor=0.1, offset=0), unit='%'), - BatterySignal('/Dc/0/Temperature', mean, read_float(register=1003, scale_factor=0.1, offset=-400), unit='C'), - BatterySignal('/Dc/0/LowestTemperature', min, read_float(register=1003, scale_factor=0.1, offset=-400), unit='C'), - - #BatterySignal('/NumberOfWarningFlags', sum, count_bits(base_register=1005, nb_of_registers=3, nb_of_bits=47)), - BatterySignal('/WarningFlags/TaM1', return_in_list, read_bool(base_register=1005, bit=1)), - BatterySignal('/WarningFlags/TbM1', return_in_list, read_bool(base_register=1005, bit=4)), - BatterySignal('/WarningFlags/VBm1', return_in_list, read_bool(base_register=1005, bit=6)), - BatterySignal('/WarningFlags/VBM1', return_in_list, read_bool(base_register=1005, bit=8)), - BatterySignal('/WarningFlags/IDM1', return_in_list, read_bool(base_register=1005, bit=10)), - BatterySignal('/WarningFlags/vsm1', return_in_list, read_bool(base_register=1005, bit=22)), - BatterySignal('/WarningFlags/vsM1', return_in_list, read_bool(base_register=1005, bit=24)), - BatterySignal('/WarningFlags/iCM1', return_in_list, read_bool(base_register=1005, bit=26)), - BatterySignal('/WarningFlags/iDM1', return_in_list, read_bool(base_register=1005, bit=28)), - BatterySignal('/WarningFlags/MID1', return_in_list, read_bool(base_register=1005, bit=30)), - BatterySignal('/WarningFlags/BLPW', return_in_list, read_bool(base_register=1005, bit=32)), - BatterySignal('/WarningFlags/CCBF', return_in_list, read_bool(base_register=1005, bit=33)), - BatterySignal('/WarningFlags/Ah_W', return_in_list, read_bool(base_register=1005, bit=35)), - BatterySignal('/WarningFlags/MPMM', return_in_list, read_bool(base_register=1005, bit=38)), - #BatterySignal('/WarningFlags/TCMM', any, read_bool(base_register=1005, bit=39)), - BatterySignal('/WarningFlags/TCdi', return_in_list, read_bool(base_register=1005, bit=40)), - #BatterySignal('/WarningFlags/WMTO', any, read_bool(base_register=1005, bit=41)), - BatterySignal('/WarningFlags/LMPW', return_in_list, read_bool(base_register=1005, bit=44)), - #BatterySignal('/WarningFlags/CELL1', any, read_bool(base_register=1005, bit=46)), - BatterySignal('/WarningFlags/TOCW', return_in_list, read_bool(base_register=1005, bit=47)), - BatterySignal('/WarningFlags/BUSL', return_in_list, read_bool(base_register=1005, bit=49)), - - #BatterySignal('/NumberOfAlarmFlags', sum, count_bits(base_register=1009, nb_of_registers=3, nb_of_bits=47)), - BatterySignal('/AlarmFlags/Tam', return_in_list, read_bool(base_register=1005, bit=0)), - BatterySignal('/AlarmFlags/TaM2', return_in_list, read_bool(base_register=1005, bit=2)), - BatterySignal('/AlarmFlags/Tbm', return_in_list, read_bool(base_register=1005, bit=3)), - BatterySignal('/AlarmFlags/TbM2', return_in_list, read_bool(base_register=1005, bit=5)), - BatterySignal('/AlarmFlags/VBm2', return_in_list, read_bool(base_register=1005, bit=7)), - BatterySignal('/AlarmFlags/VBM2', return_in_list, read_bool(base_register=1005, bit=9)), - BatterySignal('/AlarmFlags/IDM2', return_in_list, read_bool(base_register=1005, bit=11)), - BatterySignal('/AlarmFlags/ISOB', return_in_list, read_bool(base_register=1005, bit=12)), - BatterySignal('/AlarmFlags/MSWE', return_in_list, read_bool(base_register=1005, bit=13)), - BatterySignal('/AlarmFlags/FUSE', return_in_list, read_bool(base_register=1005, bit=14)), - BatterySignal('/AlarmFlags/HTRE', return_in_list, read_bool(base_register=1005, bit=15)), - BatterySignal('/AlarmFlags/TCPE', return_in_list, read_bool(base_register=1005, bit=16)), - BatterySignal('/AlarmFlags/STRE', return_in_list, read_bool(base_register=1005, bit=17)), - BatterySignal('/AlarmFlags/CME', return_in_list, read_bool(base_register=1005, bit=18)), - BatterySignal('/AlarmFlags/HWFL', return_in_list, read_bool(base_register=1005, bit=19)), - BatterySignal('/AlarmFlags/HWEM', return_in_list, read_bool(base_register=1005, bit=20)), - BatterySignal('/AlarmFlags/ThM', return_in_list, read_bool(base_register=1005, bit=21)), - #BatterySignal('/AlarmFlags/vsm1', any, read_bool(base_register=1005, bit=22)), - BatterySignal('/AlarmFlags/vsm2', return_in_list, read_bool(base_register=1005, bit=23)), - BatterySignal('/AlarmFlags/vsM2', return_in_list, read_bool(base_register=1005, bit=25)), - BatterySignal('/AlarmFlags/iCM2', return_in_list, read_bool(base_register=1005, bit=27)), - BatterySignal('/AlarmFlags/iDM2', return_in_list, read_bool(base_register=1005, bit=29)), - BatterySignal('/AlarmFlags/MID2', return_in_list, read_bool(base_register=1005, bit=31)), - #BatterySignal('/AlarmFlags/CCBF', any, read_bool(base_register=1005, bit=33)), - #BatterySignal('/AlarmFlags/AhFL', any, read_bool(base_register=1005, bit=34)), - #BatterySignal('/AlarmFlags/TbCM', any, read_bool(base_register=1005, bit=36)), - #BatterySignal('/AlarmFlags/BRNF', any, read_bool(base_register=1005, bit=37)), - BatterySignal('/AlarmFlags/HTFS', return_in_list, read_bool(base_register=1005, bit=42)), - BatterySignal('/AlarmFlags/DATA', return_in_list, read_bool(base_register=1005, bit=43)), - BatterySignal('/AlarmFlags/LMPA', return_in_list, read_bool(base_register=1005, bit=45)), - BatterySignal('/AlarmFlags/HEBT', return_in_list, read_bool(base_register=1005, bit=46)), - #BatterySignal('/AlarmFlags/bit47AlarmDummy', any,read_bool(base_register=1005, bit=47)), - BatterySignal('/AlarmFlags/CURM', return_in_list, read_bool(base_register=1005, bit=48)), - - BatterySignal('/Diagnostics/LedStatus/Red', first, read_led_red), - BatterySignal('/Diagnostics/LedStatus/Blue', first, read_led_blue), - BatterySignal('/Diagnostics/LedStatus/Green', first, read_led_green), - BatterySignal('/Diagnostics/LedStatus/Amber', first, read_led_amber), - - BatterySignal('/Diagnostics/IoStatus/MainSwitchClosed', return_in_list, read_switch_closed), - BatterySignal('/Diagnostics/IoStatus/AlarmOutActive', return_in_list, read_alarm_out_active), - BatterySignal('/Diagnostics/IoStatus/InternalFanActive', return_in_list, read_bool(base_register=1013, bit=2)), - BatterySignal('/Diagnostics/IoStatus/VoltMeasurementAllowed', return_in_list, read_bool(base_register=1013, bit=3)), - BatterySignal('/Diagnostics/IoStatus/AuxRelay', return_in_list, read_aux_relay), - BatterySignal('/Diagnostics/IoStatus/RemoteState', return_in_list, read_bool(base_register=1013, bit=5)), - BatterySignal('/Diagnostics/IoStatus/RiscOn', return_in_list, read_bool(base_register=1013, bit=6)), - - BatterySignal('/IoStatus/BatteryCold', any, read_battery_cold), - - # see protocol doc page 7 - BatterySignal('/Info/MaxDischargeCurrent', sum, max_discharge_current, unit='A'), - BatterySignal('/Info/MaxChargeCurrent', sum, max_charge_current, unit='A'), - BatterySignal('/Info/MaxChargeVoltage', min, lambda bs: bs.battery.v_max, unit='V'), - BatterySignal('/Info/MinDischargeVoltage', max, lambda bs: bs.battery.v_min, unit='V'), - BatterySignal('/Info/BatteryLowVoltage' , max, lambda bs: bs.battery.v_min-2, unit='V'), - BatterySignal('/Info/NumberOfStrings', sum, number_of_active_strings), - - BatterySignal('/Info/MaxChargePower', sum, calc_max_charge_power), - BatterySignal('/Info/MaxDischargePower', sum, calc_max_discharge_power), - - BatterySignal('/FirmwareVersion', comma_separated, lambda bs: bs.battery.firmware_version), - BatterySignal('/HardwareVersion', comma_separated, lambda bs: bs.battery.hardware_version), - BatterySignal('/BmsVersion', comma_separated, lambda bs: bs.battery.bms_version) - - ] - - -def create_csv_signals(firmware_version): - read_voltage = read_float(register=999, scale_factor=0.01, offset=0) - read_current = read_float(register=1000, scale_factor=0.01, offset=-10000) - read_limb_bitmap = read_bitmap(1059) - - def read_power(status): - return int(read_current(status) * read_voltage(status)) - - def string1_disabled(status): - bitmap_value = read_limb_bitmap(status) - return int((bitmap_value & 0b00001) != 0) - - def string2_disabled(status): - bitmap_value = read_limb_bitmap(status) - return int((bitmap_value & 0b00010) != 0) - - def string3_disabled(status): - bitmap_value = read_limb_bitmap(status) - return int((bitmap_value & 0b00100) != 0) - - def string4_disabled(status): - bitmap_value = read_limb_bitmap(status) - return int((bitmap_value & 0b01000) != 0) - - def string5_disabled(status): - bitmap_value = read_limb_bitmap(status) - return int((bitmap_value & 0b10000) != 0) - - read_limb_bitmap = read_bitmap(1059) - - def interpret_limb_bitmap(bitmap_value): - #print("DIABASE TIN TIMI KAI MPIKE STIN INTERPRET LIMB BITMAP") - # The bit for string 1 also monitors all 5 strings: 0000 0000 means All 5 strings activated. 0000 0001 means string 1 disabled. - string1_disabled = int((bitmap_value & 0b00001) != 0) - string2_disabled = int((bitmap_value & 0b00010) != 0) - string3_disabled = int((bitmap_value & 0b00100) != 0) - string4_disabled = int((bitmap_value & 0b01000) != 0) - string5_disabled = int((bitmap_value & 0b10000) != 0) - n_limb_strings = string1_disabled+string2_disabled+string3_disabled+string4_disabled+string5_disabled - #print("KAI I TIMI EINAI: ", n_limb_strings) - return n_limb_strings - - - def limp_strings_value(status): - return interpret_limb_bitmap(read_limb_bitmap(status)) - - def calc_max_charge_power(status): - # type: (BatteryStatus) -> int - n_strings = cfg.NUM_OF_STRINGS_PER_BATTERY-limp_strings_value(status) - i_max = n_strings * cfg.I_MAX_PER_STRING - v_max = cfg.V_MAX - r_int_min = cfg.R_STRING_MIN / n_strings - r_int_max = cfg.R_STRING_MAX / n_strings - - v = read_voltage(status) - i = read_current(status) - - p_limits = [ - calc_power_limit_imposed_by_voltage_limit(v, i, v_max, r_int_min), - calc_power_limit_imposed_by_voltage_limit(v, i, v_max, r_int_max), - calc_power_limit_imposed_by_current_limit(v, i, i_max, r_int_min), - calc_power_limit_imposed_by_current_limit(v, i, i_max, r_int_max), - ] - - p_limit = min(p_limits) # p_limit is normally positive here (signed) - p_limit = max(p_limit, 0) # charge power must not become negative - - return int(p_limit) - - def calc_max_discharge_power(status): - n_strings = cfg.NUM_OF_STRINGS_PER_BATTERY-limp_strings_value(status) - max_discharge_current = n_strings*cfg.I_MAX_PER_STRING - return int(max_discharge_current*read_voltage(status)) - - total_current = read_float(register=1062, scale_factor=0.01, offset=-10000) - - def read_total_current(status): - return total_current(status) - - def read_heating_current(status): - return total_current(status) - read_current(status) - - def read_heating_power(status): - return read_voltage(status) * read_heating_current(status) - - soc_ah = read_float(register=1002, scale_factor=0.1, offset=-10000) - - def read_soc_ah(status): - return soc_ah(status) - - def return_led_state(status, color): - led_state = read_led_state(register=1004, led=color)(status) - if led_state == LedState.blinking_fast or led_state == LedState.blinking_slow: - return "Blinking" - elif led_state == LedState.on: - return "On" - elif led_state == LedState.off: - return "Off" - return "Unknown" - - def return_led_state_blue(status): - return return_led_state(status, LedColor.blue) - - def return_led_state_red(status): - return return_led_state(status, LedColor.red) - - def return_led_state_green(status): - return return_led_state(status, LedColor.green) - - def return_led_state_amber(status): - return return_led_state(status, LedColor.amber) - - def read_switch_closed(status): - value = read_bool(base_register=1013, bit=0)(status) - if value: - return False - return True - - def read_alarm_out_active(status): - value = read_bool(base_register=1013, bit=1)(status) - if value: - return False - return True - - def read_aux_relay(status): - value = read_bool(base_register=1013, bit=4)(status) - if value: - return False - return True - - battery_status_reader = read_hex_string(1060,2) - - def hex_string_to_ascii(hex_string): - # Ensure the hex_string is correctly formatted without spaces - hex_string = hex_string.replace(" ", "") - # Convert every two characters (a byte) in the hex string to ASCII - ascii_string = ''.join([chr(int(hex_string[i:i+2], 16)) for i in range(0, len(hex_string), 2)]) - return ascii_string - - def read_eoc_reached(status): - battery_status_string = battery_status_reader(status) - return hex_string_to_ascii(battery_status_string) == "EOC_" - - def read_serial_number(status): - serial_regs = [1055, 1056, 1057, 1058] - serial_parts = [] - for reg in serial_regs: - # reading each register as a single hex value - hex_value_fun = read_hex_string(reg, 1) - hex_value = hex_value_fun(status) - # append without spaces and leading zeros stripped if any - serial_parts.append(hex_value.replace(' ', '')) - # concatenate all parts to form the full serial number - serial_number = ''.join(serial_parts).rstrip('0') - return serial_number - - def time_since_toc_in_time_format(status): - time_in_minutes = read_float(register=1052)(status) - # Convert minutes to total seconds - total_seconds = int(time_in_minutes * 60) - # Calculate days, hours, minutes, and seconds - days = total_seconds // (24 * 3600) - total_seconds = total_seconds % (24 * 3600) - hours = total_seconds // 3600 - total_seconds %= 3600 - minutes = total_seconds // 60 - seconds = total_seconds % 60 - # Format the string to show days.hours:minutes:seconds - return "{}.{:02}:{:02}:{:02}".format(days, hours, minutes, seconds) - - def calc_power_limit_imposed_by_voltage_limit(v, i, v_limit, r_int): - # type: (float, float, float, float) -> float - - dv = v_limit - v - di = dv / r_int - p_limit = v_limit * (i + di) - - return p_limit - - def calc_power_limit_imposed_by_current_limit(v, i, i_limit, r_int): - # type: (float, float, float, float) -> float - - di = i_limit - i - dv = di * r_int - p_limit = i_limit * (v + dv) - - return p_limit - - - return [ - CsvSignal('/Battery/Devices/FwVersion', firmware_version), - CsvSignal('/Battery/Devices/Dc/Power', read_power, 'W'), - CsvSignal('/Battery/Devices/Dc/Voltage', read_voltage, 'V'), - CsvSignal('/Battery/Devices/Soc', read_float(register=1053, scale_factor=0.1, offset=0), '%'), - CsvSignal('/Battery/Devices/Temperatures/Cells/Average', read_float(register=1003, scale_factor=0.1, offset=-400), 'C'), - CsvSignal('/Battery/Devices/Dc/Current', read_current, 'A'), - CsvSignal('/Battery/Devices/BusCurrent', read_total_current, 'A'), - CsvSignal('/Battery/Devices/CellsCurrent', read_current, 'A'), - CsvSignal('/Battery/Devices/HeatingCurrent', read_heating_current, 'A'), - CsvSignal('/Battery/Devices/HeatingPower', read_heating_power, 'W'), - CsvSignal('/Battery/Devices/SOCAh', read_soc_ah), - CsvSignal('/Battery/Devices/Leds/Blue', return_led_state_blue), - CsvSignal('/Battery/Devices/Leds/Red', return_led_state_red), - CsvSignal('/Battery/Devices/Leds/Green', return_led_state_green), - CsvSignal('/Battery/Devices/Leds/Amber', return_led_state_amber), - CsvSignal('/Battery/Devices/BatteryStrings/String1Active', string1_disabled), - CsvSignal('/Battery/Devices/BatteryStrings/String2Active', string2_disabled), - CsvSignal('/Battery/Devices/BatteryStrings/String3Active', string3_disabled), - CsvSignal('/Battery/Devices/BatteryStrings/String4Active', string4_disabled), - CsvSignal('/Battery/Devices/BatteryStrings/String5Active', string5_disabled), - CsvSignal('/Battery/Devices/IoStatus/ConnectedToDcBus', read_switch_closed), - CsvSignal('/Battery/Devices/IoStatus/AlarmOutActive', read_alarm_out_active), - CsvSignal('/Battery/Devices/IoStatus/InternalFanActive', read_bool(base_register=1013, bit=2)), - CsvSignal('/Battery/Devices/IoStatus/VoltMeasurementAllowed', read_bool(base_register=1013, bit=3)), - CsvSignal('/Battery/Devices/IoStatus/AuxRelayBus', read_aux_relay), - CsvSignal('/Battery/Devices/IoStatus/RemoteStateActive', read_bool(base_register=1013, bit=5)), - CsvSignal('/Battery/Devices/IoStatus/RiscActive', read_bool(base_register=1013, bit=6)), - CsvSignal('/Battery/Devices/Eoc', read_eoc_reached), - CsvSignal('/Battery/Devices/SerialNumber', read_serial_number), - CsvSignal('/Battery/Devices/TimeSinceTOC', time_since_toc_in_time_format), - CsvSignal('/Battery/Devices/MaxChargePower', calc_max_charge_power), - CsvSignal('/Battery/Devices/MaxDischargePower', calc_max_discharge_power), - ] - - -def read_warning_and_alarm_flags(): - return [ - # Warnings - CsvSignal('/Battery/Devices/WarningFlags/TaM1', read_bool(base_register=1005, bit=1)), - CsvSignal('/Battery/Devices/WarningFlags/TbM1', read_bool(base_register=1005, bit=4)), - CsvSignal('/Battery/Devices/WarningFlags/VBm1', read_bool(base_register=1005, bit=6)), - CsvSignal('/Battery/Devices/WarningFlags/VBM1', read_bool(base_register=1005, bit=8)), - CsvSignal('/Battery/Devices/WarningFlags/IDM1', read_bool(base_register=1005, bit=10)), - CsvSignal('/Battery/Devices/WarningFlags/vsm1', read_bool(base_register=1005, bit=22)), - CsvSignal('/Battery/Devices/WarningFlags/vsM1', read_bool(base_register=1005, bit=24)), - CsvSignal('/Battery/Devices/WarningFlags/iCM1', read_bool(base_register=1005, bit=26)), - CsvSignal('/Battery/Devices/WarningFlags/iDM1', read_bool(base_register=1005, bit=28)), - CsvSignal('/Battery/Devices/WarningFlags/MID1', read_bool(base_register=1005, bit=30)), - CsvSignal('/Battery/Devices/WarningFlags/BLPW', read_bool(base_register=1005, bit=32)), - CsvSignal('/Battery/Devices/WarningFlags/CCBF', read_bool(base_register=1005, bit=33)), - CsvSignal('/Battery/Devices/WarningFlags/Ah_W', read_bool(base_register=1005, bit=35)), - CsvSignal('/Battery/Devices/WarningFlags/MPMM', read_bool(base_register=1005, bit=38)), - CsvSignal('/Battery/Devices/WarningFlags/TCdi', read_bool(base_register=1005, bit=40)), - CsvSignal('/Battery/Devices/WarningFlags/LMPW', read_bool(base_register=1005, bit=44)), - CsvSignal('/Battery/Devices/WarningFlags/TOCW', read_bool(base_register=1005, bit=47)), - CsvSignal('/Battery/Devices/WarningFlags/BUSL', read_bool(base_register=1005, bit=49)), - ], [ - # Alarms - CsvSignal('/Battery/Devices/AlarmFlags/Tam', read_bool(base_register=1005, bit=0)), - CsvSignal('/Battery/Devices/AlarmFlags/TaM2', read_bool(base_register=1005, bit=2)), - CsvSignal('/Battery/Devices/AlarmFlags/Tbm', read_bool(base_register=1005, bit=3)), - CsvSignal('/Battery/Devices/AlarmFlags/TbM2', read_bool(base_register=1005, bit=5)), - CsvSignal('/Battery/Devices/AlarmFlags/VBm2', read_bool(base_register=1005, bit=7)), - CsvSignal('/Battery/Devices/AlarmFlags/VBM2', read_bool(base_register=1005, bit=9)), - CsvSignal('/Battery/Devices/AlarmFlags/IDM2', read_bool(base_register=1005, bit=11)), - CsvSignal('/Battery/Devices/AlarmFlags/ISOB', read_bool(base_register=1005, bit=12)), - CsvSignal('/Battery/Devices/AlarmFlags/MSWE', read_bool(base_register=1005, bit=13)), - CsvSignal('/Battery/Devices/AlarmFlags/FUSE', read_bool(base_register=1005, bit=14)), - CsvSignal('/Battery/Devices/AlarmFlags/HTRE', read_bool(base_register=1005, bit=15)), - CsvSignal('/Battery/Devices/AlarmFlags/TCPE', read_bool(base_register=1005, bit=16)), - CsvSignal('/Battery/Devices/AlarmFlags/STRE', read_bool(base_register=1005, bit=17)), - CsvSignal('/Battery/Devices/AlarmFlags/CME', read_bool(base_register=1005, bit=18)), - CsvSignal('/Battery/Devices/AlarmFlags/HWFL', read_bool(base_register=1005, bit=19)), - CsvSignal('/Battery/Devices/AlarmFlags/HWEM', read_bool(base_register=1005, bit=20)), - CsvSignal('/Battery/Devices/AlarmFlags/ThM', read_bool(base_register=1005, bit=21)), - CsvSignal('/Battery/Devices/AlarmFlags/vsm2', read_bool(base_register=1005, bit=23)), - CsvSignal('/Battery/Devices/AlarmFlags/vsM2', read_bool(base_register=1005, bit=25)), - CsvSignal('/Battery/Devices/AlarmFlags/iCM2', read_bool(base_register=1005, bit=27)), - CsvSignal('/Battery/Devices/AlarmFlags/iDM2', read_bool(base_register=1005, bit=29)), - CsvSignal('/Battery/Devices/AlarmFlags/MID2', read_bool(base_register=1005, bit=31)), - CsvSignal('/Battery/Devices/AlarmFlags/HTFS', read_bool(base_register=1005, bit=42)), - CsvSignal('/Battery/Devices/AlarmFlags/DATA', read_bool(base_register=1005, bit=43)), - CsvSignal('/Battery/Devices/AlarmFlags/LMPA', read_bool(base_register=1005, bit=45)), - CsvSignal('/Battery/Devices/AlarmFlags/HEBT', read_bool(base_register=1005, bit=46)), - CsvSignal('/Battery/Devices/AlarmFlags/CURM', read_bool(base_register=1005, bit=48)), - ] From 42ba224603b6068f5c72e0c74dfe0d4343b83034 Mon Sep 17 00:00:00 2001 From: Noe Date: Mon, 3 Jun 2024 13:16:09 +0200 Subject: [PATCH 11/25] Fixed bugs in warnings and alarms representation (front end) --- .../dashboards/BatteryView/BatteryView.tsx | 106 ++++++++++++++++++ .../BatteryView/DetailedBatteryView.tsx | 11 +- .../Information/InformationSalidomo.tsx | 13 +++ 3 files changed, 125 insertions(+), 5 deletions(-) diff --git a/typescript/frontend-marios2/src/content/dashboards/BatteryView/BatteryView.tsx b/typescript/frontend-marios2/src/content/dashboards/BatteryView/BatteryView.tsx index 1ad54388b..56378d8d5 100644 --- a/typescript/frontend-marios2/src/content/dashboards/BatteryView/BatteryView.tsx +++ b/typescript/frontend-marios2/src/content/dashboards/BatteryView/BatteryView.tsx @@ -375,6 +375,112 @@ function BatteryView(props: BatteryViewProps) { )} + + {props.productNum === 1 && ( + <> + + {Number(battery.Warnings.value) === 0 ? ( + 'None' + ) : Number(battery.Warnings.value) === 1 ? ( + + New Warning + + ) : ( + + Multiple Warnings + + )} + + + {Number(battery.Alarms.value) === 0 ? ( + 'None' + ) : Number(battery.Alarms.value) === 1 ? ( + + New Alarm + + ) : ( + + Multiple Alarms + + )} + + + )} ))} diff --git a/typescript/frontend-marios2/src/content/dashboards/BatteryView/DetailedBatteryView.tsx b/typescript/frontend-marios2/src/content/dashboards/BatteryView/DetailedBatteryView.tsx index b5752eafa..d03f82778 100644 --- a/typescript/frontend-marios2/src/content/dashboards/BatteryView/DetailedBatteryView.tsx +++ b/typescript/frontend-marios2/src/content/dashboards/BatteryView/DetailedBatteryView.tsx @@ -335,7 +335,7 @@ function DetailedBatteryView(props: DetailedBatteryViewProps) { ...batteryStringStyle, backgroundColor: props.batteryData.String1Active.value == 'True' || - props.batteryData.String4Active.value == 0 + Number(props.batteryData.String1Active.value) == 0 ? '#32CD32' : '#FF033E' }} @@ -345,7 +345,7 @@ function DetailedBatteryView(props: DetailedBatteryViewProps) { ...batteryStringStyle, backgroundColor: props.batteryData.String2Active.value == 'True' || - props.batteryData.String4Active.value == 0 + Number(props.batteryData.String2Active.value) == 0 ? '#32CD32' : '#FF033E' }} @@ -355,7 +355,7 @@ function DetailedBatteryView(props: DetailedBatteryViewProps) { ...batteryStringStyle, backgroundColor: props.batteryData.String3Active.value == 'True' || - props.batteryData.String4Active.value == 0 + Number(props.batteryData.String3Active.value) == 0 ? '#32CD32' : '#FF033E' }} @@ -365,7 +365,7 @@ function DetailedBatteryView(props: DetailedBatteryViewProps) { ...batteryStringStyle, backgroundColor: props.batteryData.String4Active.value == 'True' || - props.batteryData.String4Active.value == 0 + Number(props.batteryData.String4Active.value) == 0 ? '#32CD32' : '#FF033E' }} @@ -375,7 +375,7 @@ function DetailedBatteryView(props: DetailedBatteryViewProps) { ...batteryStringStyle, backgroundColor: props.batteryData.String5Active.value == 'True' || - props.batteryData.String4Active.value == 0 + Number(props.batteryData.String5Active.value) == 0 ? '#32CD32' : '#FF033E' }} @@ -639,6 +639,7 @@ function DetailedBatteryView(props: DetailedBatteryViewProps) { {/*----------------------------------------------------------------------------------------------------------------------------------*/} + {props.productNum === 0 && ( <> diff --git a/typescript/frontend-marios2/src/content/dashboards/Information/InformationSalidomo.tsx b/typescript/frontend-marios2/src/content/dashboards/Information/InformationSalidomo.tsx index 4c85105a5..b10e749d9 100644 --- a/typescript/frontend-marios2/src/content/dashboards/Information/InformationSalidomo.tsx +++ b/typescript/frontend-marios2/src/content/dashboards/Information/InformationSalidomo.tsx @@ -275,6 +275,19 @@ function InformationSalidomo(props: InformationSalidomoProps) { /> + {/*
*/} + {/* */} + {/* }*/} + {/* name="vrmLink"*/} + {/* value={formValues.vrmLink}*/} + {/* onChange={handleChange}*/} + {/* variant="outlined"*/} + {/* fullWidth*/} + {/* />*/} + {/*
*/} +
Date: Tue, 4 Jun 2024 12:20:28 +0200 Subject: [PATCH 12/25] Fixed bug with hour-representation in configuration tab (front end) --- csharp/App/SaliMax/deploy.sh | 4 ++-- csharp/App/SaliMax/src/Program.cs | 2 +- .../content/dashboards/Configuration/Configuration.tsx | 8 ++++---- .../src/content/dashboards/Overview/chartOptions.tsx | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/csharp/App/SaliMax/deploy.sh b/csharp/App/SaliMax/deploy.sh index 9bd0d801b..057e274b5 100755 --- a/csharp/App/SaliMax/deploy.sh +++ b/csharp/App/SaliMax/deploy.sh @@ -21,6 +21,6 @@ rsync -v \ ./bin/Release/$dotnet_version/linux-x64/publish/* \ $username@"$salimax_ip":~/salimax -#echo -e "\n============================ Execute ============================\n" +echo -e "\n============================ Execute ============================\n" -#sshpass -p "$root_password" ssh -o StrictHostKeyChecking=no -t "$username"@"$salimax_ip" "echo '$root_password' | sudo -S sh -c 'cd salimax && ./restart'" 2>/dev/null +sshpass -p "$root_password" ssh -o StrictHostKeyChecking=no -t "$username"@"$salimax_ip" "echo '$root_password' | sudo -S sh -c 'cd salimax && ./restart'" 2>/dev/null diff --git a/csharp/App/SaliMax/src/Program.cs b/csharp/App/SaliMax/src/Program.cs index c51db600d..ee0a76355 100644 --- a/csharp/App/SaliMax/src/Program.cs +++ b/csharp/App/SaliMax/src/Program.cs @@ -1,4 +1,4 @@ -#define Amax +#undef Amax #undef GridLimit using System.IO.Compression; diff --git a/typescript/frontend-marios2/src/content/dashboards/Configuration/Configuration.tsx b/typescript/frontend-marios2/src/content/dashboards/Configuration/Configuration.tsx index e1eec0584..66b682adf 100644 --- a/typescript/frontend-marios2/src/content/dashboards/Configuration/Configuration.tsx +++ b/typescript/frontend-marios2/src/content/dashboards/Configuration/Configuration.tsx @@ -162,10 +162,10 @@ function Configuration(props: ConfigurationProps) { const handleConfirm = (newDate) => { //console.log('non adapted day is ', newDate); //console.log('adapted day is ', dayjs.utc(newDate).toDate()); - // setFormValues({ - // ...formValues, - // ['calibrationChargeDate']: dayjs(newDate).toDate() - // }); + setFormValues({ + ...formValues, + ['calibrationChargeDate']: dayjs(newDate).toDate() + }); }; const handleSelectedCalibrationChargeDay = (event) => { diff --git a/typescript/frontend-marios2/src/content/dashboards/Overview/chartOptions.tsx b/typescript/frontend-marios2/src/content/dashboards/Overview/chartOptions.tsx index b51e29278..956a343e8 100644 --- a/typescript/frontend-marios2/src/content/dashboards/Overview/chartOptions.tsx +++ b/typescript/frontend-marios2/src/content/dashboards/Overview/chartOptions.tsx @@ -167,7 +167,7 @@ export const getChartOptions = ( style: { fontSize: '12px' }, - offsetY: -185, + offsetY: -190, offsetX: 25, rotate: 0 }, From 382043b79ce41d0b3a3954fa6591ccefd4b164c6 Mon Sep 17 00:00:00 2001 From: atef Date: Tue, 4 Jun 2024 12:23:19 +0200 Subject: [PATCH 13/25] Addf schnieder meter library and app --- .../IEM3kGridMeterDriver.csproj | 16 ++ csharp/App/SchniederMeterDriver/Nic.cs | 149 ++++++++++++++++++ csharp/App/SchniederMeterDriver/Program.cs | 60 +++++++ .../SchniederMeterDriver.cs | 66 ++++++++ .../SchniederMeterDriver.csproj | 26 +++ csharp/App/SchniederMeterDriver/Signal.cs | 16 ++ csharp/App/SchniederMeterDriver/Utils.cs | 49 ++++++ .../App/SchniederMeterDriver/service/log/run | 3 + csharp/App/SchniederMeterDriver/service/run | 3 + csharp/InnovEnergy.sln | 21 +++ .../IEM3kGridMeter/IEM3kGridMeterDevice.cs | 6 +- .../IEM3kGridMeter/IEM3kGridMeterRegisters.cs | 32 ++-- 12 files changed, 430 insertions(+), 17 deletions(-) create mode 100644 csharp/App/IEM3kGridMeterDriver/IEM3kGridMeterDriver.csproj create mode 100644 csharp/App/SchniederMeterDriver/Nic.cs create mode 100644 csharp/App/SchniederMeterDriver/Program.cs create mode 100644 csharp/App/SchniederMeterDriver/SchniederMeterDriver.cs create mode 100644 csharp/App/SchniederMeterDriver/SchniederMeterDriver.csproj create mode 100644 csharp/App/SchniederMeterDriver/Signal.cs create mode 100644 csharp/App/SchniederMeterDriver/Utils.cs create mode 100755 csharp/App/SchniederMeterDriver/service/log/run create mode 100755 csharp/App/SchniederMeterDriver/service/run diff --git a/csharp/App/IEM3kGridMeterDriver/IEM3kGridMeterDriver.csproj b/csharp/App/IEM3kGridMeterDriver/IEM3kGridMeterDriver.csproj new file mode 100644 index 000000000..0ef62c506 --- /dev/null +++ b/csharp/App/IEM3kGridMeterDriver/IEM3kGridMeterDriver.csproj @@ -0,0 +1,16 @@ + + + + + InnovEnergy.Lib.Devices.IEM3kGridMeter + Exe + enable + + + + + + + + + diff --git a/csharp/App/SchniederMeterDriver/Nic.cs b/csharp/App/SchniederMeterDriver/Nic.cs new file mode 100644 index 000000000..8e36c59be --- /dev/null +++ b/csharp/App/SchniederMeterDriver/Nic.cs @@ -0,0 +1,149 @@ +using System.Text.Json.Nodes; +using CliWrap; +using CliWrap.Buffered; + +namespace InnovEnergy.App.SchniederDriver; + +public readonly struct Nic +{ + private static Command IpCommand { get; } = Cli + .Wrap("/sbin/ip") + .WithValidation(CommandResultValidation.None); + + private readonly JsonNode _Node; + + private Nic(JsonNode node) + { + _Node = node; + } + + public Boolean IsEthernet + { + get + { + try + { + return _Node["link_type"]!.GetValue() == "ether"; + } + catch + { + return false; + } + } + } + + public Boolean IsUp + { + get + { + // ReSharper disable once StringLiteralTypo + try + { + return _Node["operstate"]!.GetValue() == "UP"; + } + catch + { + return false; + } + } + } + + public IReadOnlyList Ip4Addresses + { + get + { + // ReSharper disable once StringLiteralTypo + try + { + return _Node["addr_info"]! + .AsArray() + .TryWhere(n => n!["family"]!.GetValue() == "inet") + .TrySelect(n => n!["local"]!.GetValue()) + .ToList(); + } + catch + { + return Array.Empty(); + } + } + } + + public String Name + { + get + { + // ReSharper disable once StringLiteralTypo + try + { + return _Node["ifname"]!.GetValue(); + } + catch + { + return ""; + } + } + } + + + + public async Task AddPointToPoint(String sourceAddress, String destinationAddress) + { + var result = await IpCommand + .WithArguments($"address add local {sourceAddress} peer {destinationAddress} dev {Name}") + .ExecuteAsync(); + + return result.ExitCode == 0; + } + + public async Task RemoveAddress(String address) + { + var result = await IpCommand + .WithArguments($"address del {address} dev {Name}") + .ExecuteBufferedAsync(); + + return result.ExitCode == 0; + } + + + public async Task AddRoute(String route) + { + var result = await IpCommand + .WithArguments($"route add {route} dev {Name}") + .ExecuteAsync(); + + return result.ExitCode == 0; + } + + public async Task RemoveRoute(String route) + { + var result = await IpCommand + .WithArguments($"route del {route} dev {Name}") + .ExecuteAsync(); + + return result.ExitCode == 0; + } + + + public static async Task> GetNetworkInterfaces() + { + + try + { + var result = await IpCommand + .WithArguments("-details -pretty -json address") + .ExecuteBufferedAsync(); + + return JsonNode + .Parse(result.StandardOutput)! + .AsArray() + .Where(n => n != null) + .Select(n => new Nic(n!)) + .ToList(); + } + catch + { + return Array.Empty(); + } + } + +} \ No newline at end of file diff --git a/csharp/App/SchniederMeterDriver/Program.cs b/csharp/App/SchniederMeterDriver/Program.cs new file mode 100644 index 000000000..d7a975cc1 --- /dev/null +++ b/csharp/App/SchniederMeterDriver/Program.cs @@ -0,0 +1,60 @@ +using InnovEnergy.App.SchniederDriver; +using InnovEnergy.Lib.Protocols.DBus; +using InnovEnergy.Lib.Utils; +using InnovEnergy.Lib.Utils.Net; + + +// dotnet publish EmuMeter.csproj -c Release -r linux-arm -p:PublishSingleFile=true --self-contained true && \ +// rsync -av bin/Release/net6.0/linux-arm/publish/ root@10.2.1.6:/home/root/emu && clear && \ +// ssh root@10.2.1.6 /home/root/emu/EmuMeter + + +Console.WriteLine("Starting Schnieder Driver " + Config.Version); + +var networkInterfaces = await Nic.GetNetworkInterfaces(); + +var candidates = networkInterfaces.Where(n => n.IsUp && + n.IsEthernet && + (!n.Ip4Addresses.Any() || n.Ip4Addresses.Contains(Config.OwnAddress))); + +foreach (var nic in candidates) +{ + Console.WriteLine($"Found new network interface: {nic.Name}"); + + if (!nic.Ip4Addresses.Contains(Config.OwnAddress)) + { + Console.WriteLine($"Configuring Point-to-Point connection on {nic.Name}"); + Console.WriteLine($" own address: {Config.OwnAddress}"); + Console.WriteLine($" peer address: {Config.PeerAddress}"); + + var success = await nic.AddPointToPoint($"{Config.OwnAddress}/16", $"{Config.PeerAddress}/16"); + + if (!success) + { + Console.WriteLine($"Failed to configure network interface: {nic.Name}"); + continue; + } + } + + Console.WriteLine($"Pinging peer @ {Config.PeerAddress}"); + + var ping = await Config.PeerAddress.Ping(); + + if (ping) + { + Console.WriteLine($"Got answer from {Config.PeerAddress}"); + var ex = await SchniederMeterDriver.Run($"{Config.PeerAddress}:{Config.PeerPort}", Bus.System); + + Console.WriteLine($"{nameof(SchniederMeterDriver)} FAILED with\n{ex}"); + } + else + { + Console.WriteLine($"No answer from {Config.PeerAddress}"); + } + + Console.Write($"Removing Point-to-Point connection on {nic.Name} ..."); + var removed = await nic.RemoveAddress($"{Config.OwnAddress}/16"); + Console.WriteLine(removed ? "done" : "failed"); +} + +Console.WriteLine("Stopping EmuMeter Driver"); \ No newline at end of file diff --git a/csharp/App/SchniederMeterDriver/SchniederMeterDriver.cs b/csharp/App/SchniederMeterDriver/SchniederMeterDriver.cs new file mode 100644 index 000000000..786be532c --- /dev/null +++ b/csharp/App/SchniederMeterDriver/SchniederMeterDriver.cs @@ -0,0 +1,66 @@ +using System.Reactive.Linq; +using InnovEnergy.Lib.Devices.IEM3kGridMeter; +using InnovEnergy.Lib.Protocols.DBus; +using InnovEnergy.Lib.Protocols.Modbus.Clients; +using InnovEnergy.Lib.Utils; +using InnovEnergy.Lib.Victron.VeDBus; + +namespace InnovEnergy.App.SchniederDriver; + +public static class SchniederMeterDriver +{ + public static Task Run(String hostName, Bus dbusAddress) + { + return Run(hostName, ModbusTcpClient.DefaultPort, dbusAddress); + } + + public static async Task Run(String hostName, UInt16 port, Bus dbusAddress) + { + // var ep = new UnixDomainSocketEndPoint("/home/eef/graber_dbus.sock"); + // var auth = AuthenticationMethod.ExternalAsRoot(); + // dbusAddress = new Bus(ep, auth); + + var schnieder = new Iem3KGridMeterDevice(hostName, port, Config.ModbusNodeId); + + + var schniederStatus = Observable + .Interval(Config.UpdatePeriod) + .Select(_ => schnieder.Read()) + .Publish(); + + var poller = schniederStatus.Connect(); + + var properties = Config.DefaultProperties; + + var signals = Config + .Signals + .Select(signal => schniederStatus.Select(signal.ToVeProperty)) + .Merge() + .Do(p => properties.Set(p)); + + // TODO: remove when possible + // Apparently some VE services need to be periodically reminded that + // this service is /Connected + schniederStatus.Subscribe(_ => properties.Set("/Connected", 1)); + + // Wait until status is read once to make sure all + // properties are set when we go onto the bus. + var dbus = schniederStatus + .Skip(1) + .Take(1) + .SelectMany(_ => PublishPropertiesOnDBus(properties, dbusAddress)); + + return await signals + .MergeErrors(dbus) + .Finally(poller.Dispose) + .SelectErrors(); + + } + + + private static Task PublishPropertiesOnDBus(VeProperties properties, Bus bus) + { + Console.WriteLine($"Connecting to DBus {bus}"); + return properties.PublishOnDBus(bus, Config.BusName); + } +} \ No newline at end of file diff --git a/csharp/App/SchniederMeterDriver/SchniederMeterDriver.csproj b/csharp/App/SchniederMeterDriver/SchniederMeterDriver.csproj new file mode 100644 index 000000000..ea039329c --- /dev/null +++ b/csharp/App/SchniederMeterDriver/SchniederMeterDriver.csproj @@ -0,0 +1,26 @@ + + + + + InnovEnergy.App.SchniederDriver + SchniederDriver + + + + + + + + + + + + + + + + + + + + diff --git a/csharp/App/SchniederMeterDriver/Signal.cs b/csharp/App/SchniederMeterDriver/Signal.cs new file mode 100644 index 000000000..6cda4d3dd --- /dev/null +++ b/csharp/App/SchniederMeterDriver/Signal.cs @@ -0,0 +1,16 @@ +using InnovEnergy.Lib.Devices.EmuMeter; +using InnovEnergy.Lib.Protocols.DBus.Protocol.DataTypes; +using InnovEnergy.Lib.Victron.VeDBus; + +namespace InnovEnergy.App.SchniederDriver; + + +// TODO: Does not compile +public record Signal(Func Source, ObjectPath Path, String Format = "") +{ + public VeProperty ToVeProperty(EmuMeterStatus status) + { + var value = Source(status); + return new VeProperty(Path, value, String.Format($"{{0:{Format}}}", value)); + } +} \ No newline at end of file diff --git a/csharp/App/SchniederMeterDriver/Utils.cs b/csharp/App/SchniederMeterDriver/Utils.cs new file mode 100644 index 000000000..53d5ca9d5 --- /dev/null +++ b/csharp/App/SchniederMeterDriver/Utils.cs @@ -0,0 +1,49 @@ +namespace InnovEnergy.App.SchniederDriver; + +public static class Utils +{ + public static IEnumerable TryWhere(this IEnumerable src, Func predicate) + { + foreach (var e in src) + { + var ok = false; + + try + { + ok = predicate(e); + } + catch + { + // ignored + } + + if (ok) + yield return e; + } + } + + public static IEnumerable TrySelect(this IEnumerable src, Func map) + { + foreach (var e in src) + { + var ok = false; + var result = default(R); + + try + { + result = map(e); + ok = true; + } + catch + { + // ignored + } + + if (ok) + yield return result!; + } + } + + + +} \ No newline at end of file diff --git a/csharp/App/SchniederMeterDriver/service/log/run b/csharp/App/SchniederMeterDriver/service/log/run new file mode 100755 index 000000000..62e2f8679 --- /dev/null +++ b/csharp/App/SchniederMeterDriver/service/log/run @@ -0,0 +1,3 @@ +#!/bin/sh +exec 2>&1 +exec multilog t s25000 n4 /var/log/EmuMeter diff --git a/csharp/App/SchniederMeterDriver/service/run b/csharp/App/SchniederMeterDriver/service/run new file mode 100755 index 000000000..58cdb6ff7 --- /dev/null +++ b/csharp/App/SchniederMeterDriver/service/run @@ -0,0 +1,3 @@ +#!/bin/sh +exec 2>&1 +exec softlimit -d 100000000 -s 1000000 -a 100000000 /opt/innovenergy/EmuMeter/EmuMeter diff --git a/csharp/InnovEnergy.sln b/csharp/InnovEnergy.sln index 624ace482..60951da25 100644 --- a/csharp/InnovEnergy.sln +++ b/csharp/InnovEnergy.sln @@ -87,6 +87,12 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Doepke", "Lib\Devices\Doepk EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Amax5070", "Lib\Devices\Amax5070\Amax5070.csproj", "{09E280B0-43D3-47BD-AF15-CF4FCDD24FE6}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sofar", "App\Sofar\Sofar.csproj", "{6B98449D-BF75-415A-8893-E49518F9307D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SofarInverter", "Lib\Devices\SofarInverter\SofarInverter.csproj", "{2C7F3D89-402B-43CB-988E-8D2D853BEF44}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SchniederMeterDriver", "App\SchniederMeterDriver\SchniederMeterDriver.csproj", "{2E7E7657-3A53-4B62-8927-FE9A082B81DE}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -226,6 +232,18 @@ Global {09E280B0-43D3-47BD-AF15-CF4FCDD24FE6}.Debug|Any CPU.Build.0 = Debug|Any CPU {09E280B0-43D3-47BD-AF15-CF4FCDD24FE6}.Release|Any CPU.ActiveCfg = Release|Any CPU {09E280B0-43D3-47BD-AF15-CF4FCDD24FE6}.Release|Any CPU.Build.0 = Release|Any CPU + {6B98449D-BF75-415A-8893-E49518F9307D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6B98449D-BF75-415A-8893-E49518F9307D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6B98449D-BF75-415A-8893-E49518F9307D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6B98449D-BF75-415A-8893-E49518F9307D}.Release|Any CPU.Build.0 = Release|Any CPU + {2C7F3D89-402B-43CB-988E-8D2D853BEF44}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2C7F3D89-402B-43CB-988E-8D2D853BEF44}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2C7F3D89-402B-43CB-988E-8D2D853BEF44}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2C7F3D89-402B-43CB-988E-8D2D853BEF44}.Release|Any CPU.Build.0 = Release|Any CPU + {2E7E7657-3A53-4B62-8927-FE9A082B81DE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2E7E7657-3A53-4B62-8927-FE9A082B81DE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2E7E7657-3A53-4B62-8927-FE9A082B81DE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2E7E7657-3A53-4B62-8927-FE9A082B81DE}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(NestedProjects) = preSolution {CF4834CB-91B7-4172-AC13-ECDA8613CD17} = {145597B4-3E30-45E6-9F72-4DD43194539A} @@ -265,5 +283,8 @@ Global {73B97F6E-2BDC-40DA-84A7-7FB0264387D6} = {AD5B98A8-AB7F-4DA2-B66D-5B4E63E7D854} {C2B14CD4-1BCA-4933-96D9-92F40EACD2B9} = {4931A385-24DC-4E78-BFF4-356F8D6D5183} {09E280B0-43D3-47BD-AF15-CF4FCDD24FE6} = {4931A385-24DC-4E78-BFF4-356F8D6D5183} + {6B98449D-BF75-415A-8893-E49518F9307D} = {145597B4-3E30-45E6-9F72-4DD43194539A} + {2C7F3D89-402B-43CB-988E-8D2D853BEF44} = {4931A385-24DC-4E78-BFF4-356F8D6D5183} + {2E7E7657-3A53-4B62-8927-FE9A082B81DE} = {145597B4-3E30-45E6-9F72-4DD43194539A} EndGlobalSection EndGlobal diff --git a/csharp/Lib/Devices/IEM3kGridMeter/IEM3kGridMeterDevice.cs b/csharp/Lib/Devices/IEM3kGridMeter/IEM3kGridMeterDevice.cs index de9e04b62..38dfecda4 100644 --- a/csharp/Lib/Devices/IEM3kGridMeter/IEM3kGridMeterDevice.cs +++ b/csharp/Lib/Devices/IEM3kGridMeter/IEM3kGridMeterDevice.cs @@ -10,8 +10,8 @@ public class Iem3KGridMeterDevice: ModbusDevice public Iem3KGridMeterDevice(String hostname, UInt16 port = 502, Byte slaveId = 1) : this(new TcpChannel(hostname, port), slaveId) { } - - public Iem3KGridMeterDevice(Channel channel, Byte slaveId = 1) : base(new ModbusTcpClient(channel, slaveId)) + + private Iem3KGridMeterDevice(Channel channel, Byte slaveId = 1) : base(new ModbusTcpClient(channel, slaveId)) { } @@ -47,4 +47,6 @@ public class Iem3KGridMeterDevice: ModbusDevice $"Failed to write data to {nameof(Iem3KGridMeterDevice)}".WriteLine(); } } + + } \ No newline at end of file diff --git a/csharp/Lib/Devices/IEM3kGridMeter/IEM3kGridMeterRegisters.cs b/csharp/Lib/Devices/IEM3kGridMeter/IEM3kGridMeterRegisters.cs index d7db41717..fb0183b76 100644 --- a/csharp/Lib/Devices/IEM3kGridMeter/IEM3kGridMeterRegisters.cs +++ b/csharp/Lib/Devices/IEM3kGridMeter/IEM3kGridMeterRegisters.cs @@ -12,25 +12,25 @@ using Float32 = Single; [AddressOffset(-2)] // why? -public class Iem3KGridMeterRegisters : IAc3Meter +public class Iem3KGridMeterRegisters //: IAc3Meter { private const Float32 ZeroBecauseReactivePowerNotSupported = 0; // TODO - [HoldingRegister(3054)] private Float32 _ActivePowerL1; - [HoldingRegister(3056)] private Float32 _ActivePowerL2; - [HoldingRegister(3058)] private Float32 _ActivePowerL3; + [HoldingRegister(3054)] public Float32 ActivePowerL1; + [HoldingRegister(3056)] public Float32 ActivePowerL2; + [HoldingRegister(3058)] public Float32 ActivePowerL3; - [HoldingRegister(3000)] private Float32 _CurrentL1; - [HoldingRegister(3002)] private Float32 _CurrentL2; - [HoldingRegister(3004)] private Float32 _CurrentL3; - - [HoldingRegister(3028)] private Float32 _VoltageL1N; - [HoldingRegister(3030)] private Float32 _VoltageL2N; - [HoldingRegister(3032)] private Float32 _VoltageL3N; - - [HoldingRegister(3110)] private Float32 _Frequency; + //[HoldingRegister(3000)] private Float32 _CurrentL1; + //[HoldingRegister(3002)] private Float32 _CurrentL2; + //[HoldingRegister(3004)] private Float32 _CurrentL3; + // + //[HoldingRegister(3028)] private Float32 _VoltageL1N; + //[HoldingRegister(3030)] private Float32 _VoltageL2N; + //[HoldingRegister(3032)] private Float32 _VoltageL3N; + // + //[HoldingRegister(3110)] private Float32 _Frequency; //[HoldingRegister(9012)] private Float32 _ReactivePowerL1; //[HoldingRegister(9014)] private Float32 _ReactivePowerL2; @@ -45,7 +45,7 @@ public class Iem3KGridMeterRegisters : IAc3Meter //[HoldingRegister(9026)] private Float32 _ApparentPowerL3; - public Ac3Bus Ac => new Ac3Bus + /*public Ac3Bus Ac => new Ac3Bus { L1 = new () { @@ -66,7 +66,9 @@ public class Iem3KGridMeterRegisters : IAc3Meter Phi = Atan2(ZeroBecauseReactivePowerNotSupported, _ActivePowerL3) }, Frequency = _Frequency - }; + };*/ + + } From 2c6ab05fbe3f5985c91895ba5091f978588ee3c8 Mon Sep 17 00:00:00 2001 From: atef Date: Tue, 4 Jun 2024 12:25:51 +0200 Subject: [PATCH 14/25] add config file to schnieder app --- csharp/App/SchniederMeterDriver/Config.cs | 65 +++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 csharp/App/SchniederMeterDriver/Config.cs diff --git a/csharp/App/SchniederMeterDriver/Config.cs b/csharp/App/SchniederMeterDriver/Config.cs new file mode 100644 index 000000000..415808049 --- /dev/null +++ b/csharp/App/SchniederMeterDriver/Config.cs @@ -0,0 +1,65 @@ +using System.Reflection; +using InnovEnergy.Lib.Victron.VeDBus; + +namespace InnovEnergy.App.SchniederDriver; + +public static class Config +{ + public const String Version = "1.0"; + public const String BusName = "com.victronenergy.grid.Schnieder"; + public const Byte ModbusNodeId = 1; + public const String OwnAddress = "10.0.0.1"; + public const String PeerAddress = "10.0.0.2"; + //public const String PeerAddress = "127.0.0.1"; + public const UInt16 PeerPort = 502; + + public static TimeSpan TcpTimeout { get; } = TimeSpan.FromSeconds(2); + + + public static readonly TimeSpan UpdatePeriod = TimeSpan.FromSeconds(1); + + public static readonly IReadOnlyList Signals = new Signal[] + { + new(s => s.Ac.L1.Current, "/Ac/L1/Current", "0.0 A"), + new(s => s.Ac.L2.Current, "/Ac/L2/Current", "0.0 A"), + new(s => s.Ac.L3.Current, "/Ac/L3/Current", "0.0 A"), + new(s => s.Ac.L1.Current + s.Ac.L2.Current + s.Ac.L3.Current, "/Ac/Current", "0.0 A"), + + new(s => s.Ac.L1.Voltage, "/Ac/L1/Voltage", "0.0 A"), + new(s => s.Ac.L2.Voltage, "/Ac/L2/Voltage", "0.0 A"), + new(s => s.Ac.L3.Voltage, "/Ac/L3/Voltage", "0.0 A"), + new(s => (s.Ac.L1.Voltage + s.Ac.L2.Voltage + s.Ac.L3.Voltage) / 3.0m, "/Ac/Voltage", "0.0 A"), + + new(s => s.Ac.L1.ActivePower, "/Ac/L1/Power", "0 W"), + new(s => s.Ac.L2.ActivePower, "/Ac/L2/Power", "0 W"), + new(s => s.Ac.L3.ActivePower, "/Ac/L3/Power", "0 W"), + new(s => s.Ac.ActivePower, "/Ac/Power", "0 W"), + + // new(s => s.EnergyImportL123, "Ac/Energy/Forward", "0.00 kWh"), + // new(s => s.EnergyExportL123, "Ac/Energy/Reverse", "0.00 kWh"), + // + // new(s => s.EnergyImportL1, "Ac/L1/Energy/Forward", "0.00 kWh"), + // new(s => s.EnergyExportL1, "Ac/L1/Energy/Reverse", "0.00 kWh"), + // + // new(s => s.EnergyImportL2, "Ac/L2/Energy/Forward", "0.00 kWh"), + // new(s => s.EnergyExportL2, "Ac/L2/Energy/Reverse", "0.00 kWh"), + // + // new(s => s.EnergyImportL3, "Ac/L3/Energy/Forward", "0.00 kWh"), + // new(s => s.EnergyExportL3, "Ac/L3/Energy/Reverse", "0.00 kWh"), + }; + + public static VeProperties DefaultProperties => new VeProperties + { + new("/ProductName" , "Grid meter" ), + new("/CustomName" , "EMU Professional II"), + new("/DeviceInstance" , 30), + new("/DeviceType" , 72), + new("/Mgmt/Connection" , "Modbus TCP"), + new("/Mgmt/ProcessName" , Assembly.GetEntryAssembly()?.Location ?? "unknown"), + new("/Mgmt/ProcessVersion", Version), + new("/Connected" , 1), + new("/ProductId" , 45058, "b002"), + new("/Role" , "grid"), + }; + +} \ No newline at end of file From 6383bd7f4c3910afc99e1e5e8660946fa316b3aa Mon Sep 17 00:00:00 2001 From: kostas Date: Tue, 4 Jun 2024 14:57:35 +0200 Subject: [PATCH 15/25] Temporary cahnges to remove errors I also need to adjust Signal --- .../IEM3kGridMeterDriver.csproj | 16 ---------------- csharp/App/SchniederMeterDriver/Signal.cs | 5 +++-- 2 files changed, 3 insertions(+), 18 deletions(-) delete mode 100644 csharp/App/IEM3kGridMeterDriver/IEM3kGridMeterDriver.csproj diff --git a/csharp/App/IEM3kGridMeterDriver/IEM3kGridMeterDriver.csproj b/csharp/App/IEM3kGridMeterDriver/IEM3kGridMeterDriver.csproj deleted file mode 100644 index 0ef62c506..000000000 --- a/csharp/App/IEM3kGridMeterDriver/IEM3kGridMeterDriver.csproj +++ /dev/null @@ -1,16 +0,0 @@ - - - - - InnovEnergy.Lib.Devices.IEM3kGridMeter - Exe - enable - - - - - - - - - diff --git a/csharp/App/SchniederMeterDriver/Signal.cs b/csharp/App/SchniederMeterDriver/Signal.cs index 6cda4d3dd..a8415d94e 100644 --- a/csharp/App/SchniederMeterDriver/Signal.cs +++ b/csharp/App/SchniederMeterDriver/Signal.cs @@ -1,4 +1,5 @@ using InnovEnergy.Lib.Devices.EmuMeter; +using InnovEnergy.Lib.Devices.IEM3kGridMeter; using InnovEnergy.Lib.Protocols.DBus.Protocol.DataTypes; using InnovEnergy.Lib.Victron.VeDBus; @@ -6,9 +7,9 @@ namespace InnovEnergy.App.SchniederDriver; // TODO: Does not compile -public record Signal(Func Source, ObjectPath Path, String Format = "") +public record Signal(Func Source, ObjectPath Path, String Format = "") { - public VeProperty ToVeProperty(EmuMeterStatus status) + public VeProperty ToVeProperty(Iem3KGridMeterRegisters status) { var value = Source(status); return new VeProperty(Path, value, String.Format($"{{0:{Format}}}", value)); From 1f3d4c74b99fa2398c1633905d5d430550947c54 Mon Sep 17 00:00:00 2001 From: atef Date: Tue, 4 Jun 2024 15:28:17 +0200 Subject: [PATCH 16/25] Update SchneiderMeterDriver --- .../Config.cs | 28 +++++++++---------- .../Program.cs | 10 +++---- .../SchneiderMeterDriver.cs} | 4 +-- .../SchneiderMeterDriver.csproj} | 2 +- .../Signal.cs | 3 +- csharp/App/SchneiderMeterDriver/debug.sh | 20 +++++++++++++ csharp/InnovEnergy.sln | 2 +- 7 files changed, 44 insertions(+), 25 deletions(-) rename csharp/App/{SchniederMeterDriver => SchneiderMeterDriver}/Config.cs (66%) rename csharp/App/{SchniederMeterDriver => SchneiderMeterDriver}/Program.cs (86%) rename csharp/App/{SchniederMeterDriver/SchniederMeterDriver.cs => SchneiderMeterDriver/SchneiderMeterDriver.cs} (96%) rename csharp/App/{SchniederMeterDriver/SchniederMeterDriver.csproj => SchneiderMeterDriver/SchneiderMeterDriver.csproj} (92%) rename csharp/App/{SchniederMeterDriver => SchneiderMeterDriver}/Signal.cs (85%) create mode 100755 csharp/App/SchneiderMeterDriver/debug.sh diff --git a/csharp/App/SchniederMeterDriver/Config.cs b/csharp/App/SchneiderMeterDriver/Config.cs similarity index 66% rename from csharp/App/SchniederMeterDriver/Config.cs rename to csharp/App/SchneiderMeterDriver/Config.cs index 415808049..c7dd3ccde 100644 --- a/csharp/App/SchniederMeterDriver/Config.cs +++ b/csharp/App/SchneiderMeterDriver/Config.cs @@ -1,7 +1,7 @@ using System.Reflection; using InnovEnergy.Lib.Victron.VeDBus; -namespace InnovEnergy.App.SchniederDriver; +namespace InnovEnergy.App.SchneiderDriver; public static class Config { @@ -20,20 +20,20 @@ public static class Config public static readonly IReadOnlyList Signals = new Signal[] { - new(s => s.Ac.L1.Current, "/Ac/L1/Current", "0.0 A"), - new(s => s.Ac.L2.Current, "/Ac/L2/Current", "0.0 A"), - new(s => s.Ac.L3.Current, "/Ac/L3/Current", "0.0 A"), - new(s => s.Ac.L1.Current + s.Ac.L2.Current + s.Ac.L3.Current, "/Ac/Current", "0.0 A"), + // new(s => s..CurrentL1, "/Ac/L1/Current", "0.0 A"), + // new(s => s..CurrentL2, "/Ac/L2/Current", "0.0 A"), + // new(s => s..CurrentL3, "/Ac/L3/Current", "0.0 A"), + // new(s => s..CurrentL1 + s.Ac.L2.Current + s.Ac.L3.Current, "/Ac/Current", "0.0 A"), - new(s => s.Ac.L1.Voltage, "/Ac/L1/Voltage", "0.0 A"), - new(s => s.Ac.L2.Voltage, "/Ac/L2/Voltage", "0.0 A"), - new(s => s.Ac.L3.Voltage, "/Ac/L3/Voltage", "0.0 A"), - new(s => (s.Ac.L1.Voltage + s.Ac.L2.Voltage + s.Ac.L3.Voltage) / 3.0m, "/Ac/Voltage", "0.0 A"), + // new(s => s.Ac.L1.Voltage, "/Ac/L1/Voltage", "0.0 A"), + // new(s => s.Ac.L2.Voltage, "/Ac/L2/Voltage", "0.0 A"), + // new(s => s.Ac.L3.Voltage, "/Ac/L3/Voltage", "0.0 A"), + // new(s => (s.Ac.L1.Voltage + s.Ac.L2.Voltage + s.Ac.L3.Voltage) / 3.0m, "/Ac/Voltage", "0.0 A"), - new(s => s.Ac.L1.ActivePower, "/Ac/L1/Power", "0 W"), - new(s => s.Ac.L2.ActivePower, "/Ac/L2/Power", "0 W"), - new(s => s.Ac.L3.ActivePower, "/Ac/L3/Power", "0 W"), - new(s => s.Ac.ActivePower, "/Ac/Power", "0 W"), + new(s => s.ActivePowerL1, "/Ac/L1/Power", "0 W"), + new(s => s.ActivePowerL2, "/Ac/L2/Power", "0 W"), + new(s => s.ActivePowerL3, "/Ac/L3/Power", "0 W"), + new(s => (s.ActivePowerL1 + s.ActivePowerL2 + s.ActivePowerL3), "/Ac/Power", "0 W"), // new(s => s.EnergyImportL123, "Ac/Energy/Forward", "0.00 kWh"), // new(s => s.EnergyExportL123, "Ac/Energy/Reverse", "0.00 kWh"), @@ -51,7 +51,7 @@ public static class Config public static VeProperties DefaultProperties => new VeProperties { new("/ProductName" , "Grid meter" ), - new("/CustomName" , "EMU Professional II"), + new("/CustomName" , "Schneider Professional II"), new("/DeviceInstance" , 30), new("/DeviceType" , 72), new("/Mgmt/Connection" , "Modbus TCP"), diff --git a/csharp/App/SchniederMeterDriver/Program.cs b/csharp/App/SchneiderMeterDriver/Program.cs similarity index 86% rename from csharp/App/SchniederMeterDriver/Program.cs rename to csharp/App/SchneiderMeterDriver/Program.cs index d7a975cc1..54bc7c2b8 100644 --- a/csharp/App/SchniederMeterDriver/Program.cs +++ b/csharp/App/SchneiderMeterDriver/Program.cs @@ -1,4 +1,4 @@ -using InnovEnergy.App.SchniederDriver; +using InnovEnergy.App.SchneiderDriver; using InnovEnergy.Lib.Protocols.DBus; using InnovEnergy.Lib.Utils; using InnovEnergy.Lib.Utils.Net; @@ -9,7 +9,7 @@ using InnovEnergy.Lib.Utils.Net; // ssh root@10.2.1.6 /home/root/emu/EmuMeter -Console.WriteLine("Starting Schnieder Driver " + Config.Version); +Console.WriteLine("Starting Schneider Driver " + Config.Version); var networkInterfaces = await Nic.GetNetworkInterfaces(); @@ -43,9 +43,9 @@ foreach (var nic in candidates) if (ping) { Console.WriteLine($"Got answer from {Config.PeerAddress}"); - var ex = await SchniederMeterDriver.Run($"{Config.PeerAddress}:{Config.PeerPort}", Bus.System); + var ex = await SchneiderMeterDriver.Run($"{Config.PeerAddress}:{Config.PeerPort}", Bus.System); - Console.WriteLine($"{nameof(SchniederMeterDriver)} FAILED with\n{ex}"); + Console.WriteLine($"{nameof(SchneiderMeterDriver)} FAILED with\n{ex}"); } else { @@ -57,4 +57,4 @@ foreach (var nic in candidates) Console.WriteLine(removed ? "done" : "failed"); } -Console.WriteLine("Stopping EmuMeter Driver"); \ No newline at end of file +Console.WriteLine("Stopping SchneiderMeter Driver"); \ No newline at end of file diff --git a/csharp/App/SchniederMeterDriver/SchniederMeterDriver.cs b/csharp/App/SchneiderMeterDriver/SchneiderMeterDriver.cs similarity index 96% rename from csharp/App/SchniederMeterDriver/SchniederMeterDriver.cs rename to csharp/App/SchneiderMeterDriver/SchneiderMeterDriver.cs index 786be532c..7a9205037 100644 --- a/csharp/App/SchniederMeterDriver/SchniederMeterDriver.cs +++ b/csharp/App/SchneiderMeterDriver/SchneiderMeterDriver.cs @@ -5,9 +5,9 @@ using InnovEnergy.Lib.Protocols.Modbus.Clients; using InnovEnergy.Lib.Utils; using InnovEnergy.Lib.Victron.VeDBus; -namespace InnovEnergy.App.SchniederDriver; +namespace InnovEnergy.App.SchneiderDriver; -public static class SchniederMeterDriver +public static class SchneiderMeterDriver { public static Task Run(String hostName, Bus dbusAddress) { diff --git a/csharp/App/SchniederMeterDriver/SchniederMeterDriver.csproj b/csharp/App/SchneiderMeterDriver/SchneiderMeterDriver.csproj similarity index 92% rename from csharp/App/SchniederMeterDriver/SchniederMeterDriver.csproj rename to csharp/App/SchneiderMeterDriver/SchneiderMeterDriver.csproj index ea039329c..ac5b87bcd 100644 --- a/csharp/App/SchniederMeterDriver/SchniederMeterDriver.csproj +++ b/csharp/App/SchneiderMeterDriver/SchneiderMeterDriver.csproj @@ -2,7 +2,7 @@ - InnovEnergy.App.SchniederDriver + InnovEnergy.App.SchneiderDriver SchniederDriver diff --git a/csharp/App/SchniederMeterDriver/Signal.cs b/csharp/App/SchneiderMeterDriver/Signal.cs similarity index 85% rename from csharp/App/SchniederMeterDriver/Signal.cs rename to csharp/App/SchneiderMeterDriver/Signal.cs index a8415d94e..9f9bb2254 100644 --- a/csharp/App/SchniederMeterDriver/Signal.cs +++ b/csharp/App/SchneiderMeterDriver/Signal.cs @@ -1,9 +1,8 @@ -using InnovEnergy.Lib.Devices.EmuMeter; using InnovEnergy.Lib.Devices.IEM3kGridMeter; using InnovEnergy.Lib.Protocols.DBus.Protocol.DataTypes; using InnovEnergy.Lib.Victron.VeDBus; -namespace InnovEnergy.App.SchniederDriver; +namespace InnovEnergy.App.SchneiderDriver; // TODO: Does not compile diff --git a/csharp/App/SchneiderMeterDriver/debug.sh b/csharp/App/SchneiderMeterDriver/debug.sh new file mode 100755 index 000000000..c138cfdb8 --- /dev/null +++ b/csharp/App/SchneiderMeterDriver/debug.sh @@ -0,0 +1,20 @@ +#!/bin/bash + +csproj="SchneiderMeterDriver.csproj" +exe="SchneiderMeterDriver" +#remote="10.2.1.6" +remote="10.2.4.155" + +netVersion="net6.0" +platform="linux-arm" +config="Release" +host="root@$remote" +dir="/opt/victronenergy/$exe" + +set -e + +dotnet publish "$csproj" -c $config -r $platform -p:SuppressTrimmAnalysisWarnings=true -p:PublishSingleFile=true -p:PublishTrimmed=true -p:DebugType=None -p:DebugSymbols=false --self-contained true +rsync -av "bin/$config/$netVersion/$platform/publish/" "$host:$dir" +#clear +#ssh "$host" "$dir/$exe" + \ No newline at end of file diff --git a/csharp/InnovEnergy.sln b/csharp/InnovEnergy.sln index 60951da25..10c541c54 100644 --- a/csharp/InnovEnergy.sln +++ b/csharp/InnovEnergy.sln @@ -91,7 +91,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sofar", "App\Sofar\Sofar.cs EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SofarInverter", "Lib\Devices\SofarInverter\SofarInverter.csproj", "{2C7F3D89-402B-43CB-988E-8D2D853BEF44}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SchniederMeterDriver", "App\SchniederMeterDriver\SchniederMeterDriver.csproj", "{2E7E7657-3A53-4B62-8927-FE9A082B81DE}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SchneiderMeterDriver", "App\SchneiderMeterDriver\SchneiderMeterDriver.csproj", "{2E7E7657-3A53-4B62-8927-FE9A082B81DE}" EndProject Global From f70e3fe180c02cac229fb255cd318ff4f1f59c91 Mon Sep 17 00:00:00 2001 From: atef Date: Tue, 4 Jun 2024 15:37:25 +0200 Subject: [PATCH 17/25] Update SchneiderMeterDriver nic file --- csharp/App/SaliMax/src/Ess/Controller.cs | 2 +- .../App/{SchniederMeterDriver => SchneiderMeterDriver}/Nic.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename csharp/App/{SchniederMeterDriver => SchneiderMeterDriver}/Nic.cs (98%) diff --git a/csharp/App/SaliMax/src/Ess/Controller.cs b/csharp/App/SaliMax/src/Ess/Controller.cs index 3d35cf2d7..1cc305352 100644 --- a/csharp/App/SaliMax/src/Ess/Controller.cs +++ b/csharp/App/SaliMax/src/Ess/Controller.cs @@ -195,9 +195,9 @@ public static class Controller var mustDoCalibrationCharge = calibrationChargeForced == CalibrationChargeType.ChargePermanently || (calibrationChargeForced == CalibrationChargeType.AdditionallyOnce && additionalCalibrationRequired) || (calibrationChargeForced == CalibrationChargeType.RepetitivelyEvery && repetitiveCalibrationRequired); + Console.WriteLine("Next Repetitive calibration charge date is "+statusRecord.Config.DayAndTimeForRepetitiveCalibration); Console.WriteLine("Next Additional calibration charge date is "+statusRecord.Config.DayAndTimeForAdditionalCalibration); - //Console.WriteLine("Time now is "+DateTime.Now); if (statusRecord.Battery is not null) { diff --git a/csharp/App/SchniederMeterDriver/Nic.cs b/csharp/App/SchneiderMeterDriver/Nic.cs similarity index 98% rename from csharp/App/SchniederMeterDriver/Nic.cs rename to csharp/App/SchneiderMeterDriver/Nic.cs index 8e36c59be..a580f6fd3 100644 --- a/csharp/App/SchniederMeterDriver/Nic.cs +++ b/csharp/App/SchneiderMeterDriver/Nic.cs @@ -2,7 +2,7 @@ using System.Text.Json.Nodes; using CliWrap; using CliWrap.Buffered; -namespace InnovEnergy.App.SchniederDriver; +namespace InnovEnergy.App.SchneiderDriver; public readonly struct Nic { From 493b76e0ed35e2301387bf0a5ba25b36698253ed Mon Sep 17 00:00:00 2001 From: kostas Date: Wed, 5 Jun 2024 09:57:09 +0200 Subject: [PATCH 18/25] fix: trywhere --- csharp/App/SchneiderMeterDriver/Utils.cs | 49 ++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 csharp/App/SchneiderMeterDriver/Utils.cs diff --git a/csharp/App/SchneiderMeterDriver/Utils.cs b/csharp/App/SchneiderMeterDriver/Utils.cs new file mode 100644 index 000000000..4b5735a35 --- /dev/null +++ b/csharp/App/SchneiderMeterDriver/Utils.cs @@ -0,0 +1,49 @@ +namespace InnovEnergy.App.SchneiderDriver; + +public static class Utils +{ + public static IEnumerable TryWhere(this IEnumerable src, Func predicate) + { + foreach (var e in src) + { + var ok = false; + + try + { + ok = predicate(e); + } + catch + { + // ignored + } + + if (ok) + yield return e; + } + } + + public static IEnumerable TrySelect(this IEnumerable src, Func map) + { + foreach (var e in src) + { + var ok = false; + var result = default(R); + + try + { + result = map(e); + ok = true; + } + catch + { + // ignored + } + + if (ok) + yield return result!; + } + } + + + +} \ No newline at end of file From 783634d1b6862d2e21cc8f98090306bf07f30087 Mon Sep 17 00:00:00 2001 From: Yinyin Liu Date: Wed, 5 Jun 2024 12:33:44 +0200 Subject: [PATCH 19/25] Updated NodeRed --- .../dbus-fzsonick-48tl-Ivo/__init__.py | 0 .../dbus-fzsonick-48tl-Ivo}/config.py | 41 +- .../dbus-fzsonick-48tl-Ivo/config.pyc | Bin 0 -> 1246 bytes .../dbus-fzsonick-48tl-Ivo/convert.py | 160 + .../dbus-fzsonick-48tl-Ivo/convert.pyc | Bin 0 -> 5476 bytes .../dbus-fzsonick-48tl-Ivo/data.py | 125 + .../dbus-fzsonick-48tl-Ivo/data.pyc | Bin 0 -> 4923 bytes .../dbus-fzsonick-48tl.py | 354 ++ .../dbus-fzsonick-48tl.pyc | Bin 0 -> 19070 bytes .../ext/velib_python/ve_utils.py | 202 ++ .../ext/velib_python/ve_utils.pyc | Bin 0 -> 8991 bytes .../ext/velib_python/vedbus.py | 496 +++ .../ext/velib_python/vedbus.pyc | Bin 0 -> 21834 bytes .../python_libs/__init__.py | 0 .../python_libs/__init__.pyc | Bin 0 -> 134 bytes .../python_libs/ie_dbus/__init__.py | 0 .../python_libs/ie_dbus/__init__.pyc | Bin 0 -> 142 bytes .../python_libs/ie_dbus/dbus_service.py | 54 + .../python_libs/ie_dbus/dbus_service.pyc | Bin 0 -> 2657 bytes .../python_libs/ie_dbus/private/__init__.py | 0 .../python_libs/ie_dbus/private/__init__.pyc | Bin 0 -> 150 bytes .../python_libs/ie_dbus/private/datatypes.py | 22 + .../python_libs/ie_dbus/private/datatypes.pyc | Bin 0 -> 883 bytes .../ie_dbus/private/dbus_connection.py | 185 + .../ie_dbus/private/dbus_connection.pyc | Bin 0 -> 8378 bytes .../ie_dbus/private/dbus_daemon.py | 273 ++ .../ie_dbus/private/dbus_daemon.pyc | Bin 0 -> 9390 bytes .../python_libs/ie_dbus/private/dbus_types.py | 139 + .../ie_dbus/private/dbus_types.pyc | Bin 0 -> 4364 bytes .../ie_dbus/private/message_types.py | 259 ++ .../ie_dbus/private/message_types.pyc | Bin 0 -> 9236 bytes .../ie_dbus/private/own_properties.py | 177 + .../ie_dbus/private/own_properties.pyc | Bin 0 -> 6724 bytes .../ie_dbus/private/remote_properties.py | 166 + .../ie_dbus/private/remote_properties.pyc | Bin 0 -> 6455 bytes .../python_libs/ie_dbus/private/settings.py | 89 + .../python_libs/ie_dbus/private/settings.pyc | Bin 0 -> 3664 bytes .../ie_dbus/private/ve_constants.py | 11 + .../ie_dbus/private/ve_constants.pyc | Bin 0 -> 609 bytes .../python_libs/ie_utils/__init__.py | 0 .../python_libs/ie_utils/__init__.pyc | Bin 0 -> 143 bytes .../python_libs/ie_utils/filters.py | 73 + .../python_libs/ie_utils/filters.pyc | Bin 0 -> 2634 bytes .../python_libs/ie_utils/main_loop.py | 30 + .../python_libs/ie_utils/main_loop.pyc | Bin 0 -> 1069 bytes .../python_libs/ie_utils/mixins.py | 115 + .../python_libs/ie_utils/mixins.pyc | Bin 0 -> 4808 bytes .../python_libs/ie_utils/utils.py | 44 + .../python_libs/ie_utils/utils.pyc | Bin 0 -> 1530 bytes .../python_libs/pysnooper/__init__.py | 30 + .../python_libs/pysnooper/pycompat.py | 95 + .../python_libs/pysnooper/tracer.py | 498 +++ .../python_libs/pysnooper/utils.py | 98 + .../python_libs/pysnooper/variables.py | 133 + .../dbus-fzsonick-48tl-Ivo/service/down | 0 .../dbus-fzsonick-48tl-Ivo/service/log/down | 0 .../dbus-fzsonick-48tl-Ivo/service/log/run | 3 + .../dbus-fzsonick-48tl-Ivo/service/run | 4 + .../dbus-fzsonick-48tl-Ivo/signals.py | 214 ++ .../dbus-fzsonick-48tl-Ivo/signals.pyc | Bin 0 -> 10358 bytes .../dbus-fzsonick-48tl-Ivo}/start.sh | 2 +- .../__pycache__/config.cpython-38.pyc | Bin 0 -> 1053 bytes .../__pycache__/convert.cpython-38.pyc | Bin 0 -> 3343 bytes .../__pycache__/data.cpython-38.pyc | Bin 0 -> 3578 bytes .../dbus-fzsonick-48tl.cpython-38.pyc | Bin 0 -> 12185 bytes .../dbus-fzsonick-48tl}/config.py | 4 + .../dbus-fzsonick-48tl}/convert.py | 0 .../dbus-fzsonick-48tl/data.py | 0 .../dbus-fzsonick-48tl/dbus-fzsonick-48tl.py | 1077 ++++++ .../__pycache__/ve_utils.cpython-38.pyc | Bin 0 -> 6666 bytes .../__pycache__/vedbus.cpython-38.pyc | Bin 0 -> 15886 bytes .../ext/velib_python/ve_utils.py | 0 .../ext/velib_python/vedbus.py | 0 .../dbus-fzsonick-48tl/start.sh | 0 NodeRed/{ => NodeRedFiles}/flows.json | 3156 +++++++---------- NodeRed/NodeRedFiles/openvpn | Bin 0 -> 7819340 bytes NodeRed/NodeRedFiles/pika-0.13.1/.checkignore | 5 + .../NodeRedFiles/pika-0.13.1/.codeclimate.yml | 8 + NodeRed/NodeRedFiles/pika-0.13.1/.coveragerc | 2 + .../pika-0.13.1/.github/ISSUE_TEMPLATE.md | 15 + .../.github/PULL_REQUEST_TEMPLATE.md | 43 + NodeRed/NodeRedFiles/pika-0.13.1/.gitignore | 20 + NodeRed/NodeRedFiles/pika-0.13.1/.travis.yml | 103 + .../NodeRedFiles/pika-0.13.1/CHANGELOG.rst | 760 ++++ .../NodeRedFiles/pika-0.13.1/CONTRIBUTING.md | 68 + NodeRed/NodeRedFiles/pika-0.13.1/LICENSE | 25 + NodeRed/NodeRedFiles/pika-0.13.1/MANIFEST.in | 2 + NodeRed/NodeRedFiles/pika-0.13.1/README.rst | 157 + NodeRed/NodeRedFiles/pika-0.13.1/appveyor.yml | 107 + .../NodeRedFiles/pika-0.13.1/docs/Makefile | 153 + NodeRed/NodeRedFiles/pika-0.13.1/docs/conf.py | 34 + .../pika-0.13.1/docs/contributors.rst | 104 + .../pika-0.13.1/docs/examples.rst | 23 + .../asynchronous_consumer_example.rst | 357 ++ .../asynchronous_publisher_example.rst | 359 ++ .../docs/examples/asyncio_consumer.rst | 355 ++ .../docs/examples/blocking_basic_get.rst | 23 + .../docs/examples/blocking_consume.rst | 29 + .../examples/blocking_consumer_generator.rst | 73 + .../blocking_delivery_confirmations.rst | 28 + .../examples/blocking_publish_mandatory.rst | 29 + .../comparing_publishing_sync_async.rst | 64 + .../docs/examples/connecting_async.rst | 49 + .../docs/examples/direct_reply_to.rst | 81 + .../heartbeat_and_blocked_timeouts.rst | 37 + .../examples/tls_mutual_authentication.rst | 61 + .../examples/tls_server_uathentication.rst | 60 + .../docs/examples/tornado_consumer.rst | 349 ++ .../docs/examples/twisted_example.rst | 49 + .../docs/examples/using_urlparameters.rst | 68 + NodeRed/NodeRedFiles/pika-0.13.1/docs/faq.rst | 18 + .../NodeRedFiles/pika-0.13.1/docs/index.rst | 37 + .../NodeRedFiles/pika-0.13.1/docs/intro.rst | 125 + .../docs/modules/adapters/asyncio.rst | 9 + .../docs/modules/adapters/blocking.rst | 13 + .../docs/modules/adapters/index.rst | 15 + .../docs/modules/adapters/select.rst | 7 + .../docs/modules/adapters/tornado.rst | 9 + .../docs/modules/adapters/twisted.rst | 15 + .../pika-0.13.1/docs/modules/channel.rst | 10 + .../pika-0.13.1/docs/modules/connection.rst | 7 + .../pika-0.13.1/docs/modules/credentials.rst | 18 + .../pika-0.13.1/docs/modules/exceptions.rst | 5 + .../pika-0.13.1/docs/modules/index.rst | 21 + .../pika-0.13.1/docs/modules/parameters.rst | 42 + .../pika-0.13.1/docs/modules/spec.rst | 8 + .../pika-0.13.1/docs/version_history.rst | 760 ++++ .../examples/asynchronous_consumer_example.py | 350 ++ .../asynchronous_publisher_example.py | 353 ++ .../examples/basic_consumer_threaded.py | 68 + .../pika-0.13.1/examples/confirmation.py | 47 + .../pika-0.13.1/examples/consume.py | 44 + .../pika-0.13.1/examples/consumer_queued.py | 66 + .../pika-0.13.1/examples/consumer_simple.py | 57 + .../pika-0.13.1/examples/direct_reply_to.py | 80 + .../heartbeat_and_blocked_timeouts.py | 48 + .../pika-0.13.1/examples/producer.py | 42 + .../pika-0.13.1/examples/publish.py | 32 + .../NodeRedFiles/pika-0.13.1/examples/send.py | 41 + .../pika-0.13.1/examples/twisted_service.py | 209 ++ .../NodeRedFiles/pika-0.13.1/pika/__init__.py | 17 + .../pika-0.13.1/pika/adapters/__init__.py | 21 + .../pika/adapters/asyncio_connection.py | 254 ++ .../pika/adapters/base_connection.py | 582 +++ .../pika/adapters/blocking_connection.py | 2616 ++++++++++++++ .../pika/adapters/select_connection.py | 1178 ++++++ .../pika/adapters/tornado_connection.py | 122 + .../pika/adapters/twisted_connection.py | 474 +++ .../pika-0.13.1/pika/amqp_object.py | 66 + .../NodeRedFiles/pika-0.13.1/pika/callback.py | 410 +++ .../NodeRedFiles/pika-0.13.1/pika/channel.py | 1436 ++++++++ .../NodeRedFiles/pika-0.13.1/pika/compat.py | 210 ++ .../pika-0.13.1/pika/connection.py | 2356 ++++++++++++ .../pika-0.13.1/pika/credentials.py | 120 + NodeRed/NodeRedFiles/pika-0.13.1/pika/data.py | 322 ++ .../pika-0.13.1/pika/exceptions.py | 257 ++ .../NodeRedFiles/pika-0.13.1/pika/frame.py | 265 ++ .../pika-0.13.1/pika/heartbeat.py | 214 ++ NodeRed/NodeRedFiles/pika-0.13.1/pika/spec.py | 2319 ++++++++++++ .../pika-0.13.1/pika/tcp_socket_opts.py | 43 + .../NodeRedFiles/pika-0.13.1/pika/utils.py | 16 + NodeRed/NodeRedFiles/pika-0.13.1/pylintrc | 391 ++ NodeRed/NodeRedFiles/pika-0.13.1/setup.cfg | 16 + NodeRed/NodeRedFiles/pika-0.13.1/setup.py | 51 + .../pika-0.13.1/test-requirements.txt | 6 + .../testdata/certs/ca_certificate.pem | 19 + .../pika-0.13.1/testdata/certs/ca_key.pem | 28 + .../testdata/certs/client_certificate.pem | 19 + .../pika-0.13.1/testdata/certs/client_key.pem | 27 + .../testdata/certs/server_certificate.pem | 19 + .../pika-0.13.1/testdata/certs/server_key.pem | 27 + .../pika-0.13.1/testdata/rabbitmq.conf.in | 13 + .../pika-0.13.1/testdata/wait-epmd.ps1 | 21 + .../pika-0.13.1/testdata/wait-rabbitmq.ps1 | 21 + .../tests/acceptance/async_adapter_tests.py | 587 +++ .../tests/acceptance/async_test_base.py | 247 ++ .../tests/acceptance/blocking_adapter_test.py | 2791 +++++++++++++++ .../acceptance/enforce_one_basicget_test.py | 29 + .../tests/acceptance/forward_server.py | 526 +++ .../tests/acceptance/test_utils.py | 73 + .../tests/unit/amqp_object_tests.py | 62 + .../tests/unit/base_connection_tests.py | 85 + .../tests/unit/blocking_channel_tests.py | 82 + .../tests/unit/blocking_connection_tests.py | 328 ++ .../pika-0.13.1/tests/unit/callback_tests.py | 413 +++ .../pika-0.13.1/tests/unit/channel_tests.py | 1437 ++++++++ .../pika-0.13.1/tests/unit/compat_tests.py | 24 + .../tests/unit/connection_parameters_tests.py | 743 ++++ .../tests/unit/connection_tests.py | 907 +++++ .../tests/unit/connection_timeout_tests.py | 143 + .../unit/content_frame_assembler_tests.py | 151 + .../tests/unit/credentials_tests.py | 159 + .../pika-0.13.1/tests/unit/data_tests.py | 85 + .../pika-0.13.1/tests/unit/exceptions_test.py | 40 + .../pika-0.13.1/tests/unit/frame_tests.py | 110 + .../pika-0.13.1/tests/unit/heartbeat_tests.py | 189 + .../unit/select_connection_ioloop_tests.py | 634 ++++ .../unit/select_connection_timer_tests.py | 353 ++ .../pika-0.13.1/tests/unit/tornado_tests.py | 18 + .../pika-0.13.1/tests/unit/twisted_tests.py | 21 + .../pika-0.13.1/tests/unit/utils_tests.py | 11 + .../NodeRedFiles/pika-0.13.1/utils/codegen.py | 404 +++ NodeRed/{ => NodeRedFiles}/rc.local | 8 +- NodeRed/NodeRedFiles/service/log/run | 3 + .../NodeRedFiles/service/log/supervise/lock | 0 .../NodeRedFiles/service/log/supervise/status | Bin 0 -> 18 bytes NodeRed/NodeRedFiles/service/run | 53 + NodeRed/NodeRedFiles/service/supervise/lock | 0 NodeRed/NodeRedFiles/service/supervise/status | Bin 0 -> 18 bytes NodeRed/{ => NodeRedFiles}/settings-user.js | 0 NodeRed/dbus-csv-files/data.py | 63 - NodeRed/dbus-csv-files/dbus-csv-files.py | 731 ---- NodeRed/dbus-fzsonick-48tl/convert.py | 119 - .../dbus-fzsonick-48tl/dbus-fzsonick-48tl.py | 980 ----- NodeRed/dvcc.py | 1287 ------- NodeRed/update_Cerbo.py | 226 ++ 216 files changed, 37681 insertions(+), 4982 deletions(-) create mode 100644 NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/__init__.py rename NodeRed/{dbus-fzsonick-48tl => NodeRedFiles/dbus-fzsonick-48tl-Ivo}/config.py (52%) create mode 100644 NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/config.pyc create mode 100644 NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/convert.py create mode 100644 NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/convert.pyc create mode 100644 NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/data.py create mode 100644 NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/data.pyc create mode 100755 NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/dbus-fzsonick-48tl.py create mode 100644 NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/dbus-fzsonick-48tl.pyc create mode 100644 NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/ext/velib_python/ve_utils.py create mode 100644 NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/ext/velib_python/ve_utils.pyc create mode 100644 NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/ext/velib_python/vedbus.py create mode 100644 NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/ext/velib_python/vedbus.pyc create mode 100644 NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/__init__.py create mode 100644 NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/__init__.pyc create mode 100644 NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_dbus/__init__.py create mode 100644 NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_dbus/__init__.pyc create mode 100644 NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_dbus/dbus_service.py create mode 100644 NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_dbus/dbus_service.pyc create mode 100644 NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_dbus/private/__init__.py create mode 100644 NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_dbus/private/__init__.pyc create mode 100644 NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_dbus/private/datatypes.py create mode 100644 NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_dbus/private/datatypes.pyc create mode 100644 NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_dbus/private/dbus_connection.py create mode 100644 NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_dbus/private/dbus_connection.pyc create mode 100644 NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_dbus/private/dbus_daemon.py create mode 100644 NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_dbus/private/dbus_daemon.pyc create mode 100644 NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_dbus/private/dbus_types.py create mode 100644 NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_dbus/private/dbus_types.pyc create mode 100644 NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_dbus/private/message_types.py create mode 100644 NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_dbus/private/message_types.pyc create mode 100644 NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_dbus/private/own_properties.py create mode 100644 NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_dbus/private/own_properties.pyc create mode 100644 NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_dbus/private/remote_properties.py create mode 100644 NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_dbus/private/remote_properties.pyc create mode 100644 NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_dbus/private/settings.py create mode 100644 NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_dbus/private/settings.pyc create mode 100644 NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_dbus/private/ve_constants.py create mode 100644 NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_dbus/private/ve_constants.pyc create mode 100644 NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_utils/__init__.py create mode 100644 NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_utils/__init__.pyc create mode 100644 NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_utils/filters.py create mode 100644 NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_utils/filters.pyc create mode 100644 NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_utils/main_loop.py create mode 100644 NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_utils/main_loop.pyc create mode 100644 NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_utils/mixins.py create mode 100644 NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_utils/mixins.pyc create mode 100644 NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_utils/utils.py create mode 100644 NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_utils/utils.pyc create mode 100644 NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/pysnooper/__init__.py create mode 100644 NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/pysnooper/pycompat.py create mode 100644 NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/pysnooper/tracer.py create mode 100644 NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/pysnooper/utils.py create mode 100644 NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/pysnooper/variables.py create mode 100644 NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/service/down create mode 100644 NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/service/log/down create mode 100755 NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/service/log/run create mode 100755 NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/service/run create mode 100644 NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/signals.py create mode 100644 NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/signals.pyc rename NodeRed/{dbus-csv-files => NodeRedFiles/dbus-fzsonick-48tl-Ivo}/start.sh (58%) create mode 100644 NodeRed/NodeRedFiles/dbus-fzsonick-48tl/__pycache__/config.cpython-38.pyc create mode 100644 NodeRed/NodeRedFiles/dbus-fzsonick-48tl/__pycache__/convert.cpython-38.pyc create mode 100644 NodeRed/NodeRedFiles/dbus-fzsonick-48tl/__pycache__/data.cpython-38.pyc create mode 100644 NodeRed/NodeRedFiles/dbus-fzsonick-48tl/__pycache__/dbus-fzsonick-48tl.cpython-38.pyc rename NodeRed/{dbus-csv-files => NodeRedFiles/dbus-fzsonick-48tl}/config.py (85%) rename NodeRed/{dbus-csv-files => NodeRedFiles/dbus-fzsonick-48tl}/convert.py (100%) rename NodeRed/{ => NodeRedFiles}/dbus-fzsonick-48tl/data.py (100%) create mode 100755 NodeRed/NodeRedFiles/dbus-fzsonick-48tl/dbus-fzsonick-48tl.py create mode 100644 NodeRed/NodeRedFiles/dbus-fzsonick-48tl/ext/velib_python/__pycache__/ve_utils.cpython-38.pyc create mode 100644 NodeRed/NodeRedFiles/dbus-fzsonick-48tl/ext/velib_python/__pycache__/vedbus.cpython-38.pyc rename NodeRed/{ => NodeRedFiles}/dbus-fzsonick-48tl/ext/velib_python/ve_utils.py (100%) rename NodeRed/{ => NodeRedFiles}/dbus-fzsonick-48tl/ext/velib_python/vedbus.py (100%) rename NodeRed/{ => NodeRedFiles}/dbus-fzsonick-48tl/start.sh (100%) rename NodeRed/{ => NodeRedFiles}/flows.json (63%) create mode 100644 NodeRed/NodeRedFiles/openvpn create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/.checkignore create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/.codeclimate.yml create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/.coveragerc create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/.github/ISSUE_TEMPLATE.md create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/.github/PULL_REQUEST_TEMPLATE.md create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/.gitignore create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/.travis.yml create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/CHANGELOG.rst create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/CONTRIBUTING.md create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/LICENSE create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/MANIFEST.in create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/README.rst create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/appveyor.yml create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/docs/Makefile create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/docs/conf.py create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/docs/contributors.rst create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/docs/examples.rst create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/docs/examples/asynchronous_consumer_example.rst create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/docs/examples/asynchronous_publisher_example.rst create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/docs/examples/asyncio_consumer.rst create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/docs/examples/blocking_basic_get.rst create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/docs/examples/blocking_consume.rst create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/docs/examples/blocking_consumer_generator.rst create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/docs/examples/blocking_delivery_confirmations.rst create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/docs/examples/blocking_publish_mandatory.rst create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/docs/examples/comparing_publishing_sync_async.rst create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/docs/examples/connecting_async.rst create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/docs/examples/direct_reply_to.rst create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/docs/examples/heartbeat_and_blocked_timeouts.rst create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/docs/examples/tls_mutual_authentication.rst create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/docs/examples/tls_server_uathentication.rst create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/docs/examples/tornado_consumer.rst create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/docs/examples/twisted_example.rst create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/docs/examples/using_urlparameters.rst create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/docs/faq.rst create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/docs/index.rst create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/docs/intro.rst create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/docs/modules/adapters/asyncio.rst create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/docs/modules/adapters/blocking.rst create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/docs/modules/adapters/index.rst create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/docs/modules/adapters/select.rst create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/docs/modules/adapters/tornado.rst create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/docs/modules/adapters/twisted.rst create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/docs/modules/channel.rst create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/docs/modules/connection.rst create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/docs/modules/credentials.rst create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/docs/modules/exceptions.rst create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/docs/modules/index.rst create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/docs/modules/parameters.rst create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/docs/modules/spec.rst create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/docs/version_history.rst create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/examples/asynchronous_consumer_example.py create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/examples/asynchronous_publisher_example.py create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/examples/basic_consumer_threaded.py create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/examples/confirmation.py create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/examples/consume.py create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/examples/consumer_queued.py create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/examples/consumer_simple.py create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/examples/direct_reply_to.py create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/examples/heartbeat_and_blocked_timeouts.py create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/examples/producer.py create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/examples/publish.py create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/examples/send.py create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/examples/twisted_service.py create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/pika/__init__.py create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/pika/adapters/__init__.py create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/pika/adapters/asyncio_connection.py create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/pika/adapters/base_connection.py create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/pika/adapters/blocking_connection.py create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/pika/adapters/select_connection.py create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/pika/adapters/tornado_connection.py create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/pika/adapters/twisted_connection.py create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/pika/amqp_object.py create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/pika/callback.py create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/pika/channel.py create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/pika/compat.py create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/pika/connection.py create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/pika/credentials.py create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/pika/data.py create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/pika/exceptions.py create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/pika/frame.py create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/pika/heartbeat.py create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/pika/spec.py create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/pika/tcp_socket_opts.py create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/pika/utils.py create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/pylintrc create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/setup.cfg create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/setup.py create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/test-requirements.txt create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/testdata/certs/ca_certificate.pem create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/testdata/certs/ca_key.pem create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/testdata/certs/client_certificate.pem create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/testdata/certs/client_key.pem create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/testdata/certs/server_certificate.pem create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/testdata/certs/server_key.pem create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/testdata/rabbitmq.conf.in create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/testdata/wait-epmd.ps1 create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/testdata/wait-rabbitmq.ps1 create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/tests/acceptance/async_adapter_tests.py create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/tests/acceptance/async_test_base.py create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/tests/acceptance/blocking_adapter_test.py create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/tests/acceptance/enforce_one_basicget_test.py create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/tests/acceptance/forward_server.py create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/tests/acceptance/test_utils.py create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/tests/unit/amqp_object_tests.py create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/tests/unit/base_connection_tests.py create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/tests/unit/blocking_channel_tests.py create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/tests/unit/blocking_connection_tests.py create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/tests/unit/callback_tests.py create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/tests/unit/channel_tests.py create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/tests/unit/compat_tests.py create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/tests/unit/connection_parameters_tests.py create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/tests/unit/connection_tests.py create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/tests/unit/connection_timeout_tests.py create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/tests/unit/content_frame_assembler_tests.py create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/tests/unit/credentials_tests.py create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/tests/unit/data_tests.py create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/tests/unit/exceptions_test.py create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/tests/unit/frame_tests.py create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/tests/unit/heartbeat_tests.py create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/tests/unit/select_connection_ioloop_tests.py create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/tests/unit/select_connection_timer_tests.py create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/tests/unit/tornado_tests.py create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/tests/unit/twisted_tests.py create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/tests/unit/utils_tests.py create mode 100644 NodeRed/NodeRedFiles/pika-0.13.1/utils/codegen.py rename NodeRed/{ => NodeRedFiles}/rc.local (54%) create mode 100755 NodeRed/NodeRedFiles/service/log/run create mode 100644 NodeRed/NodeRedFiles/service/log/supervise/lock create mode 100644 NodeRed/NodeRedFiles/service/log/supervise/status create mode 100755 NodeRed/NodeRedFiles/service/run create mode 100644 NodeRed/NodeRedFiles/service/supervise/lock create mode 100644 NodeRed/NodeRedFiles/service/supervise/status rename NodeRed/{ => NodeRedFiles}/settings-user.js (100%) delete mode 100644 NodeRed/dbus-csv-files/data.py delete mode 100755 NodeRed/dbus-csv-files/dbus-csv-files.py delete mode 100644 NodeRed/dbus-fzsonick-48tl/convert.py delete mode 100755 NodeRed/dbus-fzsonick-48tl/dbus-fzsonick-48tl.py delete mode 100644 NodeRed/dvcc.py create mode 100644 NodeRed/update_Cerbo.py diff --git a/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/__init__.py b/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/NodeRed/dbus-fzsonick-48tl/config.py b/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/config.py similarity index 52% rename from NodeRed/dbus-fzsonick-48tl/config.py rename to NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/config.py index 59ce1b65b..f87236d24 100644 --- a/NodeRed/dbus-fzsonick-48tl/config.py +++ b/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/config.py @@ -1,13 +1,11 @@ import serial import logging +from data import read_file_one_line # dbus configuration -FIRMWARE_VERSION = 1 # value returned by getValue (getText returns string value reported by battery) -HARDWARE_VERSION = 1 # value returned by getValue (getText returns string value reported by battery) - CONNECTION = 'Modbus RTU' -PRODUCT_NAME = 'FZS 48TL200' +PRODUCT_NAME = 'FIAMM 48TL Series Battery' PRODUCT_ID = 0xB012 # assigned by victron DEVICE_INSTANCE = 1 SERVICE_NAME_PREFIX = 'com.victronenergy.battery.' @@ -15,17 +13,26 @@ SERVICE_NAME_PREFIX = 'com.victronenergy.battery.' # driver configuration -SOFTWARE_VERSION = '3.0.3' +SOFTWARE_VERSION = '3.0.0' UPDATE_INTERVAL = 2000 # milliseconds -#LOG_LEVEL = logging.INFO -LOG_LEVEL = logging.DEBUG +LOG_LEVEL = logging.INFO +#LOG_LEVEL = logging.DEBUG + + +# battery config + +V_MAX = 54.2 +V_MIN = 42 +R_STRING_MIN = 0.125 +R_STRING_MAX = 0.250 +I_MAX_PER_STRING = 15 +AH_PER_STRING = 40 # modbus configuration BASE_ADDRESS = 999 -#NO_OF_REGISTERS = 63 -NO_OF_REGISTERS = 64 -MAX_SLAVE_ADDRESS = 10 +NO_OF_REGISTERS = 56 +MAX_SLAVE_ADDRESS = 25 # RS 485 configuration @@ -37,15 +44,11 @@ BYTE_SIZE = 8 STOP_BITS = 1 MODE = 'rtu' +# InnovEnergy IOT configuration -# battery configuration - -MAX_CHARGE_VOLTAGE = 58 -I_MAX_PER_STRING = 15 -NUM_OF_STRING_PER_BATTERY = 5 -AH_PER_STRING = 40 -V_MAX = 54.2 -R_STRING_MIN = 0.125 -R_STRING_MAX = 0.250 +INSTALLATION_NAME = read_file_one_line('/data/innovenergy/openvpn/installation-name') +INNOVENERGY_SERVER_IP = '10.2.0.1' +INNOVENERGY_SERVER_PORT = 8134 +INNOVENERGY_PROTOCOL_VERSION = '48TL200V3' diff --git a/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/config.pyc b/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/config.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0381e9f5d19f819d26d96d3dfcf98907a992a42a GIT binary patch literal 1246 zcmZuw&2HO95dLUcvgJzgUtGsd+9)@pfhFbVU=&3iT3oqADN-OQHQviY(b57Fnl!|< z0r%RcNS~s&qPL=lo^$RC^a1(+?JQ{}{acB%GvCb4&NsVT`J=hk{INfs;&v?2{DQvx zHxiQm1`>e3*9~x^z?YCL;i3Xwfgx#HhFk`(LRP_RkTviX$QAHa$W`zDIdPsOit0v^&1P{r zQ_H05t$doHbjy04>#|;Gd#-AbIrKei)C+}c4p`w|0JfzxIg5?$9uu}3gr?hLYMZct z`30!gh@sE=_Di*)ajzeKWBN>tnIGs4bb`^)GDDppq*bOl_Rg*yTtG^?f=!qFHVOo~Yf}kkO^@P_K zK0CDoDlJf(6r?i+jye7isarNQeLFl8o@EtnF3qCNp*>*UC@i>~m?KO0#I>}}h;(4{ z(h5RvC{FA!DCiG7ixt}yU3DB&pGJ8CJG7ncy55+%%s)L7y4A$Y9;)5{_Y6HhR1f~; zqcaS>p64tMLSImP5P648x^SxVk4MnaZ|U&-+dNC->6^pnM=I$|v-CWkwJ&d!zJ*_0 oWb!JBzAPTn=L9s2hOx0+Gj4xXJ=bgRZKGEDs`W(#A&o-+3l&%u2mk;8 literal 0 HcmV?d00001 diff --git a/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/convert.py b/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/convert.py new file mode 100644 index 000000000..dbc3af66b --- /dev/null +++ b/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/convert.py @@ -0,0 +1,160 @@ +import struct + +import config as cfg +from data import LedState, BatteryStatus + +# trick the pycharm type-checker into thinking Callable is in scope, not used at runtime +# noinspection PyUnreachableCode +if False: + from typing import Callable, List, Iterable, Union, AnyStr, Any + + +def read_bool(base_register, bit): + # type: (int, int) -> Callable[[BatteryStatus], bool] + + # TODO: explain base register offset + register = base_register + int(bit/16) + bit = bit % 16 + + def get_value(status): + # type: (BatteryStatus) -> bool + value = status.modbus_data[register - cfg.BASE_ADDRESS] + return value & (1 << bit) > 0 + + return get_value + + +def read_float(register, scale_factor=1.0, offset=0.0): + # type: (int, float, float) -> Callable[[BatteryStatus], float] + + def get_value(status): + # type: (BatteryStatus) -> float + value = status.modbus_data[register - cfg.BASE_ADDRESS] + + if value >= 0x8000: # convert to signed int16 + value -= 0x10000 # fiamm stores their integers signed AND with sign-offset @#%^&! + + return (value + offset) * scale_factor + + return get_value + + +def read_registers(register, count): + # type: (int, int) -> Callable[[BatteryStatus], List[int]] + + start = register - cfg.BASE_ADDRESS + end = start + count + + def get_value(status): + # type: (BatteryStatus) -> List[int] + return [x for x in status.modbus_data[start:end]] + + return get_value + + +def comma_separated(values): + # type: (Iterable[str]) -> str + return ", ".join(set(values)) + + +def count_bits(base_register, nb_of_registers, nb_of_bits, first_bit=0): + # type: (int, int, int, int) -> Callable[[BatteryStatus], int] + + get_registers = read_registers(base_register, nb_of_registers) + end_bit = first_bit + nb_of_bits + + def get_value(status): + # type: (BatteryStatus) -> int + + registers = get_registers(status) + bin_registers = [bin(x)[-1:1:-1] for x in registers] # reverse the bits in each register so that bit0 is to the left + str_registers = [str(x).ljust(16, "0") for x in bin_registers] # add leading zeroes, so all registers are 16 chars long + bit_string = ''.join(str_registers) # join them, one long string of 0s and 1s + filtered_bits = bit_string[first_bit:end_bit] # take the first nb_of_bits bits starting at first_bit + + return filtered_bits.count('1') # count 1s + + return get_value + + +def read_led_state(register, led): + # type: (int, int) -> Callable[[BatteryStatus], int] + + read_lo = read_bool(register, led * 2) + read_hi = read_bool(register, led * 2 + 1) + + def get_value(status): + # type: (BatteryStatus) -> int + + lo = read_lo(status) + hi = read_hi(status) + + if hi: + if lo: + return LedState.blinking_fast + else: + return LedState.blinking_slow + else: + if lo: + return LedState.on + else: + return LedState.off + + return get_value + + +# noinspection PyShadowingNames +def unit(unit): + # type: (unicode) -> Callable[[unicode], unicode] + + def get_text(v): + # type: (unicode) -> unicode + return "{0}{1}".format(str(v), unit) + + return get_text + + +def const(constant): + # type: (any) -> Callable[[any], any] + def get(*args): + return constant + return get + + +def mean(numbers): + # type: (List[Union[float,int]]) -> float + return float(sum(numbers)) / len(numbers) + + +def first(ts, default=None): + return next((t for t in ts), default) + + +def bitfields_to_str(lists): + # type: (List[List[int]]) -> str + + def or_lists(): + # type: () -> Iterable[int] + + length = len(first(lists)) + n_lists = len(lists) + + for i in range(0, length): + e = 0 + for l in range(0, n_lists): + e = e | lists[l][i] + yield e + + hexed = [ + '{0:0>4X}'.format(x) + for x in or_lists() + ] + + return ' '.join(hexed) + + +def pack_string(string): + # type: (AnyStr) -> Any + data = string.encode('UTF-8') + return struct.pack('B', len(data)) + data + diff --git a/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/convert.pyc b/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/convert.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0baf6194738046af8dfb9d55e939abc9bc7b2d9a GIT binary patch literal 5476 zcmbtY>uwv@5uROAlqgZACF^1(K$2nK0d`iu!Q*YBoS$kX;0d|@_k7vGN?+sDuXF$Pl*@RB#-o7MUrV5%t(7i26buI zWiTu4SsBbpdrk%oX*XmrFYS5pQV6cfD`>bR;gp0m38&?iFYTs;Gs?d#VO@y@31=mo zlUFcdQNo5YuShtr#FB)UlvtLqsl*Cx4=?Nfs}e3Kb4|iUCEnrP-SsOtW&9ofwbp%* zb_UC5QMhXZ8`*hWYzNjx`ExRc#d@vW^Dsz~U_Xg$l@G*))hB<0t;(GO_scZSQp+bE zq|%Gbe@ zVhhV=c4Rl7#a)|cX_Q8J|M@0WZuI_8WNF+z+_-hyCY#+XeHP{R#?fLT+fcp@YpV7Uvwo!0=Sgql|Ob>lKkT^q8Wd=mtsD zK@G9l1tP0ac@Hw3`}`%p;m!LlO!SuOGfSix_H#j`4;_yt>6XbN$x~}2dr219cX3rH zxGKx_anhDKR&3z5OWFfZt} zYR`p)&zMy%SFucFfTeJaMwz_DPbrHamC8JmtEySS^V6D#_!RUg(g#%!et}C-N%1#I zB0b9W_noik|AP#rg3kiau6z*RT3QN+JX}s_K8s8@8w`R@5gi3N`bqdJ3Uls^DY#1; z=sudDX8a5U+5ikkw!ZY`t*@~1(GLD=iKxm63-}qbrXhf5P-OiT#2bK5-2gZdWuENp z{fG^OYJ55e?m{EL`fWwl2)8RNJ=|Nt-uHAbe5rfUL_*Z3DsAJ|dvaQ3-#$RC0@IVz zDLI*<%|!8OO-^cZfE_g#1zOkAb{jKl+PM_JTd+n$CUSF~9?_`mm(fA_Xj=_I=#hQ5N-Vi5~5)bMLw&71aT@jX3467M;~w0zUlBnr+a-VlxSLiPI{1df1m#as0k7c_*_#g77oaeOV()0)HyNIUBJ@>WJ& zBhEAjb`B7lGVTaEP*j$C7Qz=>r!Q`vI*0SRm*s=Nnh!y`icgWx97&7~)A#~iQ-1}p zBG~BIrVv+lPmrU5iV0&r;id94xyhR-84aI2G`ieqICITPw4l6Cnz!+2LYDimGOO{KwaJTj(9TnXSF&yZ35~a>X%;|JE*pKoH z4->R@5Cti$C?TbFwoDy0oZ*AvNQqZk`*vWt8zauAP>GF#qL#5h=HA>W*S_+eqP_nh z`g}qQ*NrW0)-K+Y2fg4Fd8dz`d&ful-9OU~s;HgA8E#pZv#Pw%`WQyNV3=G~yNeoI z_@7G6;wcK~WPTXi;sKT))S|w2tCxbQXqi(HdKPMr8;m#%t#NKb*Ft;2=mh8Qu2WpA zi$%vgBJk(<6!g7=*qd@hJynjoMBO`X(d7swapyzhC#n$xRz;3KD(~rxxU+YaQy5g@ zX-r{juxM=?`=0(*9)pXR-jK%{R64Vzqo->CJGeHV(HNSR2WdZY(-$ixaNM^~)bnX4 z!SD7$qaW)U>6$p8^I_dEIVQAlX1UXYb4bAsB9%q7uobkh75vxk@nY-at-H5=f2#W3 zC~rQ-P8|!?-)5JWUvSYukk&nkj-ybmQ;T)WWL4xcq+z`3#ZeL#9h-4>{1&`&2AZ#U zKdva8=xoMcbMqq*2qo}>m;xFIF;2j78k0DNXJsPLAXZ1e&I=m;F$= zDN4Ip7%2(u!>-l0P)9-c&@iHB&2BW;(h9!AaSp)6gcX#dHnoiA<-bu7WsBeR)^#k$ zdqPpWP-uH`-@Q!O15+m`!#b-_dlV%2$wide=SLW)44q||c!mNEk8XI|u!tItEQYm8 z$6&*^1ZI;9UxH{4G|X4?2#flng||rxZ1b4>ud$pRUa85VKLbH`@K$V?M0a_Z;(aU) gys22J*1VgQdb8QA&)26KOZ9i_v-N3E)%xnc0j$v?;Q#;t literal 0 HcmV?d00001 diff --git a/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/data.py b/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/data.py new file mode 100644 index 000000000..b860d860c --- /dev/null +++ b/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/data.py @@ -0,0 +1,125 @@ +import config as cfg + + +# trick the pycharm type-checker into thinking Callable is in scope, not used at runtime +# noinspection PyUnreachableCode +if False: + from typing import Callable, List, Optional, AnyStr, Union, Any + + +class LedState(object): + """ + from page 6 of the '48TLxxx ModBus Protocol doc' + """ + off = 0 + on = 1 + blinking_slow = 2 + blinking_fast = 3 + + +class LedColor(object): + green = 0 + amber = 1 + blue = 2 + red = 3 + + +class ServiceSignal(object): + + def __init__(self, dbus_path, get_value_or_const, unit=''): + # type: (str, Union[Callable[[],Any],Any], Optional[AnyStr] )->None + + self.get_value_or_const = get_value_or_const + self.dbus_path = dbus_path + self.unit = unit + + @property + def value(self): + try: + return self.get_value_or_const() # callable + except: + return self.get_value_or_const # value + + +class BatterySignal(object): + + def __init__(self, dbus_path, aggregate, get_value, unit=''): + # type: (str, Callable[[List[any]],any], Callable[[BatteryStatus],any], Optional[AnyStr] )->None + """ + A Signal holds all information necessary for the handling of a + certain datum (e.g. voltage) published by the battery. + + :param dbus_path: str + object_path on DBus where the datum needs to be published + + :param aggregate: Iterable[any] -> any + function that combines the values of multiple batteries into one. + e.g. sum for currents, or mean for voltages + + :param get_value: (BatteryStatus) -> any + function to extract the datum from the modbus record, + """ + + self.dbus_path = dbus_path + self.aggregate = aggregate + self.get_value = get_value + self.unit = unit + + +class Battery(object): + + """ Data record to hold hardware and firmware specs of the battery """ + + def __init__(self, slave_address, hardware_version, firmware_version, bms_version, ampere_hours): + # type: (int, str, str, str, int) -> None + self.slave_address = slave_address + self.hardware_version = hardware_version + self.firmware_version = firmware_version + self.bms_version = bms_version + self.ampere_hours = ampere_hours + self.n_strings = int(ampere_hours/cfg.AH_PER_STRING) + self.i_max = self.n_strings * cfg.I_MAX_PER_STRING + self.v_min = cfg.V_MIN + self.v_max = cfg.V_MAX + self.r_int_min = cfg.R_STRING_MIN / self.n_strings + self.r_int_max = cfg.R_STRING_MAX / self.n_strings + + def __str__(self): + return 'slave address = {0}\nhardware version = {1}\nfirmware version = {2}\nbms version = {3}\nampere hours = {4}'.format( + self.slave_address, self.hardware_version, self.firmware_version, self.bms_version, str(self.ampere_hours)) + + +class BatteryStatus(object): + """ + record holding the current status of a battery + """ + def __init__(self, battery, modbus_data): + # type: (Battery, List[int]) -> None + + self.battery = battery + self.modbus_data = modbus_data + + def serialize(self): + # type: () -> str + + b = self.battery + + s = cfg.INNOVENERGY_PROTOCOL_VERSION + '\n' + s += cfg.INSTALLATION_NAME + '\n' + s += str(b.slave_address) + '\n' + s += b.hardware_version + '\n' + s += b.firmware_version + '\n' + s += b.bms_version + '\n' + s += str(b.ampere_hours) + '\n' + + for d in self.modbus_data: + s += str(d) + '\n' + + return s + + +def read_file_one_line(file_name): + + with open(file_name, 'r') as file: + return file.read().replace('\n', '').replace('\r', '').strip() + diff --git a/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/data.pyc b/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/data.pyc new file mode 100644 index 0000000000000000000000000000000000000000..138d71341eb562a6ee1d52530eb7bea11ad0304f GIT binary patch literal 4923 zcmbtY-E!N;6<&Z6B|ty6>{v?Dq}?WM!pzuGld6fw)4GvmCDn{fxu9x0Y%?ebEJ-N% zVX;eDOsy;XzB9e*P2ZxA(#ebT0ov~zkRUBPnOYXL%iV+hJ?A^$IbiKSEADUq*$qN5 z{;T2pa}@n=R1y9ykqFVYgtA4k%Mx28HIdGV_MAxPMSEVPb0%{a5s@>Ix|MWQL`xItawWYa zqLqnswUS;I(Ix7%*XS~>#${YA{xANTjXIiU5!G&xBta)pW)7W$SR0le4osY9L1Jj! zPBvzsYwoON9*F7|2rRgjA;r7j=gVWPfc`uLd47I#poEiIQ-_u_Dz#)MS%%6 z2P2OZOGnaF)oXRD{7iJZnO|s-ml|p-Zba9U?&j#%kN@d&%(vB(^ z1)XH5SSN*wrg!Al1unXZt=>SRD;a_D^FA8YT>+kFz>h5y zLkOULitZeNhpcB%L`WB>LQCwT=%1i^Vv8p*H5wK-P}jHtMB)q$0#37B z8u0VN5AzHT;Xq85^ap|IvxbIQY*@|Q(<lox+qiO@yRBf-Wu`z68?BVz$-5&6#Eo9MpQImv5TRX;<6 z%`5DhwQAKYcIYY6ytgobuQe$00Z=yb-hOWLi(>04R{0TaPFAnm%M0wOcLHNnG5S7S z5g1>@6@Wyr@#twtH=|Mki4Hi%Plc!%AU&C5L;;#avouS82W`8Kvm?u6$bOzgT7qn4 zoOSae4TxZ6rb4B4P>dvGOm_Vsi@-fSBEJ9&giu!yXA-@J$Z3@VpymPEV!)TT`!(HOk$9+{OUZUJ6Qwqm5 zx$LOvE;FkJJupWPynjpXL)jET{upGVujP%~65q5d1C#jUGk0R*S@9=lE{r@Y z`Q@2gni+lqGt=DdvohBuA1LFBC(%5oJq7}dU22gNf!7ZIWd@B!eg7d{mSV6#8hbwY zlaX2Z-mlP_n((4*L`mHq3a3SNyKXzH&xL&^`q$y5Pq4V_l!VWOMB$i7XB>YJM=6$Y zgq{$Q>x9HWREQ)QJA|_rnJAhjoivikbj)Uk{JM-cKD{TDY)*#qKBMX;s;T}i=mLMn zBBia6QF1;>hNHrV{udeqbs^3yVSs#oaoacp=xy$ElC$yISb)R_W9A9`aFdCcWcBlc zh4X^NSphO>n&r%{boz5XiYxAZ{kAxR!{G!NR+}C3m%odLke69kQxmk^2I;X>*#~Hu zcTnv&n}-kfntR@tU-|dF!=uC9!vp`pp4ZwxY??J5&^p>VIM_LYz;Eu{+w-<*6-m`g zsHijssf{TMngS(rt+}3gb9!|{F)?aY#6c2&tC&idv}%sMVy#&lDD>H|FI#Wg-|ug? zai%F=F6wWeVwFFkl>UY{Rj1CdA@o)}c^4hS$N>zV+Tw3pgdegfx_}cLW%|m6w}_12y$TgX>_UYaBtfV+7*SLka2n2v z?8bQGr(Xeh2KA;&xqxlxEs?hMd0ix`KJs-ng0yri`-;_|G5p&J-XObi&tn+U)xHQ4 zt@w!<4ZtfNWWr-YCVhG}su)!?ng^EYI{#qc(aW?)>4Qg@_J|5SvXA!#s_CsRXli~% h`*ryf$!$85rh6>U*R79h>+br(`r7(i>l^Fu{twr04rl-X literal 0 HcmV?d00001 diff --git a/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/dbus-fzsonick-48tl.py b/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/dbus-fzsonick-48tl.py new file mode 100755 index 000000000..11266c5d0 --- /dev/null +++ b/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/dbus-fzsonick-48tl.py @@ -0,0 +1,354 @@ +#!/usr/bin/python2 -u +# coding=utf-8 + +import logging +import re +import socket +import sys +import gobject +import signals +import config as cfg + +from dbus.mainloop.glib import DBusGMainLoop +from pymodbus.client.sync import ModbusSerialClient as Modbus +from pymodbus.exceptions import ModbusException, ModbusIOException +from pymodbus.other_message import ReportSlaveIdRequest +from pymodbus.pdu import ExceptionResponse +from pymodbus.register_read_message import ReadInputRegistersResponse +from data import BatteryStatus, BatterySignal, Battery, ServiceSignal +from python_libs.ie_dbus.dbus_service import DBusService + +# trick the pycharm type-checker into thinking Callable is in scope, not used at runtime +# noinspection PyUnreachableCode +if False: + from typing import Callable, List, Iterable, NoReturn + + +RESET_REGISTER = 0x2087 + + +def init_modbus(tty): + # type: (str) -> Modbus + + logging.debug('initializing Modbus') + + return Modbus( + port='/dev/' + tty, + method=cfg.MODE, + baudrate=cfg.BAUD_RATE, + stopbits=cfg.STOP_BITS, + bytesize=cfg.BYTE_SIZE, + timeout=cfg.TIMEOUT, + parity=cfg.PARITY) + + +def init_udp_socket(): + # type: () -> socket + + s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + s.setblocking(False) + + return s + + +def report_slave_id(modbus, slave_address): + # type: (Modbus, int) -> str + + slave = str(slave_address) + + logging.debug('requesting slave id from node ' + slave) + + with modbus: + + request = ReportSlaveIdRequest(unit=slave_address) + response = modbus.execute(request) + + if response is ExceptionResponse or issubclass(type(response), ModbusException): + raise Exception('failed to get slave id from ' + slave + ' : ' + str(response)) + + return response.identifier + + +def identify_battery(modbus, slave_address): + # type: (Modbus, int) -> Battery + + logging.info('identifying battery...') + + hardware_version, bms_version, ampere_hours = parse_slave_id(modbus, slave_address) + firmware_version = read_firmware_version(modbus, slave_address) + + specs = Battery( + slave_address=slave_address, + hardware_version=hardware_version, + firmware_version=firmware_version, + bms_version=bms_version, + ampere_hours=ampere_hours) + + logging.info('battery identified:\n{0}'.format(str(specs))) + + return specs + + +def identify_batteries(modbus): + # type: (Modbus) -> List[Battery] + + def _identify_batteries(): + slave_address = 0 + n_missing = -255 + + while n_missing < 3: + slave_address += 1 + try: + yield identify_battery(modbus, slave_address) + n_missing = 0 + except Exception as e: + logging.info('failed to identify battery at {0} : {1}'.format(str(slave_address), str(e))) + n_missing += 1 + + logging.info('giving up searching for further batteries') + + batteries = list(_identify_batteries()) # dont be lazy! + + n = len(batteries) + logging.info('found ' + str(n) + (' battery' if n == 1 else ' batteries')) + + return batteries + + +def parse_slave_id(modbus, slave_address): + # type: (Modbus, int) -> (str, str, int) + + slave_id = report_slave_id(modbus, slave_address) + + sid = re.sub(r'[^\x20-\x7E]', '', slave_id) # remove weird special chars + + match = re.match('(?P48TL(?P[0-9]+)) *(?P.*)', sid) + + if match is None: + raise Exception('no known battery found') + + return match.group('hw').strip(), match.group('bms').strip(), int(match.group('ah').strip()) + + +def read_firmware_version(modbus, slave_address): + # type: (Modbus, int) -> str + + logging.debug('reading firmware version') + + with modbus: + + response = read_modbus_registers(modbus, slave_address, base_address=1054, count=1) + register = response.registers[0] + + return '{0:0>4X}'.format(register) + + +def read_modbus_registers(modbus, slave_address, base_address=cfg.BASE_ADDRESS, count=cfg.NO_OF_REGISTERS): + # type: (Modbus, int, int, int) -> ReadInputRegistersResponse + + logging.debug('requesting modbus registers {0}-{1}'.format(base_address, base_address + count)) + + return modbus.read_input_registers( + address=base_address, + count=count, + unit=slave_address) + + +def read_battery_status(modbus, battery): + # type: (Modbus, Battery) -> BatteryStatus + """ + Read the modbus registers containing the battery's status info. + """ + + logging.debug('reading battery status') + + with modbus: + data = read_modbus_registers(modbus, battery.slave_address) + return BatteryStatus(battery, data.registers) + + +def publish_values_on_dbus(service, battery_signals, battery_statuses): + # type: (DBusService, Iterable[BatterySignal], Iterable[BatteryStatus]) -> () + + publish_individuals(service, battery_signals, battery_statuses) + publish_aggregates(service, battery_signals, battery_statuses) + + +def publish_aggregates(service, signals, battery_statuses): + # type: (DBusService, Iterable[BatterySignal], Iterable[BatteryStatus]) -> () + + for s in signals: + if s.aggregate is None: + continue + values = [s.get_value(battery_status) for battery_status in battery_statuses] + value = s.aggregate(values) + service.own_properties.set(s.dbus_path, value, s.unit) + + +def publish_individuals(service, signals, battery_statuses): + # type: (DBusService, Iterable[BatterySignal], Iterable[BatteryStatus]) -> () + + for signal in signals: + for battery_status in battery_statuses: + address = battery_status.battery.slave_address + dbus_path = '/_Battery/' + str(address) + signal.dbus_path + value = signal.get_value(battery_status) + service.own_properties.set(dbus_path, value, signal.unit) + + +def publish_service_signals(service, signals): + # type: (DBusService, Iterable[ServiceSignal]) -> NoReturn + + for signal in signals: + service.own_properties.set(signal.dbus_path, signal.value, signal.unit) + + +def upload_status_to_innovenergy(sock, statuses): + # type: (socket, Iterable[BatteryStatus]) -> bool + + logging.debug('upload status') + + try: + for s in statuses: + sock.sendto(s.serialize(), (cfg.INNOVENERGY_SERVER_IP, cfg.INNOVENERGY_SERVER_PORT)) + except: + logging.debug('FAILED') + return False + else: + return True + + +def print_usage(): + print ('Usage: ' + __file__ + ' ') + print ('Example: ' + __file__ + ' ttyUSB0') + + +def parse_cmdline_args(argv): + # type: (List[str]) -> str + + if len(argv) == 0: + logging.info('missing command line argument for tty device') + print_usage() + sys.exit(1) + + return argv[0] + + +def reset_batteries(modbus, batteries): + # type: (Modbus, Iterable[Battery]) -> NoReturn + + logging.info('Resetting batteries...') + + for battery in batteries: + + result = modbus.write_registers(RESET_REGISTER, [1], unit=battery.slave_address) + + # expecting a ModbusIOException (timeout) + # BMS can no longer reply because it is already reset + success = isinstance(result, ModbusIOException) + + outcome = 'successfully' if success else 'FAILED to' + logging.info('Battery {0} {1} reset'.format(str(battery.slave_address), outcome)) + + logging.info('Shutting down fz-sonick driver') + exit(0) + + +alive = True # global alive flag, watchdog_task clears it, update_task sets it + + +def create_update_task(modbus, service, batteries): + # type: (Modbus, DBusService, Iterable[Battery]) -> Callable[[],bool] + """ + Creates an update task which runs the main update function + and resets the alive flag + """ + _socket = init_udp_socket() + _signals = signals.init_battery_signals() + + def update_task(): + # type: () -> bool + + global alive + + logging.debug('starting update cycle') + + if service.own_properties.get('/ResetBatteries').value == 1: + reset_batteries(modbus, batteries) + + statuses = [read_battery_status(modbus, battery) for battery in batteries] + + publish_values_on_dbus(service, _signals, statuses) + upload_status_to_innovenergy(_socket, statuses) + + logging.debug('finished update cycle\n') + + alive = True + + return True + + return update_task + + +def create_watchdog_task(main_loop): + # type: (DBusGMainLoop) -> Callable[[],bool] + """ + Creates a Watchdog task that monitors the alive flag. + The watchdog kills the main loop if the alive flag is not periodically reset by the update task. + Who watches the watchdog? + """ + def watchdog_task(): + # type: () -> bool + + global alive + + if alive: + logging.debug('watchdog_task: update_task is alive') + alive = False + return True + else: + logging.info('watchdog_task: killing main loop because update_task is no longer alive') + main_loop.quit() + return False + + return watchdog_task + + +def main(argv): + # type: (List[str]) -> () + + logging.basicConfig(level=cfg.LOG_LEVEL) + logging.info('starting ' + __file__) + + tty = parse_cmdline_args(argv) + modbus = init_modbus(tty) + + batteries = identify_batteries(modbus) + + if len(batteries) <= 0: + sys.exit(2) + + service = DBusService(service_name=cfg.SERVICE_NAME_PREFIX + tty) + + service.own_properties.set('/ResetBatteries', value=False, writable=True) # initial value = False + + main_loop = gobject.MainLoop() + + service_signals = signals.init_service_signals(batteries) + publish_service_signals(service, service_signals) + + update_task = create_update_task(modbus, service, batteries) + update_task() # run it right away, so that all props are initialized before anyone can ask + watchdog_task = create_watchdog_task(main_loop) + + gobject.timeout_add(cfg.UPDATE_INTERVAL * 2, watchdog_task, priority = gobject.PRIORITY_LOW) # add watchdog first + gobject.timeout_add(cfg.UPDATE_INTERVAL, update_task, priority = gobject.PRIORITY_LOW) # call update once every update_interval + + logging.info('starting gobject.MainLoop') + main_loop.run() + logging.info('gobject.MainLoop was shut down') + + sys.exit(0xFF) # reaches this only on error + + +main(sys.argv[1:]) diff --git a/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/dbus-fzsonick-48tl.pyc b/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/dbus-fzsonick-48tl.pyc new file mode 100644 index 0000000000000000000000000000000000000000..095ea01bc889137be28d79ebf402b4557169c6c3 GIT binary patch literal 19070 zcmds9TWlQHc|NmCQrZOzT>WyvF3wkTWV(z0UNiXw+1DVcyoDzmg?)0g$^&Tu)@ z?9OV=EJeyvQba+m6bSmz21r_@Nt-lH+O#N8pg>>y*q6TcsX(6Eq6yHV=vz_u`~EXK zyVNCpUs7{;&Y5%l&woGvDF0t0#iJ*u+?q;%hVb{Rc=Y+4QXc+UDpYDU%Uf#I>eT1d zYOa&dtJQobKcH3zJNY5Cx=Zpo74BAzf?6#oi{s{1SX7NYYIWF@2UIws8hh31UQ-@a z;izitQ>*(-c}Ru(RpWqKJz&baRCrJ|#?JihTpu*==+v(%p1ykPBQ0|Kd3go zB<0=-br;kr{XtqK8k?P9D(x!;3d1XRC)4cAW-lHewHRJWRvHRIKJyGHe2n) z@#}$3{8&4_ZbeP)n>Gi~=6d8++q&$>fg8?+f!|EbyD{nCisGakx|{x@=lFNpzE0nc zW<3|SYJMvTqNeG#A1|`1owJSL)%@kQzIxpan%APJH93Hqgw>bb1gqOFCvMW#3F)C6 z)SGUY?CQQub|Zhy_vWH7ip^xKSwu&-8m2qqh%Gl+4+I8zl>DtE8OGmDKMbms)^@Vq zSt=*K>CcbB#h`jHr0(PGu(~~< z;_s!EAck=O3NNsNaWnz816tl*nGN%dsz+cN`=nSP{-fQ)T#juHsH7+jgh04q0B-byVguy`F!f*Rh^n z#|g!>*9$$pZ0WT}Qm_ud4?N^W($qth0~;Y6PCn7*FZDEd^JxuwA%Fg94c_V*;q9k2xX{z!%N=L{EzN0O?9_lR4|giR z(o;F!sl3!vInk+nC#}3c)T#MuPqUo557A=~a+cI_AJo}PIOf&mXTO?L$q}L5=QOn>NW(xRk9}sOsZIzwGI2U*Q3zWHkg?m zG}ofI;gV6?O~2-A?Z(?S>g;6Qx7XdK7Y5C`9j)1Ju~75l1U%aIz>XXCq(5Dswl||N zaqIqRyVb6SfnN7LySgo%tA=?`7mEcm?Ia~ig>3kY?bhqDUw0G#j9vGW%BCB((`*9H zY=6bpNqibTvo04{Q!Ess>V{uSWE2}~rr@yeuKTesbDEVkeIMIPBD?B$mxaNyNiWzP z@$jJ;?_+!Fl5Mh>W3An+2}F{0H?eC`qZ%}Q3Pi2!;g2YF|q-% z*sUc!5Lk<&h7=nj#_iazMX`4V{UAL3xQPRY;M=}nyVzb+CvG!IS3&S&5e61Ad%GFb zBF}&J^w^r`$0=3-0vzHDu*vrfGVqLk^UTG<3Sf(sY(f_yDt1ml+ih)5R=W)xrW@lA z6&ArhTi4vsudHG3Q4H9wt!Y0wjdRwv=j&P=RIvcyD-X_#YV8Kjz&^Ed?yZ$;TU%Q; zR2*W@jW|l8S`^xjzd3z=`t?)5r=YfO*W6~Y01R4-+Rbd362?JIhz%DDx&Ydm+4^ke z!pym?2cn1osYRm-{sj~#3P$f5>z|GN)zx3#`_?<6%b4{B7()gBisr$8{L>d-)Tp8G zfkL4U;?dOD5~Us~p=yiro8)b&F+63_cv9UCV<_ODQG%!~;b5USO~QOIYl)%wRZ?V> z#Yshqhm&Zf^gkjgHJV8YkS=Zd&9?3kc3f=-U>l`3->$l6t22ISrql@HIEuAtSCaRo zq|utHL#L{h?nd$L67UZA;GSP!n`-(|b82&~wRvu8)1LxgX>U!{n{D5%1|`z@)Y?5A z0oiU(oqH<@OJ}ENre~(&nNrXIgDC;|OVGxW7zEbz@GTs+wjs=-nGeMZ~M&_nd| z&whV3_WkB>YB1ZV;y_<{e1yd)T?~!f^4%b*t)P?v$ATC=#$UvC#baCPG+H* zZ2J1tGaD{8MZkww+@@(OtV^GHW(QKvb>G#X0t(34Fa&*h0fD8DKeN|td&}`dcUzx$ zW)sJ6M2XLR`vEECH;neKk4EuwGZ3jI6neehNJ@~+)Jc~h^)s-YM%hy(BuP(^2R~DV?JBH<4Xg1$lIVnKm8=SEm zNr%VE7yyhMURFs)+^l3)fWW6^aHYhHi6ZKR|{7^#70E2zSP0E z@c>9x(c;0=FL9$ckf>t^a>uRXxdZt^zF-Yo&*e{AC#(~>H!b`kf6_XXJ7vjl4)xvN z+yU#5{2s6-298=sIYw@xtJ4uj<~Yj=5(o*S&_QRm61aWvFHiA04!<0*l5RRr9(gyCcf@J8U+f|+D(C{rNKQK%f@vobU;6;Cia&+f3qay4Etq0 z@&x6pZrg+U;Y&d$QHvtLyxC5C9o+N9(U}AdKWZn^8x~NIY|G5@E{y7R5+&#G{A#-{ zt;`CX)2NhXTwk7F5R$t*``&!TnO!lZ^2+j!%H_qCvU&Hx%0i{QxVj(%uPk0)SblFs zhPyHAEUtWDGz=1Of)(J8(Q*3{TS?P`t;T--I*OWnMde3wLsro$WWP1iE;%Y6K{p4P zr=XibGGg3AWj)Asn!tSojNB4e&iuy*#cMoB|1BL$xYM|EUfn{eEKczy5m7skO&lQF zk16Pcp{IE=7tuGLY)uc0o}{F8NPy1QxL_`yV;Q6&PL~%PVXzb+l^f2&mBsgkw+UP_ zzl^NQ`G7-^Z>H2O!?BIvkE!f)l%WjFK=U1ff-DaRV;#Z{T&Ciah6Gh?WVZLG zTD~Vnefd^%x3VnWT9w~tB4oEDrl&*2RY1E0Be+YCfN!4zmv&?lZ&xzQ@efgrRT5F?eN!a|el$<8U!{&HwO7*_#{6;aVP<+L0eX#a9e=OlLbb3D$=+$O;( z!p!wN@z;u!$ry*@vyo^%pCZ=_wk zMIb&bFoBIhC?Q}E?6IU@K>7ry&u&z0UaJc8hJ&=?>Wb&Dx$s{>?g?J#0*2AfR~G4 zFdK;PaSHi+ZQ=Bg>u@~+%wRuk3~fL(Q5+~`J}!<26mD1{IdAWVJf&O(_)&vbAR#CP z@$bk*EP7#N=&$3PR^D@-Z(6+cMR{Y7D&GRfArs_9p0bQU;i{L!7>~`}J(X6?+k89l zY`HpU(%~Lvk0q^0)k2 z8WV_|_(uzCoi5xIZJ(!fiS^#sBTdC2HGAXFb<1reWgb&D` zDque`d+pBLI>GB!C9az?nz;90pAf2 zLDW@)h*e03-bLO9^yihUNLQp53gt-({3UV31O^ATiMpvXetLS^*+v70OLgX%yvT%p zT+xKnc0lqJf4mFD&t@Koy)XDGn8zDYW5c_#_A^K&G|$Cj@wfxP;i{ZTCd7O*+!l-7 z)np5ibs1D_`L%v`)zXR5IjPh`vi%RJlOv=pH34L!1T?>e-1A0BCY#_x1|ZBQ)z>VE zgaI2gIA;`Q(IJ*-p6wb95>&pQj{vhz*UI&CJx zX=$PM;2;4fEHGt$6*C?YQq)mnJU9dq5w|~GPSn)lffHii?mFmx$^D9LCYD*=I$(`j z#+afsLJ&h@)KZ~gU|y>0h;GliepE}vYx*Rt{+Zh)R8)SnAo756mJgY%{st1#Vn+n@ zYCY6$Ko}4Qh{J&@1Xd5`FHQ}k;DAn`;KW}e!b2kL&|E-lP;a3+L5o3N1Odc$T142A zP~ciVlL6>+HDe7pM}UP0cgu9_Ofd#( zWr{Hc`I4SMNb50EjI9fLwHoqNAWyAVH{ za|aE&x`a_yE1jqjE!u8YG7SALdKfR8FeFhbKyk{UbnSB-`7LbmfAC0L1{H?9Rm>f= zMsoY}HDbsPEO{Fh8I~Xh7l+S(d01aYLIY}KLsD&+5j9a@l**TdDwpJ1qQ@#S=VNCl zLQy>hK`kakiUM-_P79NpQxbVhpQ;>RGKQS!jR7OByGQ-_k^UZg5Rv-)NPiz&9DyvA zn^BcNmMe(%Cq$peJ07VJ{W3DyaZ22YussDS2Q|h_MZcff`Ua4jL!UAXl2c zbfR+t&C!bm2PD2TL@temXB-;C97+F-981lHQyLM745zYbAt1z0ghq!^bZiULWXZ^f zE+&xb9q!!N1k_QT?=lhM=BkW9Any??1c8iheRn2C%CplS+t5za_Y_)!{)&Wa0dv>lZpl2 zqL@<`@9audcFe1m1VfCUow|4yG3sDAW!z<-BIi_)7|AU-;cMq5R+HG}%EQEo_W23Y zNtQ+jnh0Kfnuo`8;=RX!?jnkXH>SG*%_dG*nu{xqQPyVs-Vot5T6V{P8L|}% z=P-8~Pu(*f0%IkV758djKXgcd-NXskly14UT?>6-Olx3Z5{=#arf77}E?@dS#&CYX zBt&BHn_7nGA=#>(PuYSfFQI1+FJJl`wTZL_a<6ByYIr2~Vs0P2zcsv+AKC_Uc*L1X zM+4&t;FG=jF4PMtz&VQoJp$xhOA;~so<=3eI8pytg8(YKUvhnEk<#nfLc~#0X%k>qc@9(#6fRS1WY&DL6S#x| zAP)8cwt%DHXL0!6#Q5Ni`Ughx5WT=MUQ7a!4)^oHGN@Mkbu11@Qj7UKUK z_zuEGz_M>6Ak2i3%O?`ac6w@}{0sSr1sD3w9=FVoxU@VHy=|P^{#K9%X>&gqa+lhx@*%Valq=3g{Uy2uXlfX1^^sVi#66%J zP%@1v*E1N%tg^yYUa;@95rs#blLhkD37@dkTz&(AFHU?0+Zzu4L-Z84f-JI&Yoa@H z6oXJ)t@B4rK4k}LG}(QYQ8>xe`yeou)%!ZLz0<=4xKUvO7mxuCl{a$LIXt?8*B}!UfNLb9 z1hJq>E{1`45+K1lU(w%iEk|#^P!l~notrjZB^2ZmL82r$CI&zyKD-rMe;j|{)1&gY zO)qd0GI+=g&NsW%ZA-;J;KwtFh(J_tssiGwY-4X{T--g6Qm@$9Cn>`7Ff^_)a6iot zs?`JB0Ui`rllYk)AU1eREL5x#rYiOTj}t!6N2u^2$z!cWl^j+Z%*KA;q6oiuu1JFxC!J&^&JH?8~tV1!$)9)Bb z#>T2htzL1&bxl-JfXz1}N7%GuVWyEl)3mS|P9!$Zs3dTfSPkws3Rdn&COLaGXD7vdZM!O#Yb3G?PDJ@?$2i zF*(cRT_(gebMGH9S7q|&O#YHd1BnF4rs34|;7drvdpG705RLB$RuJ$ydrdTTXo{0u zt@9HmR4t8qK+OO=9RdH+3=lMC@z2=eQzldvoGw2=sXrA1S}xQjzYS>USGmpnLBzNY zTf;g2P9e81H=3J(dlxBc$E}0HJ4bTjH>*@c6Rk|nqpR~BCOjc?x`HiaA8^HHh_cI+ zaTAls$tTBA(b_itn(2;<9u9VV35Bc7)pGWR1ULh>PVKV{OT zUFwV})^O*QiqNHzxOmma77Wk$B2c^?`j<#@@-YjDjK4x``>gagx6gui3Pd--zXL= 2 and a[0][0:1] == '0': + a[0] = a[0][1]; + + result = '' + for item in a: + result += ('.' if result != '' else '') + item + + + result = 'v' + result + + return result + + +def get_free_space(path): + result = -1 + + try: + s = statvfs(path) + result = s.f_frsize * s.f_bavail # Number of free bytes that ordinary users + except Exception, ex: + logger.info("Error while retrieving free space for path %s: %s" % (path, ex)) + + return result + + +def get_load_averages(): + c = read_file('/proc/loadavg') + return c.split(' ')[:3] + + +# Returns False if it cannot find a machine name. Otherwise returns the string +# containing the name +def get_machine_name(): + c = read_file('/proc/device-tree/model') + + if c != False: + return c.strip('\x00') + + return read_file('/etc/venus/machine') + + +# Returns False if it cannot open the file. Otherwise returns its rstripped contents +def read_file(path): + content = False + + try: + with open(path, 'r') as f: + content = f.read().rstrip() + except Exception, ex: + logger.debug("Error while reading %s: %s" % (path, ex)) + + return content + + +def wrap_dbus_value(value): + if value is None: + return VEDBUS_INVALID + if isinstance(value, float): + return dbus.Double(value, variant_level=1) + if isinstance(value, bool): + return dbus.Boolean(value, variant_level=1) + if isinstance(value, int): + return dbus.Int32(value, variant_level=1) + if isinstance(value, str): + return dbus.String(value, variant_level=1) + if isinstance(value, unicode): + return dbus.String(value, variant_level=1) + if isinstance(value, list): + if len(value) == 0: + # If the list is empty we cannot infer the type of the contents. So assume unsigned integer. + # A (signed) integer is dangerous, because an empty list of signed integers is used to encode + # an invalid value. + return dbus.Array([], signature=dbus.Signature('u'), variant_level=1) + return dbus.Array([wrap_dbus_value(x) for x in value], variant_level=1) + if isinstance(value, long): + return dbus.Int64(value, variant_level=1) + if isinstance(value, dict): + # Wrapping the keys of the dictionary causes D-Bus errors like: + # 'arguments to dbus_message_iter_open_container() were incorrect, + # assertion "(type == DBUS_TYPE_ARRAY && contained_signature && + # *contained_signature == DBUS_DICT_ENTRY_BEGIN_CHAR) || (contained_signature == NULL || + # _dbus_check_is_valid_signature (contained_signature))" failed in file ...' + return dbus.Dictionary({(k, wrap_dbus_value(v)) for k, v in value.items()}, variant_level=1) + return value + + +dbus_int_types = (dbus.Int32, dbus.UInt32, dbus.Byte, dbus.Int16, dbus.UInt16, dbus.UInt32, dbus.Int64, dbus.UInt64) + + +def unwrap_dbus_value(val): + """Converts D-Bus values back to the original type. For example if val is of type DBus.Double, + a float will be returned.""" + if isinstance(val, dbus_int_types): + return int(val) + if isinstance(val, dbus.Double): + return float(val) + if isinstance(val, dbus.Array): + v = [unwrap_dbus_value(x) for x in val] + return None if len(v) == 0 else v + if isinstance(val, (dbus.Signature, dbus.String)): + return unicode(val) + # Python has no byte type, so we convert to an integer. + if isinstance(val, dbus.Byte): + return int(val) + if isinstance(val, dbus.ByteArray): + return "".join([str(x) for x in val]) + if isinstance(val, (list, tuple)): + return [unwrap_dbus_value(x) for x in val] + if isinstance(val, (dbus.Dictionary, dict)): + # Do not unwrap the keys, see comment in wrap_dbus_value + return dict([(x, unwrap_dbus_value(y)) for x, y in val.items()]) + if isinstance(val, dbus.Boolean): + return bool(val) + return val + +class reify(object): + """ Decorator to replace a property of an object with the calculated value, + to make it concrete. """ + def __init__(self, wrapped): + self.wrapped = wrapped + update_wrapper(self, wrapped) + def __get__(self, inst, objtype=None): + if inst is None: + return self + v = self.wrapped(inst) + setattr(inst, self.wrapped.__name__, v) + return v diff --git a/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/ext/velib_python/ve_utils.pyc b/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/ext/velib_python/ve_utils.pyc new file mode 100644 index 0000000000000000000000000000000000000000..da3ba351b1d764a648930724a997a9fb0d88ba0d GIT binary patch literal 8991 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 use this to read data from the dbus, ie import +# VeDbusItemExport -> use this to export data to the dbus (one value) +# VeDbusService -> use that to create a service and export several values to the dbus + +# Code for VeDbusItemImport is copied from busitem.py and thereafter modified. +# All projects that used busitem.py need to migrate to this package. And some +# projects used to define there own equivalent of VeDbusItemExport. Better to +# use VeDbusItemExport, or even better the VeDbusService class that does it all for you. + +# TODOS +# 1 check for datatypes, it works now, but not sure if all is compliant with +# com.victronenergy.BusItem interface definition. See also the files in +# tests_and_examples. And see 'if type(v) == dbus.Byte:' on line 102. Perhaps +# something similar should also be done in VeDbusBusItemExport? +# 2 Shouldn't VeDbusBusItemExport inherit dbus.service.Object? +# 7 Make hard rules for services exporting data to the D-Bus, in order to make tracking +# changes possible. Does everybody first invalidate its data before leaving the bus? +# And what about before taking one object away from the bus, instead of taking the +# whole service offline? +# They should! And after taking one value away, do we need to know that someone left +# the bus? Or we just keep that value in invalidated for ever? Result is that we can't +# see the difference anymore between an invalidated value and a value that was first on +# the bus and later not anymore. See comments above VeDbusItemImport as well. +# 9 there are probably more todos in the code below. + +# Some thoughts with regards to the data types: +# +# Text from: http://dbus.freedesktop.org/doc/dbus-python/doc/tutorial.html#data-types +# --- +# Variants are represented by setting the variant_level keyword argument in the +# constructor of any D-Bus data type to a value greater than 0 (variant_level 1 +# means a variant containing some other data type, variant_level 2 means a variant +# containing a variant containing some other data type, and so on). If a non-variant +# is passed as an argument but introspection indicates that a variant is expected, +# it'll automatically be wrapped in a variant. +# --- +# +# Also the different dbus datatypes, such as dbus.Int32, and dbus.UInt32 are a subclass +# of Python int. dbus.String is a subclass of Python standard class unicode, etcetera +# +# So all together that explains why we don't need to explicitly convert back and forth +# between the dbus datatypes and the standard python datatypes. Note that all datatypes +# in python are objects. Even an int is an object. + +# The signature of a variant is 'v'. + +# Export ourselves as a D-Bus service. +class VeDbusService(object): + def __init__(self, servicename, bus=None): + # dict containing the VeDbusItemExport objects, with their path as the key. + self._dbusobjects = {} + self._dbusnodes = {} + + # dict containing the onchange callbacks, for each object. Object path is the key + self._onchangecallbacks = {} + + # Connect to session bus whenever present, else use the system bus + self._dbusconn = bus or (dbus.SessionBus() if 'DBUS_SESSION_BUS_ADDRESS' in os.environ else dbus.SystemBus()) + + # make the dbus connection available to outside, could make this a true property instead, but ach.. + self.dbusconn = self._dbusconn + + # Register ourselves on the dbus, trigger an error if already in use (do_not_queue) + self._dbusname = dbus.service.BusName(servicename, self._dbusconn, do_not_queue=True) + + # Add the root item that will return all items as a tree + self._dbusnodes['/'] = self._create_tree_export(self._dbusconn, '/', self._get_tree_dict) + + logging.info("registered ourselves on D-Bus as %s" % servicename) + + def _get_tree_dict(self, path, get_text=False): + logging.debug("_get_tree_dict called for %s" % path) + r = {} + px = path + if not px.endswith('/'): + px += '/' + for p, item in self._dbusobjects.items(): + if p.startswith(px): + v = item.GetText() if get_text else wrap_dbus_value(item.local_get_value()) + r[p[len(px):]] = v + logging.debug(r) + return r + + # To force immediate deregistering of this dbus service and all its object paths, explicitly + # call __del__(). + def __del__(self): + for node in self._dbusnodes.values(): + node.__del__() + self._dbusnodes.clear() + for item in self._dbusobjects.values(): + item.__del__() + self._dbusobjects.clear() + if self._dbusname: + self._dbusname.__del__() # Forces call to self._bus.release_name(self._name), see source code + self._dbusname = None + + # @param callbackonchange function that will be called when this value is changed. First parameter will + # be the path of the object, second the new value. This callback should return + # True to accept the change, False to reject it. + def add_path(self, path, value, description="", writeable=False, + onchangecallback=None, gettextcallback=None): + + if onchangecallback is not None: + self._onchangecallbacks[path] = onchangecallback + + item = VeDbusItemExport( + self._dbusconn, path, value, description, writeable, + self._value_changed, gettextcallback, deletecallback=self._item_deleted) + + spl = path.split('/') + for i in range(2, len(spl)): + subPath = '/'.join(spl[:i]) + if subPath not in self._dbusnodes and subPath not in self._dbusobjects: + self._dbusnodes[subPath] = self._create_tree_export(self._dbusconn, subPath, self._get_tree_dict) + self._dbusobjects[path] = item + logging.debug('added %s with start value %s. Writeable is %s' % (path, value, writeable)) + + # Add the mandatory paths, as per victron dbus api doc + def add_mandatory_paths(self, processname, processversion, connection, + deviceinstance, productid, productname, firmwareversion, hardwareversion, connected): + self.add_path('/Mgmt/ProcessName', processname) + self.add_path('/Mgmt/ProcessVersion', processversion) + self.add_path('/Mgmt/Connection', connection) + + # Create rest of the mandatory objects + self.add_path('/DeviceInstance', deviceinstance) + self.add_path('/ProductId', productid) + self.add_path('/ProductName', productname) + self.add_path('/FirmwareVersion', firmwareversion) + self.add_path('/HardwareVersion', hardwareversion) + self.add_path('/Connected', connected) + + def _create_tree_export(self, bus, objectPath, get_value_handler): + return VeDbusTreeExport(bus, objectPath, get_value_handler) + + # Callback function that is called from the VeDbusItemExport objects when a value changes. This function + # maps the change-request to the onchangecallback given to us for this specific path. + def _value_changed(self, path, newvalue): + if path not in self._onchangecallbacks: + return True + + return self._onchangecallbacks[path](path, newvalue) + + def _item_deleted(self, path): + self._dbusobjects.pop(path) + for np in self._dbusnodes.keys(): + if np != '/': + for ip in self._dbusobjects: + if ip.startswith(np + '/'): + break + else: + self._dbusnodes[np].__del__() + self._dbusnodes.pop(np) + + def __getitem__(self, path): + return self._dbusobjects[path].local_get_value() + + def __setitem__(self, path, newvalue): + self._dbusobjects[path].local_set_value(newvalue) + + def __delitem__(self, path): + self._dbusobjects[path].__del__() # Invalidates and then removes the object path + assert path not in self._dbusobjects + + def __contains__(self, path): + return path in self._dbusobjects + +""" +Importing basics: + - If when we power up, the D-Bus service does not exist, or it does exist and the path does not + yet exist, still subscribe to a signal: as soon as it comes online it will send a signal with its + initial value, which VeDbusItemImport will receive and use to update local cache. And, when set, + call the eventCallback. + - If when we power up, save it + - When using get_value, know that there is no difference between services (or object paths) that don't + exist and paths that are invalid (= empty array, see above). Both will return None. In case you do + really want to know ifa path exists or not, use the exists property. + - When a D-Bus service leaves the D-Bus, it will first invalidate all its values, and send signals + with that update, and only then leave the D-Bus. (or do we need to subscribe to the NameOwnerChanged- + signal!?!) To be discussed and make sure. Not really urgent, since all existing code that uses this + class already subscribes to the NameOwnerChanged signal, and subsequently removes instances of this + class. + +Read when using this class: +Note that when a service leaves that D-Bus without invalidating all its exported objects first, for +example because it is killed, VeDbusItemImport doesn't have a clue. So when using VeDbusItemImport, +make sure to also subscribe to the NamerOwnerChanged signal on bus-level. Or just use dbusmonitor, +because that takes care of all of that for you. +""" +class VeDbusItemImport(object): + ## Constructor + # @param bus the bus-object (SESSION or SYSTEM). + # @param serviceName the dbus-service-name (string), for example 'com.victronenergy.battery.ttyO1' + # @param path the object-path, for example '/Dc/V' + # @param eventCallback function that you want to be called on a value change + # @param createSignal only set this to False if you use this function to one time read a value. When + # leaving it to True, make sure to also subscribe to the NameOwnerChanged signal + # elsewhere. See also note some 15 lines up. + def __init__(self, bus, serviceName, path, eventCallback=None, createsignal=True): + # TODO: is it necessary to store _serviceName and _path? Isn't it + # stored in the bus_getobjectsomewhere? + self._serviceName = serviceName + self._path = path + self._match = None + # TODO: _proxy is being used in settingsdevice.py, make a getter for that + self._proxy = bus.get_object(serviceName, path, introspect=False) + self.eventCallback = eventCallback + + assert eventCallback is None or createsignal == True + if createsignal: + self._match = self._proxy.connect_to_signal( + "PropertiesChanged", weak_functor(self._properties_changed_handler)) + + # store the current value in _cachedvalue. When it doesn't exists set _cachedvalue to + # None, same as when a value is invalid + self._cachedvalue = None + try: + v = self._proxy.GetValue() + except dbus.exceptions.DBusException: + pass + else: + self._cachedvalue = unwrap_dbus_value(v) + + def __del__(self): + if self._match != None: + self._match.remove() + self._match = None + self._proxy = None + + def _refreshcachedvalue(self): + self._cachedvalue = unwrap_dbus_value(self._proxy.GetValue()) + + ## Returns the path as a string, for example '/AC/L1/V' + @property + def path(self): + return self._path + + ## Returns the dbus service name as a string, for example com.victronenergy.vebus.ttyO1 + @property + def serviceName(self): + return self._serviceName + + ## Returns the value of the dbus-item. + # the type will be a dbus variant, for example dbus.Int32(0, variant_level=1) + # this is not a property to keep the name consistant with the com.victronenergy.busitem interface + # returns None when the property is invalid + def get_value(self): + return self._cachedvalue + + ## Writes a new value to the dbus-item + def set_value(self, newvalue): + r = self._proxy.SetValue(wrap_dbus_value(newvalue)) + + # instead of just saving the value, go to the dbus and get it. So we have the right type etc. + if r == 0: + self._refreshcachedvalue() + + return r + + ## Returns the text representation of the value. + # For example when the value is an enum/int GetText might return the string + # belonging to that enum value. Another example, for a voltage, GetValue + # would return a float, 12.0Volt, and GetText could return 12 VDC. + # + # Note that this depends on how the dbus-producer has implemented this. + def get_text(self): + return self._proxy.GetText() + + ## Returns true of object path exists, and false if it doesn't + @property + def exists(self): + # TODO: do some real check instead of this crazy thing. + r = False + try: + r = self._proxy.GetValue() + r = True + except dbus.exceptions.DBusException: + pass + + return r + + ## callback for the trigger-event. + # @param eventCallback the event-callback-function. + @property + def eventCallback(self): + return self._eventCallback + + @eventCallback.setter + def eventCallback(self, eventCallback): + self._eventCallback = eventCallback + + ## Is called when the value of the imported bus-item changes. + # Stores the new value in our local cache, and calls the eventCallback, if set. + def _properties_changed_handler(self, changes): + if "Value" in changes: + changes['Value'] = unwrap_dbus_value(changes['Value']) + self._cachedvalue = changes['Value'] + if self._eventCallback: + # The reason behind this try/except is to prevent errors silently ending up the an error + # handler in the dbus code. + try: + self._eventCallback(self._serviceName, self._path, changes) + except: + traceback.print_exc() + os._exit(1) # sys.exit() is not used, since that also throws an exception + + +class VeDbusTreeExport(dbus.service.Object): + def __init__(self, bus, objectPath, get_value_handler): + dbus.service.Object.__init__(self, bus, objectPath) + self._get_value_handler = get_value_handler + logging.debug("VeDbusTreeExport %s has been created" % objectPath) + + def __del__(self): + # self._get_path() will raise an exception when retrieved after the call to .remove_from_connection, + # so we need a copy. + path = self._get_path() + if path is None: + return + self.remove_from_connection() + logging.debug("VeDbusTreeExport %s has been removed" % path) + + def _get_path(self): + if len(self._locations) == 0: + return None + return self._locations[0][1] + + @dbus.service.method('com.victronenergy.BusItem', out_signature='v') + def GetValue(self): + value = self._get_value_handler(self._get_path()) + return dbus.Dictionary(value, signature=dbus.Signature('sv'), variant_level=1) + + @dbus.service.method('com.victronenergy.BusItem', out_signature='v') + def GetText(self): + return self._get_value_handler(self._get_path(), True) + + def local_get_value(self): + return self._get_value_handler(self.path) + + +class VeDbusItemExport(dbus.service.Object): + ## Constructor of VeDbusItemExport + # + # Use this object to export (publish), values on the dbus + # Creates the dbus-object under the given dbus-service-name. + # @param bus The dbus object. + # @param objectPath The dbus-object-path. + # @param value Value to initialize ourselves with, defaults to None which means Invalid + # @param description String containing a description. Can be called over the dbus with GetDescription() + # @param writeable what would this do!? :). + # @param callback Function that will be called when someone else changes the value of this VeBusItem + # over the dbus. First parameter passed to callback will be our path, second the new + # value. This callback should return True to accept the change, False to reject it. + def __init__(self, bus, objectPath, value=None, description=None, writeable=False, + onchangecallback=None, gettextcallback=None, deletecallback=None): + dbus.service.Object.__init__(self, bus, objectPath) + self._onchangecallback = onchangecallback + self._gettextcallback = gettextcallback + self._value = value + self._description = description + self._writeable = writeable + self._deletecallback = deletecallback + + # To force immediate deregistering of this dbus object, explicitly call __del__(). + def __del__(self): + # self._get_path() will raise an exception when retrieved after the + # call to .remove_from_connection, so we need a copy. + path = self._get_path() + if path == None: + return + if self._deletecallback is not None: + self._deletecallback(path) + self.local_set_value(None) + self.remove_from_connection() + logging.debug("VeDbusItemExport %s has been removed" % path) + + def _get_path(self): + if len(self._locations) == 0: + return None + return self._locations[0][1] + + ## Sets the value. And in case the value is different from what it was, a signal + # will be emitted to the dbus. This function is to be used in the python code that + # is using this class to export values to the dbus. + # set value to None to indicate that it is Invalid + def local_set_value(self, newvalue): + if self._value == newvalue: + return + + self._value = newvalue + + changes = {} + changes['Value'] = wrap_dbus_value(newvalue) + changes['Text'] = self.GetText() + self.PropertiesChanged(changes) + + def local_get_value(self): + return self._value + + # ==== ALL FUNCTIONS BELOW THIS LINE WILL BE CALLED BY OTHER PROCESSES OVER THE DBUS ==== + + ## Dbus exported method SetValue + # Function is called over the D-Bus by other process. It will first check (via callback) if new + # value is accepted. And it is, stores it and emits a changed-signal. + # @param value The new value. + # @return completion-code When successful a 0 is return, and when not a -1 is returned. + @dbus.service.method('com.victronenergy.BusItem', in_signature='v', out_signature='i') + def SetValue(self, newvalue): + if not self._writeable: + return 1 # NOT OK + + newvalue = unwrap_dbus_value(newvalue) + + if newvalue == self._value: + return 0 # OK + + # call the callback given to us, and check if new value is OK. + if (self._onchangecallback is None or + (self._onchangecallback is not None and self._onchangecallback(self.__dbus_object_path__, newvalue))): + + self.local_set_value(newvalue) + return 0 # OK + + return 2 # NOT OK + + ## Dbus exported method GetDescription + # + # Returns the a description. + # @param language A language code (e.g. ISO 639-1 en-US). + # @param length Lenght of the language string. + # @return description + @dbus.service.method('com.victronenergy.BusItem', in_signature='si', out_signature='s') + def GetDescription(self, language, length): + return self._description if self._description is not None else 'No description given' + + ## Dbus exported method GetValue + # Returns the value. + # @return the value when valid, and otherwise an empty array + @dbus.service.method('com.victronenergy.BusItem', out_signature='v') + def GetValue(self): + return wrap_dbus_value(self._value) + + ## Dbus exported method GetText + # Returns the value as string of the dbus-object-path. + # @return text A text-value. '---' when local value is invalid + @dbus.service.method('com.victronenergy.BusItem', out_signature='s') + def GetText(self): + if self._value is None: + return '---' + + # Default conversion from dbus.Byte will get you a character (so 'T' instead of '84'), so we + # have to convert to int first. Note that if a dbus.Byte turns up here, it must have come from + # the application itself, as all data from the D-Bus should have been unwrapped by now. + if self._gettextcallback is None and type(self._value) == dbus.Byte: + return str(int(self._value)) + + if self._gettextcallback is None and self.__dbus_object_path__ == '/ProductId': + return "0x%X" % self._value + + if self._gettextcallback is None: + return str(self._value) + + return self._gettextcallback(self.__dbus_object_path__, self._value) + + ## The signal that indicates that the value has changed. + # Other processes connected to this BusItem object will have subscribed to the + # event when they want to track our state. + @dbus.service.signal('com.victronenergy.BusItem', signature='a{sv}') + def PropertiesChanged(self, changes): + pass + +## This class behaves like a regular reference to a class method (eg. self.foo), but keeps a weak reference +## to the object which method is to be called. +## Use this object to break circular references. +class weak_functor: + def __init__(self, f): + self._r = weakref.ref(f.__self__) + self._f = weakref.ref(f.__func__) + + def __call__(self, *args, **kargs): + r = self._r() + f = self._f() + if r == None or f == None: + return + f(r, *args, **kargs) diff --git a/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/ext/velib_python/vedbus.pyc b/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/ext/velib_python/vedbus.pyc new file mode 100644 index 0000000000000000000000000000000000000000..499c6c4c87fe83fbfb535c6894a991836f477227 GIT binary patch literal 21834 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 literal 0 HcmV?d00001 diff --git a/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/__init__.py b/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/__init__.pyc b/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..db1868bdec08d429055a0a013e74c44b596be1c2 GIT binary patch literal 134 zcmZSn%*$mzH!U%l0SXv_v;z1(hWk`FZg1(hWk`FZg NoReturn + + service_name = service_name if service_name.startswith(SERVICE_PREFIX) else SERVICE_PREFIX + service_name + + self._daemon = DBusDaemon(connection_type_or_address) + self.remote_properties = RemoteProperties(self._daemon) + self.own_properties = OwnProperties(self._daemon) + self.own_properties.set('/DeviceInstance', device_instance) # must be set before request_name, sigh + + self.settings = Settings(self._daemon, self.remote_properties) + self.name = service_name + + if service_name is not None: + self._bus_name = self._daemon.request_name(service_name) + _log.info('service name is ' + service_name) + + _log.info('id is ' + self.bus_id) + + @property + def available_services(self): + # type: () -> List[unicode] + return [s.name for s in self._daemon.services] + + @property + def bus_id(self): + # type: () -> unicode + return self._daemon.bus_id diff --git a/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_dbus/dbus_service.pyc b/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_dbus/dbus_service.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5770ab8118c8f96f8df6ee3520ad2406248261cb GIT binary patch literal 2657 zcmb_eTTdHD6h5=-3kHn2LoRKtC~2)q#j5&JsZ}q4BOwtd8aGk1Qaf6_gEMq5&dwNO ziM|y6Mt?;g`!o6{`raSVo^#e1NGkCVY-T*??3tN!`M$IG|I}x{{rxcP!{k%K-|ukP zzj2E2Pe2Ti2nYlSl0Aq$NPGx;w8|_kpIEn%s{*X$tnb^kgP$l2FW@E z>yT_fumK`P|7vg!5Ntv;3&9Njy6wE(r0-#)VVX-7V6@>By;-hCkwct*O4#wb~@^r>^$E4vDh&~dhMJ^ z2ews0!Ig1(o|-IWN4`(TJ(oK&>t<5BQJy+7+c(zrDM}g?+71r;F;1rdM|g~&q}vDJ zJSskl8z}!KfRc+>wmdZL+K04D=f|e6RT?H*9h%tbyqS!wYg!lPu6bhItLA0)SZPTq ztGJmn`XY=+x|8QwUIexB|EIQ44LsSeaMi|Kw@sR6$2!&dVBF4i9F9M456A9Rma5ns z*tXFsIvCkDO={xk78)$$ex=jHEJw$WwHoI7(7d7aTgncIhA{MN7zlH?+Qka?ib(tP zgg#`tjl+J4lSaG=h)R?m#26;+9O+Ra$RS(K5orkG3XA@QSOwW@QNj40KAlHnT93a_ zI2D)m$k#|rt5gqMZ2XFq@!-^_v$1Z<2P`fXaH=T-!r+>w%3>9cX2{1=56(Ogi1osV z<}#^pp=Rk4TFlV`oB#tmqP+&eWQOF5ibhA{ud9=xq@Y*`YJNF1h;F{X0I2-T= zgYaSw(qj`9>?DV+jt}{ytIWY%A+tCc%1pB1?xL=rrK#>aB(!qlp;lS0!YIOqV{efU z6uZKEjZ^9#xwwuK_#b%1vyYS)@@Busfq@xxMM1nWYGwNQF0Tl zS=W2n`=RqhZ9nhH2c)B&6ZntiBNPg+aZxl;_WFH0sU)u5!NDZ0c*`q|a<_FK6--Oy z!T?`Q5@m1%tSilV3!C%Enb>Y6<_$t#Qt~C|n4sl8dDooU_|`Bt$Dz|(+|wtt=RWZ1 z4I8fWzUT*^-LU7~Ho_f-a`#p!*L=fQ3i6hEnzO}w?%@qPE}9OvAxSS{N%`W}`QtFg z$9(a4Na>{iOe8^6(yK{QSCZ5@9f`e8uebNK%RnGMxkOy-%jtc~&fxmGz~DDbS87#@ V;=WkC_1(hWk`FZgjjV0DhSwqW}N^ literal 0 HcmV?d00001 diff --git a/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_dbus/private/datatypes.py b/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_dbus/private/datatypes.py new file mode 100644 index 000000000..282956033 --- /dev/null +++ b/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_dbus/private/datatypes.py @@ -0,0 +1,22 @@ +from logging import getLogger + +from python_libs.ie_utils.mixins import Record + +_log = getLogger(__name__) + +# noinspection PyUnreachableCode +if False: + from typing import AnyStr + + +class ServiceInfo(Record): + + # noinspection PyShadowingBuiltins + def __init__(self, name, id, pid, proc_name, cmd): + # type: (AnyStr, AnyStr, int, str, str) -> ServiceInfo + + self.proc_name = proc_name + self.name = name + self.id = id + self.cmd = cmd + self.pid = pid diff --git a/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_dbus/private/datatypes.pyc b/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_dbus/private/datatypes.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a379d9652dca46c2a789b0474d07823c4d834280 GIT binary patch literal 883 zcmcIi&2H2%5FW?bbhi}IiX$(O(?-1`C?JrKP!HY{xmam38!S0aWP4Xc+FN-Io{|TE z8K-J_07x=lK0EXK#q!tl^S3|uO$!f~r1uS3&;%Vl0xZBFpcWu_oq^3@kWfnyC;)S~ zr;jVZ0{q7mA;F%(u!edK!cjyHC}A(4Tfq;2dw{R?2D$=v^xf0?ott;j$7l3uhyG|<{OtDQ;{=@QJz2OSK;XuyZ>n5ppmr%u%W2s% zvJYh8n&6bf34rE4i9`sqLYCk$Ki;_O-*XQI|Gh=+3mkQ=ewC3pGY#La6R*+J`J><*Te zikDAKCH7A`Q(XCiEU;dMye+v>WDP7G2IG1~6yhs_zoy;Nw1;SH*be5qaY6B~S9~s# swwhuiYx}9O0b|m9o;Vp-Nj3k+FiFAJi)L@Qqa^cXc9~tsLcElJ05ib55C8xG literal 0 HcmV?d00001 diff --git a/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_dbus/private/dbus_connection.py b/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_dbus/private/dbus_connection.py new file mode 100644 index 000000000..54372460a --- /dev/null +++ b/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_dbus/private/dbus_connection.py @@ -0,0 +1,185 @@ +from logging import getLogger + +from _dbus_bindings import Connection, MethodCallMessage, SignalMessage, BUS_DAEMON_NAME, \ + BUS_DAEMON_PATH, BUS_DAEMON_IFACE, NAME_FLAG_DO_NOT_QUEUE, Message, HANDLER_RESULT_HANDLED + +from python_libs.ie_dbus.private.dbus_types import dbus_string, dbus_uint32 +from python_libs.ie_dbus.private.message_types import DBusException +from python_libs.ie_utils.mixins import Disposable + +_log = getLogger(__name__) + +# noinspection PyUnreachableCode +if False: + from typing import List, Optional, Iterable, Callable, Union, NoReturn, AnyStr, Any + from python_libs.ie_dbus.private.dbus_types import DbusType + + +class DbusConnection(Disposable): + """ + A collection of stateless functions operating on a Connection object + """ + + def __init__(self, connection_type_or_address): + # type: (Union[int, AnyStr]) -> NoReturn + + self._address = connection_type_or_address + # noinspection PyProtectedMember + self._connection = Connection._new_for_bus(connection_type_or_address) # it's not disposable + self.chain_disposable(self._connection.close, 'connection ' + self._connection.get_unique_name()) + + @property + def bus_id(self): + return self._connection.get_unique_name() + + def fork(self): + return DbusConnection(self._address) + + def get_ids_and_service_names(self): + # type: () -> Iterable[unicode] + + # noinspection PyTypeChecker + return map(unicode, self.call_daemon_method('ListNames')[0]) + + def get_service_names(self): + # type: () -> Iterable[AnyStr] + + return ( + unicode(name) + for name + in self.get_ids_and_service_names() + if not name.startswith(':') + ) + + def get_service_ids(self): + # type: () -> Iterable[AnyStr] + + return ( + name + for name in self.get_ids_and_service_names() if name.startswith(':')) + + # noinspection PyBroadException + def get_pid_of_service(self, service_name): + # type: (AnyStr) -> Optional[int] + try: + reply = self.call_daemon_method('GetConnectionUnixProcessID', dbus_string(service_name)) + return int(reply[0]) + except: + return None + + def get_id_of_service(self, service_name): + # type: (AnyStr) -> AnyStr + reply = self.call_daemon_method('GetNameOwner', dbus_string(service_name)) + return unicode(reply[0]) + + def call_method(self, service_name, object_path, interface, member, *args): + # type: (AnyStr, AnyStr, Optional[str], str, List[Any]) -> List[Any] + + msg = MethodCallMessage(service_name, object_path, interface, member) + + for arg in args: + msg.append(arg) + + reply = self._connection.send_message_with_reply_and_block(msg) # with py3 we could use asyncio here + DBusException.raise_if_error_reply(reply) + + return reply.get_args_list() # TODO: utf8_strings=True ? + + def send_message(self, msg): + # type: (Message) -> NoReturn + + self._connection.send_message(msg) + + def call_daemon_method(self, method_name, *args): + # type: (AnyStr, Iterable[DbusType])-> List[any] + + return self.call_method(BUS_DAEMON_NAME, BUS_DAEMON_PATH, BUS_DAEMON_IFACE, method_name, *args) + + def request_name(self, service_name): + # type: (AnyStr) -> Disposable + + _log.debug('requesting bus name ' + service_name) + + self.call_daemon_method('RequestName', dbus_string(service_name), dbus_uint32(NAME_FLAG_DO_NOT_QUEUE)) + + def dispose(): + self.call_daemon_method('ReleaseName', dbus_string(service_name)) + + return self.create_dependent_disposable(dispose, 'bus name ' + service_name) + + def broadcast_signal(self, object_path, interface, member, *args): + # type: (AnyStr, AnyStr, AnyStr, List[Any]) -> NoReturn + + msg = SignalMessage(object_path, interface, member) + for arg in args: + msg.append(arg) + + self._connection.send_message(msg) + + def add_message_callback(self, callback, filter_rule, fork=True): + # type: (Callable[[Message], NoReturn], AnyStr, Optional[bool]) -> Disposable + if fork: + return self._add_message_callback_fork(callback, filter_rule) + else: + return self._add_message_callback_no_fork(callback, filter_rule) + + def _add_message_callback_no_fork(self, callback, filter_rule): # TODO: forking for incoming method calls + # type: (Callable[[Message], NoReturn], AnyStr) -> Disposable + + def dispatch(_, msg): + # type: (Connection, Message) -> int + + #_log.info(' ####### got message type=' + str(msg.get_type()) + ' ' + msg.get_path() + '/' + msg.get_member()) + callback(msg) + #_log.debug('DONE') + return HANDLER_RESULT_HANDLED + + msg_filter = self._add_message_filter(dispatch) + match = self._add_match(filter_rule) + + def dispose(): + match.dispose() + msg_filter.dispose() + + return self.create_dependent_disposable(dispose) + + def _add_message_callback_fork(self, callback, filter_rule): + # type: (Callable[[Message], NoReturn], AnyStr) -> Disposable + + forked = self.fork() + _log.debug('forked connection ' + forked.bus_id) + + def dispatch(_, msg): + # type: (Connection, Message) -> int + + # _log.debug('got message type=' + str(msg.get_type()) + ' ' + msg.get_path() + '/' + msg.get_member()) + callback(msg) + return HANDLER_RESULT_HANDLED + + forked._add_message_filter(dispatch) + forked._add_match(filter_rule) + + return self.create_dependent_disposable(forked) + + def _add_message_filter(self, callback): + # type: (Callable[[Connection, Message], int]) -> Disposable + + _log.debug('added filter on ' + self.bus_id) + self._connection.add_message_filter(callback) + + def dispose(): + self._connection.remove_message_filter(callback) + + return self.create_dependent_disposable(dispose, 'message filter on ' + self.bus_id) + + def _add_match(self, filter_rule): + # type: (AnyStr) -> Disposable + + self.call_daemon_method('AddMatch', dbus_string(filter_rule)) + + _log.debug('added match_rule: ' + filter_rule) + + def dispose(): + self.call_daemon_method('RemoveMatch', dbus_string(filter_rule)) + + return self.create_dependent_disposable(dispose, 'Match ' + filter_rule) diff --git a/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_dbus/private/dbus_connection.pyc b/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_dbus/private/dbus_connection.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5f69a5a152481eef7f518231c9061d23f11bf20d GIT binary patch literal 8378 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 literal 0 HcmV?d00001 diff --git a/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_dbus/private/dbus_daemon.py b/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_dbus/private/dbus_daemon.py new file mode 100644 index 000000000..825028454 --- /dev/null +++ b/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_dbus/private/dbus_daemon.py @@ -0,0 +1,273 @@ +from logging import getLogger + +from _dbus_bindings import Message, ErrorMessage, BUS_DAEMON_NAME, BUS_DAEMON_PATH, BUS_DAEMON_IFACE +from python_libs.ie_dbus.private.datatypes import ServiceInfo +from python_libs.ie_dbus.private.dbus_connection import DbusConnection +from python_libs.ie_dbus.private.message_types import MatchedMessage, MessageFilter, ResolvedMessage +from python_libs.ie_utils.mixins import Disposable, RequiresMainLoop + +_log = getLogger(__name__) + +NONE = '' + +# noinspection PyUnreachableCode +if False: + from typing import Callable, List, Optional, Iterable, Union, AnyStr, NoReturn, Any, Dict + from python_libs.ie_dbus.private.dbus_types import DbusType + + +class DBusDaemon(Disposable, RequiresMainLoop): + + _services = None # type: Dict[str, ServiceInfo] + + def __init__(self, connection_type_or_address): + # type: (Union[int, AnyStr]) -> NoReturn + + self._dbus = DbusConnection(connection_type_or_address) + # self._dbus.add_message_callback(lambda _: None, 'type=method_call', fork=False) # sink method calls, TODO + + self._name_changed = self.subscribe_to_signal_message( + self._on_name_owner_changed, + sender_id=BUS_DAEMON_NAME, + object_path=BUS_DAEMON_PATH, + interface=BUS_DAEMON_IFACE, + member='NameOwnerChanged') + + self._services = self._init_services() + + @property + def bus_id(self): + # type: () -> AnyStr + return self._dbus.bus_id + + @property + def services(self): + # type: () -> Iterable[ServiceInfo] + return self._services.itervalues() + + def subscribe_to_signal_message( + self, + callback, + sender_id='*', + sender_name='*', + object_path='*', + interface='*', + member='*', + signature='*'): + # type: (Callable[[MatchedMessage], None], Optional[AnyStr], Optional[AnyStr], Optional[AnyStr], Optional[AnyStr], Optional[AnyStr], Optional[AnyStr]) -> Disposable + + message_filter = MessageFilter( + message_type='signal', + sender_id=sender_id, + sender_name=sender_name, + object_path=object_path, + interface=interface, + member=member, + signature=signature) + + def dispatch(msg): + # type: (Message) -> NoReturn + + resolved_msg = self._resolve_message(msg) + matched = message_filter.match_message(resolved_msg) + + if matched is not None: + callback(matched) + + return self._dbus.add_message_callback(dispatch, message_filter.filter_rule) + + def subscribe_to_method_call_message( + self, + callback, + sender_id='*', + sender_name='*', + object_path='*', + interface='*', + member='*', + signature='*', + destination_id='*', + destination_name='*'): + # type: (Callable[[MatchedMessage], Any], Optional[AnyStr], Optional[AnyStr], Optional[AnyStr], Optional[AnyStr], Optional[AnyStr], Optional[AnyStr], Optional[AnyStr], Optional[bool]) -> Disposable + + message_filter = MessageFilter( + message_type='method_call', + sender_id=sender_id, + sender_name=sender_name, + object_path=object_path, + interface=interface, + member=member, + signature=signature, + destination_id=destination_id, + destination_name=destination_name) # TODO: eavesdrop logic + + def dispatch(msg): + # type: (Message) -> NoReturn + + if msg.get_type() != 1: + return + + resolved_msg = self._resolve_message(msg) + matched = message_filter.match_message(resolved_msg) + + if matched is None: + reply = ErrorMessage(msg, 'com.victronenergy.method_call_refused', 'refused') + else: + try: + result = callback(matched) + except Exception as e: + # _log.debug('method_call threw an exception ' + str(e)) + # traceback.print_exc() + reply = matched.create_error_reply(e) + else: + reply = matched.create_method_reply(result) + + self._dbus.send_message(reply) + + return self._dbus.add_message_callback(dispatch, message_filter.filter_rule, fork=False) + + def request_name(self, service_name): + # type: (AnyStr) -> Disposable + + return self._dbus.request_name(service_name) + + def call_method(self, service_name, object_path, interface, member, *args): + # type: (AnyStr, AnyStr, AnyStr, AnyStr, Iterable[DbusType]) -> List[Any] + + return self._dbus.call_method(service_name, object_path, interface, member, *args) + + def broadcast_signal(self, object_path, interface, member, *args): + # type: (AnyStr, AnyStr, AnyStr, List[DbusType]) -> NoReturn + + self._dbus.broadcast_signal(object_path, interface, member, *args) + + def get_service_names_of_id(self, service_id): + # type: (str) -> List[AnyStr] + + if service_id is None: + return [] + + return [ + s.name + for s in self.services + if s.id == service_id + ] + + def get_id_for_service_name(self, service_name): + # type: (AnyStr) -> Optional[AnyStr] + + return next((s.id for s in self.services if s.name == service_name), None) + + def exists_service_with_name(self, service_name): + # type: (AnyStr) -> bool + + return self.get_id_for_service_name(service_name) is not None + + def _resolve_message(self, msg): + # type: (Message) -> ResolvedMessage + + sender_id, sender_names = self._resolve_name(msg.get_sender()) + destination_id, destination_names = self._resolve_name(msg.get_destination()) + + return ResolvedMessage(msg, sender_id, sender_names, destination_id, destination_names) + + # noinspection PyShadowingBuiltins + def _resolve_name(self, name): + # type: (str) -> (str, List[str]) + + if name is None: + id = NONE + names = [] + elif name.startswith(':'): + id = name + names = self.get_service_names_of_id(name) + else: + id = self.get_id_for_service_name(name) + names = [name] + + return id, names + + def _on_name_owner_changed(self, msg): + # type: (MatchedMessage) -> NoReturn + + (name, old_id, new_id) = msg.arguments + + old_id = old_id.strip() + new_id = new_id.strip() + name = name.strip() + + if name.startswith(':'): + name = None + + added = old_id == '' and new_id != '' + changed = old_id != '' and new_id != '' + removed = old_id != '' and new_id == '' + + # 'changed' is dispatched as 'removed' followed by 'added' + + if removed or changed: + self._services.pop(old_id, None) + + if added or changed: + service = self._create_service(name, new_id) + self._services[new_id] = service + + # noinspection PyShadowingBuiltins + def _init_services(self): + # type: () -> Dict[str, ServiceInfo] + + services = dict() + + names_and_ids = self._dbus.get_ids_and_service_names() + + ids = set([i for i in names_and_ids if i.startswith(':')]) + names = [n for n in names_and_ids if not n.startswith(':')] + + for service_name in names: + service = self._create_service(service_name) + services[service.id] = service + ids.discard(service.id) + + self._services = services # UGLY, because _create_service below references it. + + for id in ids: + services[id] = self._create_service(id=id) + + return services + + def _search_service_name_by_pid(self, pid): + # type: (int) -> Optional[AnyStr] + return next((s.name for s in self.services if s.pid == pid and s.name != NONE), NONE) + + # noinspection PyShadowingBuiltins + def _create_service(self, name=None, id=None): + # type: (Optional[AnyStr], Optional[AnyStr]) -> ServiceInfo + + id = id or self._dbus.get_id_of_service(name) + pid = self._dbus.get_pid_of_service(id) + proc = self._get_process_name_of_pid(pid) + cmd = self._get_commandline_of_pid(pid) + name = name or self._search_service_name_by_pid(pid) + + return ServiceInfo(name, id, pid, proc, cmd) + + # noinspection PyBroadException + @staticmethod + def _get_process_name_of_pid(service_pid): + # type: (int) -> str + + try: + with open('/proc/{0}/comm'.format(service_pid)) as proc: + return proc.read().replace('\0', ' ').rstrip() + except Exception as _: + return '' + + # noinspection PyBroadException + @staticmethod + def _get_commandline_of_pid(service_pid): + # type: (int) -> str + + try: + with open('/proc/{0}/cmdline'.format(service_pid)) as proc: + return proc.read().replace('\0', ' ').rstrip() + except Exception as _: + return '' diff --git a/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_dbus/private/dbus_daemon.pyc b/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_dbus/private/dbus_daemon.pyc new file mode 100644 index 0000000000000000000000000000000000000000..20f55842cdd2f83ad648cac3204244d2536b3c26 GIT binary patch literal 9390 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 DY0S=x literal 0 HcmV?d00001 diff --git a/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_dbus/private/dbus_types.py b/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_dbus/private/dbus_types.py new file mode 100644 index 000000000..522473aa5 --- /dev/null +++ b/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_dbus/private/dbus_types.py @@ -0,0 +1,139 @@ +from logging import getLogger + +import dbus + + +_log = getLogger(__name__) + +# noinspection PyUnreachableCode +if False: + from typing import Any, Union, Dict + DbusString = Union[dbus.String, dbus.UTF8String, dbus.ObjectPath, dbus.Signature] + DbusInt = Union[dbus.Int16, dbus.Int32, dbus.Int64] + DbusDouble = dbus.Double + DbusBool = dbus.Boolean + + DbusStringVariant = DbusString # TODO: variant_level constraint ? + DbusIntVariant = DbusInt + DbusDoubleVariant = DbusDouble + DbusBoolVariant = DbusBool + + DbusValue = Union[DbusString, DbusInt, DbusDouble, DbusBool, DBUS_NONE] + DbusVariant = Union[DbusStringVariant, DbusIntVariant, DbusDoubleVariant, DbusBoolVariant, DBUS_NONE] + + DbusTextDict = dbus.Dictionary + DbusVariantDict = dbus.Dictionary + + DbusType = Union[DbusValue, DbusVariant, DbusVariantDict, DbusTextDict] + +DBUS_NONE = dbus.Array([], signature=dbus.Signature('i'), variant_level=1) # DEFINED by victron + +MAX_INT16 = 2 ** 15 - 1 +MAX_INT32 = 2 ** 31 - 1 + + +def dbus_uint32(value): + # type: (int) -> dbus.UInt32 + if value < 0: + raise Exception('cannot convert negative value to UInt32') + + return dbus.UInt32(value) + + +def dbus_int(value): + # type: (Union[int, long]) -> Union[dbus.Int16, dbus.Int32, dbus.Int64] + abs_value = abs(value) + if abs_value < MAX_INT16: + return dbus.Int16(value) + elif abs_value < MAX_INT32: + return dbus.Int32(value) + else: + return dbus.Int64(value) + + +def dbus_string(value): + # type: (Union[str, unicode]) -> DbusString + if isinstance(value, unicode): + return dbus.UTF8String(value) + else: + return dbus.String(value) + + +def dbus_double(value): + # type: (float) -> DbusDouble + return dbus.Double(value) + + +def dbus_bool(value): + # type: (bool) -> DbusBool + return dbus.Boolean(value) + + +# VARIANTS + +def dbus_int_variant(value): + # type: (Union[int, long]) -> DbusIntVariant + abs_value = abs(value) + if abs_value < MAX_INT16: + return dbus.Int16(value, variant_level=1) + elif abs_value < MAX_INT32: + return dbus.Int32(value, variant_level=1) + else: + return dbus.Int64(value, variant_level=1) + + +def dbus_string_variant(value): + # type: (Union[str, unicode]) -> DbusStringVariant + if isinstance(value, unicode): + return dbus.UTF8String(value, variant_level=1) + else: + return dbus.String(value, variant_level=1) + + +def dbus_double_variant(value): + # type: (float) -> DbusDoubleVariant + return dbus.Double(value, variant_level=1) + + +def dbus_bool_variant(value): + # type: (bool) -> DbusBoolVariant + return dbus.Boolean(value, variant_level=1) + + +def dbus_variant(value): + # type: (Any) -> DbusVariant + + if value is None: + return DBUS_NONE + if isinstance(value, float): + return dbus_double_variant(value) + if isinstance(value, bool): + return dbus_bool_variant(value) + if isinstance(value, (int, long)): + return dbus_int_variant(value) + if isinstance(value, (str, unicode)): + return dbus_string_variant(value) + # TODO: container types + + raise TypeError('unsupported python type: ' + str(type(value)) + ' ' + str(value)) + + +def dbus_value(value): + # type: (Any) -> DbusVariant + + if value is None: + return DBUS_NONE + if isinstance(value, float): + return dbus_double(value) + if isinstance(value, bool): + return dbus_bool(value) + if isinstance(value, (int, long)): + return dbus_int(value) + if isinstance(value, (str, unicode)): + return dbus_string_variant(value) + # TODO: container types + + raise TypeError('unsupported python type: ' + str(type(value)) + ' ' + str(value)) + + + diff --git a/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_dbus/private/dbus_types.pyc b/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_dbus/private/dbus_types.pyc new file mode 100644 index 0000000000000000000000000000000000000000..000289bbc18b34f9768319078dedf7e0a47775d5 GIT binary patch literal 4364 zcmds4?Qhd&5I;Ljo3v?D`a&r!Bb2xBngLU_O%q#LK>}@Ia#}Q5nj$BD8eCjEvY$jm zVgil*8~eJC`{(utboV>kNh(#FkO&`E@a3Mn^ZB{g=bqf(^RwUnap1Hm{hQ|B@A!%T zG>BaOZ;(%PWRPu;fwf7#Nw!JKAeE!{%$OpTr>HF49Qo69G(+|b9Tmtf&{2`>A{nYc z%A~_tfpY>&0_W*qiq`D~N+rrdT@-kR4sy&}lEpIFD}t<&eU{V$*=wYh$UaAEh3s`w zXURS;EpnFxxlQh}Aa}@J5#%nptAf-Jjz;x7$ICnBzbeO!bdf3&u6e2nowaV{^&PEhSTyyZtKz#XHpg0o((|yZ z%e;*7buvpv*%Z&fD?`sb=LLHsvHe$r-Wc!(ymXZ`r&2C+3m8+vcqoi~#(>mxw%|f+ zNU-bG8E8g$omMQd{Bh^!=F|G#y=|)i79!4`ySF{gd~iRbkFf18s@SeIi?`rlR@j`3 z_pmYX9y{+A<8g@rTvsyY@gxpJ2w|9{)*VI?2eRMZn-p!H^c&nWb&7jnzJ^I&>;cEBO$ zPFg_lPd$m5L>l?G8}?eh`V`xC z9Ro!#6uQI6>1BFrlx}<^a@&1x7>!Y}J{uM5h&?RX5lIRcNnN)PE@`V$!WK%vLXagT ztp#9cwbmlQ83v>Bw3e{s=cD#Cd?>3*E_~_!&zLq=oy%OE%cDpS{q_}$ov6;O)7&+z z(f{xVYSvl-SOq|GTW0~*7)&rvmRY?xASubr2m4GOmgZ^JNj%-U#xUo1R)e>vg z8T%B5Bt@DT@(Tgh_fs`LsZDvC26cdmxQoVmMg7JgsRe_>KoUjef zIVSM|i8JE{&epVjrVJk7nDL0X>7QiGkS@>x*EzEt9Ec~`v&1t%%6><>G-UHo$VWJ{ z7g7=rJ8Rr8)|i&4SW5Rnhh&%4x&t@H$4ZQ?6u88D(Quo>l(kCnu8?9P&R8x^;Tp#f2UxMh-JI==Aw?sbj z5`TQF1bY1T_^m{2Vlkv+>hiw0=^wc;dj str + + if message_type == 1: + return 'method_call' + if message_type == 2: + return 'method_return' + if message_type == 3: + return 'error' + if message_type == 4: + return 'signal' + + return 'invalid' + + +class DBusMessage(Record): + + def __init__(self, msg, sender_id, destination_id): + # type: (Message, str, str) -> NoReturn + + self.sender_id = sender_id + self.destination_id = destination_id + self._msg = msg + + @property + def expects_reply(self): + # type: () -> bool + return not self._msg.get_no_reply() + + @property + def message_type(self): + # type: () -> int + return int(self._msg.get_type()) + + @property + def reply_serial(self): + # type: () -> int + return int(self._msg.get_reply_serial()) + + @property + def object_path(self): + # type: () -> str + return str(self._msg.get_path()) + + @property + def interface(self): + # type: () -> str + return str(self._msg.get_interface()) + + @property + def arguments(self): + # type: () -> List[Any] + return self._msg.get_args_list(utf8_strings=True) + + @property + def signature(self): + # type: () -> str + return str(self._msg.get_signature()) + + @property + def serial(self): + # type: () -> int + return int(self._msg.get_serial()) + + @property + def member(self): + # type: () -> str + return str(self._msg.get_member()) + + def create_method_reply(self, *args): + # type: (List[any]) -> MethodReturnMessage + + if self.message_type != MessageType.method_call: + raise Exception('cannot create a reply for a message that is not a method call') + + reply = MethodReturnMessage(self._msg) + + for arg in args: + reply.append(arg) + + return reply + + def create_error_reply(self, exception): + # type: (Exception) -> ErrorMessage + + if self.message_type != MessageType.method_call: + raise Exception('cannot create an error reply for a message that is not a method call') + + return ErrorMessage(self._msg, 'com.victronenergy.' + exception.__class__.__name__, exception.message) # TODO prefix + + +class ResolvedMessage(DBusMessage): + + def __init__(self, msg, sender_id, sender_names, destination_id, destination_names): + # type: (Message, str, List[str], str, List[str]) -> NoReturn + + super(ResolvedMessage, self).__init__(msg, sender_id, destination_id) + + self.sender_names = sender_names + self.destination_names = destination_names + + +class MatchedMessage(DBusMessage): + + def __init__(self, resolved_msg, sender_name, destination_name): + # type: (ResolvedMessage, str, str) -> NoReturn + + super(MatchedMessage, self).__init__(resolved_msg._msg, resolved_msg.sender_id, resolved_msg.destination_id) + + self.sender_name = sender_name + self.destination_name = destination_name + + +class MessageFilter(Record): + + def __init__( + self, + message_type='*', + sender_id='*', + sender_name='*', + object_path='*', + interface='*', + member='*', + signature='*', + destination_id='*', + destination_name='*', + eavesdrop=False): + + # type: (Optional[AnyStr],Optional[AnyStr],Optional[AnyStr],Optional[AnyStr],Optional[AnyStr],Optional[AnyStr],Optional[AnyStr],Optional[AnyStr],Optional[AnyStr],Optional[bool]) -> NoReturn + + self.signature = signature + self.message_type = message_type + + self.member = member + self.interface = interface + self.object_path = object_path + + self.sender_id = sender_id + self.sender_name = sender_name + self.destination_id = destination_id + self.destination_name = destination_name + + self.eavesdrop = eavesdrop + + @staticmethod + def create_filter_rule( + message_type='*', + sender_id='*', + sender_name='*', + object_path='*', + interface='*', + member='*', + destination_id='*', + eavesdrop=False): + # type: (Optional[AnyStr],Optional[AnyStr],Optional[AnyStr],Optional[AnyStr],Optional[AnyStr],Optional[AnyStr],Optional[AnyStr],bool) -> AnyStr + + rules = [] + + def rule(key, value): + if '*' not in value and '?' not in value: + rules.append("%s='%s'" % (key, value)) + + rule('type', message_type) + rule('sender', sender_id if sender_name == '*' and sender_id != '*' else sender_name) + rule('destination', destination_id) + rule('eavesdrop', 'true' if eavesdrop else 'false') + rule('path', object_path) # TODO: endswith *, object namespace + rule('interface', interface) + rule('member', member) + + return ','.join(rules) + + @property + def filter_rule(self): + # type: () -> AnyStr + + return self.create_filter_rule( + message_type=self.message_type, + sender_id=self.sender_id, + sender_name=self.sender_name, + object_path=self.object_path, + interface=self.interface, + member=self.member, + destination_id=self.destination_id, + eavesdrop=self.eavesdrop) + + @staticmethod + def _get_matching_name(names, name_filter): + # type: (Iterable[AnyStr], AnyStr) -> Optional[AnyStr] + + matching_names = ( + name + for name + in names + if glob(name, name_filter) + ) + + return next(matching_names, None) + + def match_message(self, msg): + # type: (ResolvedMessage) -> Optional[MatchedMessage] + + match = \ + glob(msg.object_path, self.object_path) and \ + glob(msg.interface or '', self.interface) and \ + glob(msg.member, self.member) and \ + glob(msg.signature, self.signature) and \ + glob(msg.sender_id, self.sender_id) and \ + glob(msg.destination_id or '', self.destination_id) + + if not match: + return None + + sender_name = self._get_matching_name(msg.sender_names, self.sender_name) + if sender_name is None and self.sender_name != '*': # sender might not have a well known name + return None + + destination_name = self._get_matching_name(msg.destination_names, self.destination_name) + if destination_name is None and self.destination_name != '*': + return None + + return MatchedMessage(msg, sender_name, destination_name) + + +class DBusException(Exception): + + def __init__(self, message): + super(Exception, self).__init__(message) + + @classmethod + def raise_if_error_reply(cls, reply): + # type: (Message) -> Message + + if isinstance(reply, ErrorMessage): + raise DBusException(reply.get_error_name()) + else: + return reply diff --git a/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_dbus/private/message_types.pyc b/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_dbus/private/message_types.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fae86efb1d2a10ad9d644f02a6affce8b9f5bfef GIT binary patch literal 9236 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 au4Ql8KZmqfYk05LPMtY*^VAXi4*vrcYJQ{u literal 0 HcmV?d00001 diff --git a/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_dbus/private/own_properties.py b/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_dbus/private/own_properties.py new file mode 100644 index 000000000..76404b25c --- /dev/null +++ b/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_dbus/private/own_properties.py @@ -0,0 +1,177 @@ + +from logging import getLogger + +import dbus + +from python_libs.ie_dbus.private.dbus_types import dbus_variant, dbus_string +from python_libs.ie_dbus.private.dbus_daemon import DBusDaemon +from python_libs.ie_dbus.private.message_types import MatchedMessage +from python_libs.ie_dbus.private.ve_constants import GET_TEXT, INTERFACE_BUS_ITEM, PROPERTIES_CHANGED, GET_VALUE, SET_VALUE +from python_libs.ie_utils.mixins import Disposable, Record + +_log = getLogger(__name__) + + +# noinspection PyUnreachableCode +if False: + from typing import Optional, AnyStr, NoReturn, Dict, Any + from python_libs.ie_dbus.private.dbus_types import DbusVariant, DbusString, DbusVariantDict, DbusType + + +class OwnProperty(Record): + + def __init__(self, value, unit='', writable=False): + + str_value = round(value, 2) if isinstance(value, float) else value + + self.text = unicode(str_value) + unit + self.value = value + self.unit = unit + self.writable = writable + + @property + def dbus_dict(self): + # type: () -> dbus.Dictionary + d = { + dbus.String('Text'): dbus_variant(self.text), + dbus.String('Value'): dbus_variant(self.value) + } + return dbus.Dictionary(d, signature='sv') + + @property + def dbus_value(self): + # type: () -> DbusVariant + return dbus_variant(self.value) + + @property + def dbus_text(self): + # type: () -> DbusString + return dbus_string(self.text) + + def update_value(self, value): + # type: (any) -> OwnProperty + return OwnProperty(value, self.unit, self.writable) + + def __iter__(self): + yield self.value + yield self.text + + +class OwnProperties(Disposable): + + _own_properties = None # type: Dict[AnyStr, OwnProperty] + + # noinspection PyProtectedMember + def __init__(self, daemon): + # type: (DBusDaemon) -> NoReturn + + self._daemon = daemon + self._own_properties = dict() + self._method_call_subs = self._daemon.subscribe_to_method_call_message(self._on_method_called) # no filter whatsoever + + def get(self, object_path): + # type: (AnyStr) -> OwnProperty + return self._own_properties[object_path] + + def set(self, object_path, value, unit='', writable=False): + # type: (AnyStr, any, Optional[AnyStr], Optional[bool]) -> bool + + prop = OwnProperty(value, unit, writable) + + if object_path in self._own_properties: + if self._own_properties[object_path] == prop: + return False + + self._own_properties[object_path] = prop + # object_path, interface, member, *args): + self._daemon.broadcast_signal( + object_path, + INTERFACE_BUS_ITEM, + PROPERTIES_CHANGED, + prop.dbus_dict) + + return True + + def _on_method_called(self, message): + # type: (MatchedMessage) -> Any + + # _log.info(str(message.sender_name) + '(' + str(message.sender_id) + ') asked ' + message.member + ' ' + message.object_path) + + if message.member == GET_VALUE: + return self._on_get_value_called(message) + elif message.member == GET_TEXT: + return self._on_get_text_called(message) + elif message.member == SET_VALUE: + return self._on_set_value_called(message) + + def _on_set_value_called(self, message): + # type: (MatchedMessage) -> bool + + path = message.object_path + + if path not in self._own_properties: + raise Exception('property ' + path + ' does not exist') + + prop = self._own_properties[path] + if not prop.writable: + raise Exception('property ' + path + ' is read-only') + + value = message.arguments[0] + + if prop.value == value: + return False + + prop = prop.update_value(value) + self._own_properties[path] = prop + + # object_path, interface, member, *args): + self._daemon.broadcast_signal( + path, + INTERFACE_BUS_ITEM, + PROPERTIES_CHANGED, + prop.dbus_dict) + + return True + + def _on_get_value_called(self, message): + # type: (MatchedMessage) -> DbusType + + path = message.object_path + + if path in self._own_properties: + return self._own_properties[path].dbus_value + + if path.endswith('/'): # "Tree Export" + values = { + dbus.String(k.lstrip('/')): dbus_variant(p.value) + for (k, p) + in self._own_properties.iteritems() + if k.startswith(path) + } + + return dbus.Dictionary(values, signature='sv', variant_level=1) # variant for tree export !! + + raise Exception('property ' + path + ' does not exist') + + def _on_get_text_called(self, message): + # type: (MatchedMessage) -> DbusType + + path = message.object_path + + if path in self._own_properties: + return self._own_properties[message.object_path].dbus_text + + if path.endswith('/'): # "Tree Export" + values = { + dbus.String(k.lstrip('/')): dbus.String(p.text) + for (k, p) + in self._own_properties.iteritems() + if k.startswith(path) + } + return dbus.Dictionary(values, signature='ss', variant_level=1) # variant for tree export !! + + raise Exception('property ' + path + ' does not exist') + + def __contains__(self, object_path): + # type: (AnyStr) -> bool + return object_path in self._own_properties diff --git a/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_dbus/private/own_properties.pyc b/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_dbus/private/own_properties.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e62bf1b7db068bcbdb0701d99c2bfc71c56f6810 GIT binary patch literal 6724 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 literal 0 HcmV?d00001 diff --git a/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_dbus/private/remote_properties.py b/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_dbus/private/remote_properties.py new file mode 100644 index 000000000..10a26f2cb --- /dev/null +++ b/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_dbus/private/remote_properties.py @@ -0,0 +1,166 @@ +from logging import getLogger + +from python_libs.ie_dbus.private.dbus_types import dbus_variant +from python_libs.ie_utils.mixins import Disposable, Record +from python_libs.ie_dbus.private.dbus_daemon import DBusDaemon +from python_libs.ie_dbus.private.message_types import MatchedMessage +from python_libs.ie_dbus.private.ve_constants import GET_TEXT, INTERFACE_BUS_ITEM, PROPERTIES_CHANGED, GET_VALUE, SERVICE_PREFIX, SET_VALUE + +_log = getLogger(__name__) + +_UNKNOWN_TEXT = '' + +# noinspection PyUnreachableCode +if False: + from typing import List, AnyStr, NoReturn, Dict, Any + + +class RemoteProperty(Record): + + def __init__(self, value, text): + + self.text = text + self.value = value + + @staticmethod + def from_dbus_dict(dbus_dict): + value = dbus_dict['Value'] + text = dbus_dict['Text'] + return RemoteProperty(value, text) + + +class RemoteProperties(Disposable): + + _remote_properties = None # type: Dict[AnyStr, RemoteProperty] + + def __init__(self, daemon): + # type: (DBusDaemon) -> NoReturn + + self._daemon = daemon + self._remote_properties = dict() + + # noinspection PyBroadException + def available_properties(self, service_name): + # type: (unicode) -> List[unicode] + + if not self._daemon.exists_service_with_name(service_name): + return [] + + try: + paths = self._call_remote(service_name=service_name, object_path='/', member=GET_TEXT)[0].keys() + except Exception as _: + return [] + else: + return ['/' + str(path) for path in paths] + + def exists(self, combined_path): + # type: (AnyStr) -> bool + + service_name, object_path, combined_path = self._parse_combined_path(combined_path) + return object_path in self.available_properties(service_name) + + def get(self, combined_path): + # type: (AnyStr) -> RemoteProperty + + service_name, object_path, combined_path = self._parse_combined_path(combined_path) + + if combined_path in self._remote_properties: + cached = self._remote_properties[combined_path] + + # a cached prop might have an unknown text, because its value has been written before, + # but it has never read or updated via property-changed + + if cached.text != _UNKNOWN_TEXT: + return cached + + text = self._get_text(service_name, object_path) + self._remote_properties[combined_path] = RemoteProperty(cached.value, text) + + return self._remote_properties[combined_path] + + prop = self._get_property(service_name, object_path) + self._remote_properties[combined_path] = prop + self._subscribe_to_property_changed(service_name, object_path) + + return prop + + def set(self, combined_path, value): + # type: (AnyStr, any) -> bool + + service_name, object_path, combined_path = self._parse_combined_path(combined_path) + + if combined_path in self._remote_properties: + if self._remote_properties[combined_path].value == value: + return False # property already has the requested value => nothing to do + else: + self._subscribe_to_property_changed(service_name, object_path) + + result = self._call_remote(service_name, object_path, SET_VALUE, dbus_variant(value))[0] + + if result != 0: + raise Exception(service_name + ' refused to set value of ' + object_path + ' to ' + str(value)) + + self._remote_properties[combined_path] = RemoteProperty(value, _UNKNOWN_TEXT) + + return True + + def _subscribe_to_property_changed(self, service_name, object_path): + # type: (unicode, unicode) -> NoReturn + + def callback(msg): + # type: (MatchedMessage) -> NoReturn + prop = RemoteProperty.from_dbus_dict(msg.arguments[0]) + key = msg.sender_name+msg.object_path + self._remote_properties[key] = prop + + signal = self._daemon.subscribe_to_signal_message( + callback=callback, + sender_name=service_name, + object_path=object_path, + interface=INTERFACE_BUS_ITEM, # TODO: <- this could be removed to make it more robust, in theory + member=PROPERTIES_CHANGED) # TODO: OTOH, don't fix if it is not broken + + self.chain_disposable(signal, 'signal subscription on ' + self._daemon.bus_id + ' ' + service_name + object_path) + + def _get_value(self, service_name, object_path): + # type: (unicode, unicode) -> any + + return self._call_remote(service_name, object_path, GET_VALUE)[0] + + def _get_text(self, service_name, object_path): + # type: (unicode, unicode) -> unicode + + result = self._call_remote(service_name, object_path, GET_TEXT)[0] + return unicode(result) + + def _get_property(self, service_name, object_path): + # type: (unicode, unicode) -> RemoteProperty + + value = self._get_value(service_name, object_path) + text = self._get_text(service_name, object_path) + + return RemoteProperty(value, text) + + def _call_remote(self, service_name, object_path, member, *args): + # type: (unicode, unicode, unicode, List[Any]) -> List[Any] + + return self._daemon.call_method(service_name, object_path, INTERFACE_BUS_ITEM, member, *args) + + def _parse_combined_path(self, combined_path): + # type: (str) -> (unicode,unicode,unicode) + + service_name, object_path = combined_path.lstrip('/').split('/', 1) + + if service_name == '': + raise Exception('Failed to parse service name. \ncombined_path must be of the form "service_name/path/to/property"') + if object_path == '': + raise Exception('Failed to parse object path. \ncombined_path must be of the form "service_name/path/to/property"') + + service_name = service_name if service_name.startswith(SERVICE_PREFIX) else SERVICE_PREFIX + service_name + + if not self._daemon.exists_service_with_name(service_name): + raise Exception('there is no service with the name "' + service_name + '" on the bus') + + object_path = '/' + object_path + + return unicode(service_name), unicode(object_path), unicode(service_name + object_path) diff --git a/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_dbus/private/remote_properties.pyc b/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_dbus/private/remote_properties.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f75fc363178f942f36d682873f1260f506752050 GIT binary patch literal 6455 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 X7yJc}3FCsd;?Mf!LfQMEuypBvK@xIS literal 0 HcmV?d00001 diff --git a/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_dbus/private/settings.py b/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_dbus/private/settings.py new file mode 100644 index 000000000..09a8ae859 --- /dev/null +++ b/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_dbus/private/settings.py @@ -0,0 +1,89 @@ +from logging import getLogger + +from python_libs.ie_dbus.private.dbus_types import dbus_string, dbus_int_variant, dbus_string_variant, dbus_double_variant, dbus_variant +from python_libs.ie_utils.mixins import Record +from python_libs.ie_dbus.private.dbus_daemon import DBusDaemon +from python_libs.ie_dbus.private.remote_properties import RemoteProperties +from python_libs.ie_dbus.private.ve_constants import SETTINGS_SERVICE, SETTINGS_INTERFACE, SETTINGS_PREFIX + +_log = getLogger(__name__) + +# noinspection PyUnreachableCode +if False: + from typing import Union, NoReturn, Optional, AnyStr + + +def prepend_settings_prefix(path): + # type: (AnyStr) -> any + + path = '/' + path.lstrip('/') + path = path if path.startswith(SETTINGS_PREFIX) else SETTINGS_PREFIX + path + return path + + +class Settings(Record): + + # noinspection PyProtectedMember + def __init__(self, daemon, remote_properties): + # type: (DBusDaemon, RemoteProperties) -> NoReturn + + self._daemon = daemon + self._remote_properties = remote_properties + + # noinspection PyShadowingBuiltins + + def add_setting(self, path, default_value, min=None, max=None, silent=False): + # type: (AnyStr, Union[unicode, int, float], Union[int, float, None], Union[int, float, None], Optional[bool]) -> NoReturn + + path = prepend_settings_prefix(path) + + if isinstance(default_value, int): + item_type = 'i' + elif isinstance(default_value, float): + item_type = 'f' + elif isinstance(default_value, (str, unicode)): + item_type = 's' + else: + raise Exception('Unsupported Settings Type') + + reply = self._daemon.call_method( + SETTINGS_SERVICE, # service_name + '/', # object_path + SETTINGS_INTERFACE, # interface + 'AddSilentSetting' if silent else 'AddSetting', # member, + dbus_string(''), # "group", not used + dbus_string(path), + dbus_variant(default_value), + dbus_string(item_type), + dbus_int_variant(min or 0), + dbus_int_variant(max or 0)) + + if reply[0] != 0: + raise Exception('failed to add setting ' + path) + + def exists(self, path): + # type: (unicode) -> bool + + path = prepend_settings_prefix(path) + return path in self.available_settings + + def get(self, path): + # type: (unicode) -> Union[unicode, int, float] + + path = prepend_settings_prefix(path) + return self._remote_properties.get(SETTINGS_SERVICE + path).value + + def set(self, path, value): + # type: (unicode, Union[unicode, int, float]) -> NoReturn + + path = prepend_settings_prefix(path) + self._remote_properties.set(SETTINGS_SERVICE + path, value) + + @property + def available_settings(self): + # type: () -> [unicode] + return self._remote_properties.available_properties(SETTINGS_SERVICE) + + def __contains__(self, path): + # type: (unicode) -> bool + return self.exists(path) diff --git a/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_dbus/private/settings.pyc b/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_dbus/private/settings.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8429dd6251cb4e566577ee0975a690c33d44b33b GIT binary patch literal 3664 zcmcImTTdHD6h7G4*$M?Kl-;D@CS|J>tdf_rpG`U;3f`u;MY=^pkK#F4j){H@Zc#i>{Z5-hO#b0d z$K#Q0akr!GlVWE_mz^3+^W4QR#wIkjO!6JOG@U284fmoliE?YNO^t5Rd3#)pU!?lf zj@QbjlMUS4>ugneP?WKo&++{6!?AfB>8!||4X;-`wfbpUjC5%eZ8|_q9P4jvZ*TR! z?T7sh^?d8mhP}#9PK{f=?G3g0fX$0%%}>?F=GG6LDmFpL&+??mZIeg6LTNiL-Q>HG zWqXubxcMMI=-YCDq@lrqN8HR^?wBu!M7uIz&{mE}<{sG!KrB0$<_%1FFnQeXRQRVo zi`}{|AiO6fYYPMzU=USlFq=7ZZWdmB+rXIo$GSvpgZ7* z$|6m5*&Q9&mqi|?$qUm>bO;!_qcYixtnM0ZErV>~CF7-&~aX7VyY#1i{0KvdL z@~?UCdXlUDpI^i{SihUXIf~pLf z;BH*Q7!@!_ab4{5r1~9zG(hsvkU#`)Zg6)fAcQ=SEQj*)z9g+DskRMX6~;m>p-ET@ ztvJNjd4)KPPKSc~Wc?MkonOwz3&sHPg<+B>HVkj^*uWX`TiyWK$5T|21pPM;ti;V} zI%2YM0xCke3YG68(MNU4A5QH)9kcx&@(%l*slAFC7&1}$X#gKF}7-WT_No8Ky;K#lmGR1RUqdpop~y@5cT>i^eDrScG>FrD>RHF4$N>n-zpW zK_e8DN`dlH1nMTHkYUawr$rB=aSDA-$IgX}eSj-jv@b+960y8Du{sMar$l_@icb$j zNu;|lIRQwVv8j~2$5V5MJM!C=MX%+dEqkp>yVCM}`NHD9i{5f&$r~WrX%o%^;Io`} zMZfFOt2)yHX>zshfWcW1?J;~2j-m;2M#Ny2zDtN4rKb!0CTHUeFZDSuy?D^n7rgBgZnLmJC$!UJ1_I&^dXC1O z?Nk2|zH=P_%}6&pTU;zs$tc}Rh~N|Wz|Fv6^3PWfgu?mnM0)DHIQ1z%yma#Lv4Hap zmy?JEGYr4yx%0Qule?*0Ey6I5G988@tznoI@t6xZR5%eWsM0HPCtjOTYP9OINg)6s zr$8zDOtOEVBsF(=!7S}Ex+t+z%e*&WH8>XPeye%)omL&+#agd(n{6WgDPObswgr&L ze#qUKtJ(VGYPLSPnyt%q87gg@{sUDdJd~nq^T$SD1e{|nYkG1mY9 literal 0 HcmV?d00001 diff --git a/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_dbus/private/ve_constants.py b/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_dbus/private/ve_constants.py new file mode 100644 index 000000000..b9e55df8e --- /dev/null +++ b/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_dbus/private/ve_constants.py @@ -0,0 +1,11 @@ + +SERVICE_PREFIX = 'com.victronenergy.' +VE_SERVICE_FILTER = SERVICE_PREFIX + '*' +INTERFACE_BUS_ITEM = SERVICE_PREFIX + 'BusItem' +PROPERTIES_CHANGED = 'PropertiesChanged' +GET_VALUE = 'GetValue' +SET_VALUE = 'SetValue' +GET_TEXT = 'GetText' +SETTINGS_SERVICE = 'com.victronenergy.settings' +SETTINGS_INTERFACE = 'com.victronenergy.Settings' +SETTINGS_PREFIX = '/Settings' diff --git a/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_dbus/private/ve_constants.pyc b/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_dbus/private/ve_constants.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9ef77bf14f0d663509129d02d2f9845bd664052d GIT binary patch literal 609 zcmZ`%+fKqj5FPFp9X6MXiTlhS!KYqMLGx&b;^nIe&^e9LG0iX!v;9BG?$`i_iEPyD0EP^P4EP*J2 zEQ2V6tbnM1tb(Y5tbwS3tV7T^$vR$9m?f*`HlAUcXr)y;-!(Bu@-0>yY`}V?pTl zT7xco#>}eAcsOqLN6fO|huNbN<7~q5!uoUW4Z6X>(l({~z4&8_=f}1CVH+gDZ!j)V zCt0HtYn^QOm*Avo8SUr7WnkE%yGv2Qf Txml`*?5DBUTh7&Km51(hWk`FZg NoReturn + + self.value = initial_value + self.length = length + + def update(self, value, length=None): + # type: (float, int) -> float + + if length is not None: + self.length = length + + self.value = (self.value * self.length + value) / (self.length + 1) + + _log.debug('real value: ' + str(value) + ', filtered value: ' + str(self.value)) + + return self.value + + +class DebounceFilter(object): + + def __init__(self, initial_state=None, max_inertia=10): + # type: (Optional[bool], Optional[int]) -> NoReturn + + self._max_inertia = max_inertia + self._inertia = max_inertia + self._state = initial_state + + def reset(self, state=None, max_inertia=None): + # type: (Optional[bool], Optional[int]) -> bool + + self._max_inertia = max_inertia or self._max_inertia + self._inertia = self._max_inertia + self._state = state or self._state + + _log.debug('debounce filter reset: state={0}, inertia={1}'.format(self._state, self._inertia)) + + return self._state + + def flip(self): + # type: () -> bool + self._state = not self._state + self._inertia = self._max_inertia + return self._state + + def update(self, new_state, max_inertia=None): + # type: (bool, int) -> bool + + if max_inertia is not None and max_inertia != self._max_inertia: + return self.reset(new_state, max_inertia) + + if new_state != self._state: + if self._inertia > 0: + self._inertia = self._inertia - 1 + else: + self.flip() + else: + self._inertia = min(self._inertia + 1, self._max_inertia) + + _log.debug('debounce filter update: state={0}, inertia={1}'.format(self._state, self._inertia)) + + return self._state diff --git a/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_utils/filters.pyc b/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_utils/filters.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1378e921c9974a0d4b6f20e596ce962acab1a56a GIT binary patch literal 2634 zcmb_eTW=dh6h1p^J8|lekdihP6*cf;L8+;DKwQdQeF7s*BqSoF)g~Uh>#TRp?l=&& zeQNj_`~rR+KLEb(j4vsoPl@Fn&zw1X=3Kt-jN`wzx4!&yl%B}q6XW+QJoPDtA-<91 zBGX8YB8i-ls;^Qbc`Vb095rOxl%u9Zg@}v9wd4hKH)I%#+mulx!-ialyb$^Ms4c_h zQrcQcw`8~>hrLalm;HlJFT%{XF^rx6z8sHT)iV@PV^CV>=T)JLA7?%*i!}E)vGYTD zmKEc#&s>#`-Qz6xu6ik`Z=h4Zi@^zF384**To^er^b#Il!1adM!(J15*;^d&$O)6e zhi-g}r@n>ZnUQBA2_}(F)aIdjKL`%f%2}Gvoo`{5yJGC0^k~O7Fw`y|S*rML3|W!+ zEX@o53CfBnCmQP{k~a|SZ3+-AX8X*5 z5g*G03B;tyYybhbkAMu*iNflz$72T>>s-^X%B6W%1OK#J??G_C8=`Q-rMSlo zYT5>6;WTZQR#cSaG%4(YWODQFn)SBJL?0WL21XWLI zZ^4ge;Wq%l zY{T~z-np-h^e_6oYNYQku#ak<#!_La{gCiSag7`XB1~f4&U70zgLXrzUzSTF2h2f3 ze*Hs5O NoReturn + + main_loop = gobject.MainLoop() + + def update(*args, **kwargs): + try: + update_action() + return True + + except Exception as e: + _log.error(e.message) + traceback.print_exc() + main_loop.quit() + return False + + gobject.timeout_add(update_period, update) + main_loop.run() \ No newline at end of file diff --git a/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_utils/main_loop.pyc b/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_utils/main_loop.pyc new file mode 100644 index 0000000000000000000000000000000000000000..419e953b19685be65878548f508891a1b51de255 GIT binary patch literal 1069 zcmb_b&2G~`5T3D}pQfoAdO@7H`h>3>%8!HqA(b2)Bv3A9V{eTU+iP~$&`9MJ1mz)k zN*(}aCMfCy)bUPcc4oi%zS$)Fb254M`%>lb{|V^(IW6~*OhGR~4bUJg5s>2m>HwC3 zH#!ESPr2X!EyxH0%!z1h8y7ayb(%bmxp*GFXD*oa|o%hAt$<>lxrRXZKC9@$s6bbd(D=Bv0&MDHifkd3NZ z>S{WFLQ&rp%Ii$!%qXS}a8Jl2luoL)HD7eAZMjWy;%iM^Ynyai|H%+UwQ@T)o{gk`A QDVZ5gaT*QrK`;&f0S?UODgXcg literal 0 HcmV?d00001 diff --git a/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_utils/mixins.py b/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_utils/mixins.py new file mode 100644 index 000000000..5e8bf3986 --- /dev/null +++ b/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_utils/mixins.py @@ -0,0 +1,115 @@ +from logging import getLogger +from _dbus_glib_bindings import DBusGMainLoop + +# noinspection PyUnreachableCode +if False: + from typing import Callable, NoReturn, List, AnyStr, Optional, Union + +_log = getLogger(__name__) + + +def nop(*_args): + pass + + +def memoize(fn): + + attr_name = '_memoized_' + fn.__name__ + + def _memoized(self): + if not hasattr(self, attr_name): + setattr(self, attr_name, fn(self)) + return getattr(self, attr_name) + + return _memoized + + +# noinspection PyAttributeOutsideInit +class Disposable(object): + + _dispose_actions = None # type: List[Callable[[],NoReturn]] + + def __enter__(self): + return self + + def __exit__(self, typ, value, tb): + self.dispose() + + def dispose(self): + # type: () -> NoReturn + + while self._dispose_actions: + dispose = self._dispose_actions.pop() + dispose() + + for k, v in self.__dict__.iteritems(): + if isinstance(v, Disposable) and v._dispose_actions: + _log.debug('disposing ' + type(self).__name__ + '.' + k) + v.dispose() + + def chain_disposable(self, dispose, message=None): + # type: (Union[Callable[[],None],Disposable], Optional[AnyStr]) -> NoReturn + + if self._dispose_actions is None: + self._dispose_actions = [] + + if isinstance(dispose, Disposable): + dispose = dispose.dispose + + if message is None: + self._dispose_actions.append(dispose) + return + + def dispose_with_log_msg(): + _log.debug('disposing ' + message) + dispose() + + # _log.debug('new disposable ' + message) + self._dispose_actions.append(dispose_with_log_msg) + + @classmethod + def create(cls, dispose_action, message=None): + # type: (Union[Callable[[],None],Disposable], Optional[AnyStr]) -> Disposable + + disposable = Disposable() + disposable.chain_disposable(dispose_action, message) + return disposable + + def create_dependent_disposable(self, dispose_action, message=None): + # type: (Union[Callable[[],None],Disposable], Optional[AnyStr]) -> Disposable + + disposable = Disposable.create(dispose_action, message) + self.chain_disposable(disposable) + return disposable + + +class Record(object): + + @memoize + def __str__(self): + return self.__class__.__name__ + ' ' + unicode(vars(self)) + + def __repr__(self): + return self.__str__() + + @memoize + def __hash__(self): + return self.__str__().__hash__() + + def __eq__(self, other): + # TODO: improve, iterable vars are not correctly handled + return str(other) == str(self) + + # make readonly + def __setattr__(self, key, value): + # type: (str, any) -> NoReturn + + if not key.startswith('_') and hasattr(self, key): # disallow redefining + raise ValueError(key + ' is read-only' + str(dir())) + + super(Record, self).__setattr__(key, value) + + +class RequiresMainLoop(object): + + main_loop = DBusGMainLoop(set_as_default=True) # initialized only once for all subclasses that need it diff --git a/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_utils/mixins.pyc b/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_utils/mixins.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8ff772726ce313afce96f0a5033155e0560bd6a7 GIT binary patch literal 4808 zcmb_gTXP&o6+Sbw7p*Rl>;x;|K$N(EEs9u#Dh#AjnAj$HF`}vkHf)9J8qKs;BhSvP zre}>sIWNdX!XrO`U&7Dg2f+88-d)M&aW&pPK7E<)bN%{^lK*V2-~ZQfn#uf0@c*yT z{J%kR{30nuCXtLHiP(>&jAfF@D3Qo@qB*=klfI1lGFg++noI^V8pvc_ zM(Z-!kkN)jm57VPZOR4q+>*Q_uS7;~N#0dvTk@W`9XXC9?{nlrp#rbwf*01x4Ij5q}*?#`JaKbA}>Y0fwy9TA}u!1E{*^LPhTKf;Q2Pb zT(>Xwou1dSGBIOc8{CU&WLcH&9)SVXF?c+ z_XS4tOR=~@11wj=xglRu5jAt#^Qk8B^R%3WcxsQXNA?gh?nTjBdk1GOM5jQMf$5}n z{3n%sd^)F5+PKB^ulvap}66?d+c5_f)NyK&k^zCN%^gYKHL1w4p0@fyR02X?h-l{xbc_o6v$S&!8dxjUMTbqKz3 z<|gLMEs#scX;)==ru6x>I81l_0S@wvB}q1s{u}Xo(Yw)yQATS}O8(F0VamCqV6A6s z(%hD@j#!{EREmj>ut)F)_|uL6cQFNooWJs9;p(meX}E3=zg|Lfq|lsPu7aoNFuZ=K zAasyH3VkS(0@r(BfX#>=xEx2RhjIMHA}g3cZ~8SL+6S01AA$sPa$&G^KqT+evC}EP z!fi!=FQVozMSDWG+le3F$G9SjL^mS6mW`@HqaW0jGkah(T7pbO#dJD#RsKd?7`o8> z5abOtbYd0J8S&W(Du;R46N7(>G0zZ{WINi7**2q{r~|ZqEoL5a-FHFY8@K}b%B<5{ z7iowfVHPfsR4q?KnID0uewtZX>08F;!hRv^R4+}dFix?8>R7rG`qIW(iB&Yjqm z&H(EDziM|d6~Yd6M9_#jA`o%^hp4@xV1m`bmv_l6wNzL(KjxTv@gs28qsndU6jZUf zW7ObIx#GqHOb7jvo6%Nupb)3f6N(`_sqQbPO3ypWX#Icd(eGFb|q1*~#sCHv&c*bKd?!|)y|28+@Nuuq(7OKW&b(3e9)`#Kr0L^~}63PRI z!cS`hUiYXILV3^;j%$U$aa0Sa5JI&OYW6;h0p42~F9J5E=R-9AJrKHk0X@4wKm;v@ zuoZs0bHq}>-U~4uZg;g8EXyp?i+WZSS)Dt*0-mRh*9zCAh6YJ;B!+ zdLd<2NEA&4Yu%Z(8Ma%vnNqSXBbUa8sEAyo0R-M`?$1AGr~ry7bOBIYQ*J* zD#WYxZ;{^iU6xr?6Qx<7Yv-VjBwKt`QD^J<1-e)GJ)mm-QC*eiL;77o1_e>mdftgf z3oM4;6IP|aX_~q*pKu)o&x=Ma){ zW<}%t;!8inI(=vx%HelGuA-sCH6;-~mVj{@po~e_)TSPH#&J3;TgARBis~{3((fC5 zJP^(%EDuWlWdWTlx~`(;BkXjBrV-qW4~8ra6e&?VjZv2y^rfZMZGJTKc8ot2*rTG# zG3Sj6Nznd0Euju?aTL~kjY(@XR;YvF8pCNrgbZqaK#q#3Q}yNg=+tFxxV{;EhVosX ix(Z#NhWqwclwHfKooFZNMIXnT$)GdXy7kGe+y4U#=Euwc literal 0 HcmV?d00001 diff --git a/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_utils/utils.py b/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_utils/utils.py new file mode 100644 index 000000000..87177f9ef --- /dev/null +++ b/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_utils/utils.py @@ -0,0 +1,44 @@ +from logging import getLogger +import re + +# noinspection PyUnreachableCode +if False: + from typing import Dict + +_log = getLogger(__name__) + + +def make2way(dic): + # type: (Dict) -> Dict + for k, v in dic.items(): + dic[v] = k + + return dic + + +def invert_dict(src_dic): + # type: (Dict) -> Dict + dic = dict() + + for k, v in src_dic.items(): + dic[v] = k + + return dic + + +def enum_file_name_of(path): + # type: (str) -> Dict[int,str] + + """ + This is kinda hacky, but it works :) + The enum file must contain a single enum however! + """ + + path = path[0:-1] if path.endswith('.pyc') else path + pattern = re.compile(r"^\s*(\w+)\s*=\s*(\d+)", re.M) + with open(path, "r") as f: + return { + int(m[1]): m[0] + for m + in pattern.findall(f.read()) + } diff --git a/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_utils/utils.pyc b/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/ie_utils/utils.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f5768cf652a6b5cf2fb4649e9c7731eafe03e00b GIT binary patch literal 1530 zcmb_c-%k@k5T3nj3s(Vu5Qrp_9EQYJ3^hg{G>9e;pOnPb1cTst^tSENyS;L|r8a>l zeD}d;|4RP={bozRKcJV}xtZD7+5Kj|J^#;q_08{2+@`C?!}l$Q`38~T6_gTXf(`@; zwmnKcI`ByPRJ?EzKBXnf%5+dBp^2m*S)og;n4zRZKZp)yDJeT8prqoIDko~yX0VC+ zi>D@_*#M#|?fbmjmBrq~SAuU>wQZXtd<=H%V3-Yv@9T6_ z+7@}5%AzqC+g`4tR2`d!lF`tr)HIyj#MCTSXK`OX8^z;W&`kw`ycMzFIYbR*Q=@$38oo9pXIxNHc1Y*x!Ye#&k z6Ejk_=T1;aM??-sE!}B8IJV{ksohkETal*DS;#n<+)gg%AVw0V4iqa3?N)cDg~i@Q zX6|CdU5<2|$tdrv!s$@b>_f36?s*lj#x!^5Nb!$C_nWY(d7Hg_o!-T%k(Qfi#{-^r zzcnUZG|3t{Y!OyBIjR}3xDRmy#c5Oc>1<_rGEC(*AHgg@+!1qrMJ#%AelQzU{{cRC BNB{r; literal 0 HcmV?d00001 diff --git a/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/pysnooper/__init__.py b/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/pysnooper/__init__.py new file mode 100644 index 000000000..a9315e02d --- /dev/null +++ b/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/pysnooper/__init__.py @@ -0,0 +1,30 @@ +# Copyright 2019 Ram Rachum and collaborators. +# This program is distributed under the MIT license. +''' +PySnooper - Never use print for debugging again + +Usage: + + import pysnooper + + @pysnooper.snoop() + def your_function(x): + ... + +A log will be written to stderr showing the lines executed and variables +changed in the decorated function. + +For more information, see https://github.com/cool-RR/PySnooper +''' + +from .tracer import Tracer as snoop +from .variables import Attrs, Exploding, Indices, Keys +import collections + +__VersionInfo = collections.namedtuple('VersionInfo', + ('major', 'minor', 'micro')) + +__version__ = '0.4.0' +__version_info__ = __VersionInfo(*(map(int, __version__.split('.')))) + +del collections, __VersionInfo # Avoid polluting the namespace diff --git a/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/pysnooper/pycompat.py b/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/pysnooper/pycompat.py new file mode 100644 index 000000000..247dbde57 --- /dev/null +++ b/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/pysnooper/pycompat.py @@ -0,0 +1,95 @@ +# Copyright 2019 Ram Rachum and collaborators. +# This program is distributed under the MIT license. +'''Python 2/3 compatibility''' + +import abc +import os +import inspect +import sys +import datetime as datetime_module + +PY3 = (sys.version_info[0] == 3) +PY2 = not PY3 + +if hasattr(abc, 'ABC'): + ABC = abc.ABC +else: + class ABC(object): + """Helper class that provides a standard way to create an ABC using + inheritance. + """ + __metaclass__ = abc.ABCMeta + __slots__ = () + + +if hasattr(os, 'PathLike'): + PathLike = os.PathLike +else: + class PathLike(ABC): + """Abstract base class for implementing the file system path protocol.""" + + @abc.abstractmethod + def __fspath__(self): + """Return the file system path representation of the object.""" + raise NotImplementedError + + @classmethod + def __subclasshook__(cls, subclass): + return ( + hasattr(subclass, '__fspath__') or + # Make a concession for older `pathlib` versions:g + (hasattr(subclass, 'open') and + 'path' in subclass.__name__.lower()) + ) + + +try: + iscoroutinefunction = inspect.iscoroutinefunction +except AttributeError: + iscoroutinefunction = lambda whatever: False # Lolz + +try: + isasyncgenfunction = inspect.isasyncgenfunction +except AttributeError: + isasyncgenfunction = lambda whatever: False # Lolz + + +if PY3: + string_types = (str,) + text_type = str +else: + string_types = (basestring,) + text_type = unicode + +try: + from collections import abc as collections_abc +except ImportError: # Python 2.7 + import collections as collections_abc + +if sys.version_info[:2] >= (3, 6): + time_isoformat = datetime_module.time.isoformat +else: + def time_isoformat(time, timespec='microseconds'): + assert isinstance(time, datetime_module.time) + if timespec != 'microseconds': + raise NotImplementedError + result = '{:02d}:{:02d}:{:02d}.{:06d}'.format( + time.hour, time.minute, time.second, time.microsecond + ) + assert len(result) == 15 + return result + + +def timedelta_format(timedelta): + time = (datetime_module.datetime.min + timedelta).time() + return time_isoformat(time, timespec='microseconds') + +def timedelta_parse(s): + hours, minutes, seconds, microseconds = map( + int, + s.replace('.', ':').split(':') + ) + return datetime_module.timedelta(hours=hours, minutes=minutes, + seconds=seconds, + microseconds=microseconds) + diff --git a/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/pysnooper/tracer.py b/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/pysnooper/tracer.py new file mode 100644 index 000000000..1316f18d2 --- /dev/null +++ b/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/pysnooper/tracer.py @@ -0,0 +1,498 @@ +# Copyright 2019 Ram Rachum and collaborators. +# This program is distributed under the MIT license. + +import functools +import inspect +import opcode +import os +import sys +import re +import collections +import datetime as datetime_module +import itertools +import threading +import traceback + +from .variables import CommonVariable, Exploding, BaseVariable +from . import utils, pycompat +if pycompat.PY2: + from io import open + + +ipython_filename_pattern = re.compile('^$') + + +def get_local_reprs(frame, watch=(), custom_repr=(), max_length=None, normalize=False): + code = frame.f_code + vars_order = (code.co_varnames + code.co_cellvars + code.co_freevars + + tuple(frame.f_locals.keys())) + + result_items = [(key, utils.get_shortish_repr(value, custom_repr, + max_length, normalize)) + for key, value in frame.f_locals.items()] + result_items.sort(key=lambda key_value: vars_order.index(key_value[0])) + result = collections.OrderedDict(result_items) + + for variable in watch: + result.update(sorted(variable.items(frame, normalize))) + return result + + +class UnavailableSource(object): + def __getitem__(self, i): + return u'SOURCE IS UNAVAILABLE' + + +source_and_path_cache = {} + + +def get_path_and_source_from_frame(frame): + globs = frame.f_globals or {} + module_name = globs.get('__name__') + file_name = frame.f_code.co_filename + cache_key = (module_name, file_name) + try: + return source_and_path_cache[cache_key] + except KeyError: + pass + loader = globs.get('__loader__') + + source = None + if hasattr(loader, 'get_source'): + try: + source = loader.get_source(module_name) + except ImportError: + pass + if source is not None: + source = source.splitlines() + if source is None: + ipython_filename_match = ipython_filename_pattern.match(file_name) + if ipython_filename_match: + entry_number = int(ipython_filename_match.group(1)) + try: + import IPython + ipython_shell = IPython.get_ipython() + ((_, _, source_chunk),) = ipython_shell.history_manager. \ + get_range(0, entry_number, entry_number + 1) + source = source_chunk.splitlines() + except Exception: + pass + else: + try: + with open(file_name, 'rb') as fp: + source = fp.read().splitlines() + except utils.file_reading_errors: + pass + if not source: + # We used to check `if source is None` but I found a rare bug where it + # was empty, but not `None`, so now we check `if not source`. + source = UnavailableSource() + + # If we just read the source from a file, or if the loader did not + # apply tokenize.detect_encoding to decode the source into a + # string, then we should do that ourselves. + if isinstance(source[0], bytes): + encoding = 'utf-8' + for line in source[:2]: + # File coding may be specified. Match pattern from PEP-263 + # (https://www.python.org/dev/peps/pep-0263/) + match = re.search(br'coding[:=]\s*([-\w.]+)', line) + if match: + encoding = match.group(1).decode('ascii') + break + source = [pycompat.text_type(sline, encoding, 'replace') for sline in + source] + + result = (file_name, source) + source_and_path_cache[cache_key] = result + return result + + +def get_write_function(output, overwrite): + is_path = isinstance(output, (pycompat.PathLike, str)) + if overwrite and not is_path: + raise Exception('`overwrite=True` can only be used when writing ' + 'content to file.') + if output is None: + def write(s): + stderr = sys.stderr + try: + stderr.write(s) + except UnicodeEncodeError: + # God damn Python 2 + stderr.write(utils.shitcode(s)) + elif is_path: + return FileWriter(output, overwrite).write + elif callable(output): + write = output + else: + assert isinstance(output, utils.WritableStream) + + def write(s): + output.write(s) + return write + + +class FileWriter(object): + def __init__(self, path, overwrite): + self.path = pycompat.text_type(path) + self.overwrite = overwrite + + def write(self, s): + with open(self.path, 'w' if self.overwrite else 'a', + encoding='utf-8') as output_file: + output_file.write(s) + self.overwrite = False + + +thread_global = threading.local() +DISABLED = bool(os.getenv('PYSNOOPER_DISABLED', '')) + +class Tracer: + ''' + Snoop on the function, writing everything it's doing to stderr. + + This is useful for debugging. + + When you decorate a function with `@pysnooper.snoop()` + or wrap a block of code in `with pysnooper.snoop():`, you'll get a log of + every line that ran in the function and a play-by-play of every local + variable that changed. + + If stderr is not easily accessible for you, you can redirect the output to + a file:: + + @pysnooper.snoop('/my/log/file.log') + + See values of some expressions that aren't local variables:: + + @pysnooper.snoop(watch=('foo.bar', 'self.x["whatever"]')) + + Expand values to see all their attributes or items of lists/dictionaries: + + @pysnooper.snoop(watch_explode=('foo', 'self')) + + (see Advanced Usage in the README for more control) + + Show snoop lines for functions that your function calls:: + + @pysnooper.snoop(depth=2) + + Start all snoop lines with a prefix, to grep for them easily:: + + @pysnooper.snoop(prefix='ZZZ ') + + On multi-threaded apps identify which thread are snooped in output:: + + @pysnooper.snoop(thread_info=True) + + Customize how values are represented as strings:: + + @pysnooper.snoop(custom_repr=((type1, custom_repr_func1), + (condition2, custom_repr_func2), ...)) + + Variables and exceptions get truncated to 100 characters by default. You + can customize that: + + @pysnooper.snoop(max_variable_length=200) + + You can also use `max_variable_length=None` to never truncate them. + + Show timestamps relative to start time rather than wall time:: + + @pysnooper.snoop(relative_time=True) + + ''' + def __init__(self, output=None, watch=(), watch_explode=(), depth=1, + prefix='', overwrite=False, thread_info=False, custom_repr=(), + max_variable_length=100, normalize=False, relative_time=False): + self._write = get_write_function(output, overwrite) + + self.watch = [ + v if isinstance(v, BaseVariable) else CommonVariable(v) + for v in utils.ensure_tuple(watch) + ] + [ + v if isinstance(v, BaseVariable) else Exploding(v) + for v in utils.ensure_tuple(watch_explode) + ] + self.frame_to_local_reprs = {} + self.start_times = {} + self.depth = depth + self.prefix = prefix + self.thread_info = thread_info + self.thread_info_padding = 0 + assert self.depth >= 1 + self.target_codes = set() + self.target_frames = set() + self.thread_local = threading.local() + if len(custom_repr) == 2 and not all(isinstance(x, + pycompat.collections_abc.Iterable) for x in custom_repr): + custom_repr = (custom_repr,) + self.custom_repr = custom_repr + self.last_source_path = None + self.max_variable_length = max_variable_length + self.normalize = normalize + self.relative_time = relative_time + + def __call__(self, function_or_class): + if DISABLED: + return function_or_class + + if inspect.isclass(function_or_class): + return self._wrap_class(function_or_class) + else: + return self._wrap_function(function_or_class) + + def _wrap_class(self, cls): + for attr_name, attr in cls.__dict__.items(): + # Coroutines are functions, but snooping them is not supported + # at the moment + if pycompat.iscoroutinefunction(attr): + continue + + if inspect.isfunction(attr): + setattr(cls, attr_name, self._wrap_function(attr)) + return cls + + def _wrap_function(self, function): + self.target_codes.add(function.__code__) + + @functools.wraps(function) + def simple_wrapper(*args, **kwargs): + with self: + return function(*args, **kwargs) + + @functools.wraps(function) + def generator_wrapper(*args, **kwargs): + gen = function(*args, **kwargs) + method, incoming = gen.send, None + while True: + with self: + try: + outgoing = method(incoming) + except StopIteration: + return + try: + method, incoming = gen.send, (yield outgoing) + except Exception as e: + method, incoming = gen.throw, e + + if pycompat.iscoroutinefunction(function): + raise NotImplementedError + if pycompat.isasyncgenfunction(function): + raise NotImplementedError + elif inspect.isgeneratorfunction(function): + return generator_wrapper + else: + return simple_wrapper + + def write(self, s): + s = u'{self.prefix}{s}\n'.format(**locals()) + self._write(s) + + def __enter__(self): + if DISABLED: + return + calling_frame = inspect.currentframe().f_back + if not self._is_internal_frame(calling_frame): + calling_frame.f_trace = self.trace + self.target_frames.add(calling_frame) + + stack = self.thread_local.__dict__.setdefault( + 'original_trace_functions', [] + ) + stack.append(sys.gettrace()) + self.start_times[calling_frame] = datetime_module.datetime.now() + sys.settrace(self.trace) + + def __exit__(self, exc_type, exc_value, exc_traceback): + if DISABLED: + return + stack = self.thread_local.original_trace_functions + sys.settrace(stack.pop()) + calling_frame = inspect.currentframe().f_back + self.target_frames.discard(calling_frame) + self.frame_to_local_reprs.pop(calling_frame, None) + + ### Writing elapsed time: ############################################# + # # + start_time = self.start_times.pop(calling_frame) + duration = datetime_module.datetime.now() - start_time + elapsed_time_string = pycompat.timedelta_format(duration) + indent = ' ' * 4 * (thread_global.depth + 1) + self.write( + '{indent}Elapsed time: {elapsed_time_string}'.format(**locals()) + ) + # # + ### Finished writing elapsed time. #################################### + + def _is_internal_frame(self, frame): + return frame.f_code.co_filename == Tracer.__enter__.__code__.co_filename + + def set_thread_info_padding(self, thread_info): + current_thread_len = len(thread_info) + self.thread_info_padding = max(self.thread_info_padding, + current_thread_len) + return thread_info.ljust(self.thread_info_padding) + + def trace(self, frame, event, arg): + + ### Checking whether we should trace this line: ####################### + # # + # We should trace this line either if it's in the decorated function, + # or the user asked to go a few levels deeper and we're within that + # number of levels deeper. + + if not (frame.f_code in self.target_codes or frame in self.target_frames): + if self.depth == 1: + # We did the most common and quickest check above, because the + # trace function runs so incredibly often, therefore it's + # crucial to hyper-optimize it for the common case. + return None + elif self._is_internal_frame(frame): + return None + else: + _frame_candidate = frame + for i in range(1, self.depth): + _frame_candidate = _frame_candidate.f_back + if _frame_candidate is None: + return None + elif _frame_candidate.f_code in self.target_codes or _frame_candidate in self.target_frames: + break + else: + return None + + thread_global.__dict__.setdefault('depth', -1) + if event == 'call': + thread_global.depth += 1 + indent = ' ' * 4 * thread_global.depth + + # # + ### Finished checking whether we should trace this line. ############## + + ### Making timestamp: ################################################# + # # + if self.normalize: + timestamp = ' ' * 15 + elif self.relative_time: + try: + start_time = self.start_times[frame] + except KeyError: + start_time = self.start_times[frame] = \ + datetime_module.datetime.now() + duration = datetime_module.datetime.now() - start_time + timestamp = pycompat.timedelta_format(duration) + else: + timestamp = pycompat.time_isoformat( + datetime_module.datetime.now().time(), + timespec='microseconds' + ) + # # + ### Finished making timestamp. ######################################## + + line_no = frame.f_lineno + source_path, source = get_path_and_source_from_frame(frame) + source_path = source_path if not self.normalize else os.path.basename(source_path) + if self.last_source_path != source_path: + self.write(u'{indent}Source path:... {source_path}'. + format(**locals())) + self.last_source_path = source_path + source_line = source[line_no - 1] + thread_info = "" + if self.thread_info: + if self.normalize: + raise NotImplementedError("normalize is not supported with " + "thread_info") + current_thread = threading.current_thread() + thread_info = "{ident}-{name} ".format( + ident=current_thread.ident, name=current_thread.getName()) + thread_info = self.set_thread_info_padding(thread_info) + + ### Reporting newish and modified variables: ########################## + # # + old_local_reprs = self.frame_to_local_reprs.get(frame, {}) + self.frame_to_local_reprs[frame] = local_reprs = \ + get_local_reprs(frame, + watch=self.watch, custom_repr=self.custom_repr, + max_length=self.max_variable_length, + normalize=self.normalize, + ) + + newish_string = ('Starting var:.. ' if event == 'call' else + 'New var:....... ') + + for name, value_repr in local_reprs.items(): + if name not in old_local_reprs: + self.write('{indent}{newish_string}{name} = {value_repr}'.format( + **locals())) + elif old_local_reprs[name] != value_repr: + self.write('{indent}Modified var:.. {name} = {value_repr}'.format( + **locals())) + + # # + ### Finished newish and modified variables. ########################### + + + ### Dealing with misplaced function definition: ####################### + # # + if event == 'call' and source_line.lstrip().startswith('@'): + # If a function decorator is found, skip lines until an actual + # function definition is found. + for candidate_line_no in itertools.count(line_no): + try: + candidate_source_line = source[candidate_line_no - 1] + except IndexError: + # End of source file reached without finding a function + # definition. Fall back to original source line. + break + + if candidate_source_line.lstrip().startswith('def'): + # Found the def line! + line_no = candidate_line_no + source_line = candidate_source_line + break + # # + ### Finished dealing with misplaced function definition. ############## + + # If a call ends due to an exception, we still get a 'return' event + # with arg = None. This seems to be the only way to tell the difference + # https://stackoverflow.com/a/12800909/2482744 + code_byte = frame.f_code.co_code[frame.f_lasti] + if not isinstance(code_byte, int): + code_byte = ord(code_byte) + ended_by_exception = ( + event == 'return' + and arg is None + and (opcode.opname[code_byte] + not in ('RETURN_VALUE', 'YIELD_VALUE')) + ) + + if ended_by_exception: + self.write('{indent}Call ended by exception'. + format(**locals())) + else: + self.write(u'{indent}{timestamp} {thread_info}{event:9} ' + u'{line_no:4} {source_line}'.format(**locals())) + + if event == 'return': + self.frame_to_local_reprs.pop(frame, None) + self.start_times.pop(frame, None) + thread_global.depth -= 1 + + if not ended_by_exception: + return_value_repr = utils.get_shortish_repr(arg, + custom_repr=self.custom_repr, + max_length=self.max_variable_length, + normalize=self.normalize, + ) + self.write('{indent}Return value:.. {return_value_repr}'. + format(**locals())) + + if event == 'exception': + exception = '\n'.join(traceback.format_exception_only(*arg[:2])).strip() + if self.max_variable_length: + exception = utils.truncate(exception, self.max_variable_length) + self.write('{indent}{exception}'. + format(**locals())) + + return self.trace diff --git a/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/pysnooper/utils.py b/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/pysnooper/utils.py new file mode 100644 index 000000000..ff9b9e855 --- /dev/null +++ b/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/pysnooper/utils.py @@ -0,0 +1,98 @@ +# Copyright 2019 Ram Rachum and collaborators. +# This program is distributed under the MIT license. + +import abc +import re + +import sys +from .pycompat import ABC, string_types, collections_abc + +def _check_methods(C, *methods): + mro = C.__mro__ + for method in methods: + for B in mro: + if method in B.__dict__: + if B.__dict__[method] is None: + return NotImplemented + break + else: + return NotImplemented + return True + + +class WritableStream(ABC): + @abc.abstractmethod + def write(self, s): + pass + + @classmethod + def __subclasshook__(cls, C): + if cls is WritableStream: + return _check_methods(C, 'write') + return NotImplemented + + + +file_reading_errors = ( + IOError, + OSError, + ValueError # IronPython weirdness. +) + + + +def shitcode(s): + return ''.join( + (c if (0 < ord(c) < 256) else '?') for c in s + ) + + +def get_repr_function(item, custom_repr): + for condition, action in custom_repr: + if isinstance(condition, type): + condition = lambda x, y=condition: isinstance(x, y) + if condition(item): + return action + return repr + + +DEFAULT_REPR_RE = re.compile(r' at 0x[a-f0-9A-F]{4,}') + + +def normalize_repr(item_repr): + """Remove memory address (0x...) from a default python repr""" + return DEFAULT_REPR_RE.sub('', item_repr) + + +def get_shortish_repr(item, custom_repr=(), max_length=None, normalize=False): + repr_function = get_repr_function(item, custom_repr) + try: + r = repr_function(item) + except Exception: + r = 'REPR FAILED' + r = r.replace('\r', '').replace('\n', '') + if normalize: + r = normalize_repr(r) + if max_length: + r = truncate(r, max_length) + return r + + +def truncate(string, max_length): + if (max_length is None) or (len(string) <= max_length): + return string + else: + left = (max_length - 3) // 2 + right = max_length - 3 - left + return u'{}...{}'.format(string[:left], string[-right:]) + + +def ensure_tuple(x): + if isinstance(x, collections_abc.Iterable) and \ + not isinstance(x, string_types): + return tuple(x) + else: + return (x,) + + + diff --git a/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/pysnooper/variables.py b/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/pysnooper/variables.py new file mode 100644 index 000000000..2229c38aa --- /dev/null +++ b/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/python_libs/pysnooper/variables.py @@ -0,0 +1,133 @@ +import itertools +import abc +try: + from collections.abc import Mapping, Sequence +except ImportError: + from collections import Mapping, Sequence +from copy import deepcopy + +from . import utils +from . import pycompat + + +def needs_parentheses(source): + def code(s): + return compile(s, '', 'eval').co_code + + return code('{}.x'.format(source)) != code('({}).x'.format(source)) + + +class BaseVariable(pycompat.ABC): + def __init__(self, source, exclude=()): + self.source = source + self.exclude = utils.ensure_tuple(exclude) + self.code = compile(source, '', 'eval') + if needs_parentheses(source): + self.unambiguous_source = '({})'.format(source) + else: + self.unambiguous_source = source + + def items(self, frame, normalize=False): + try: + main_value = eval(self.code, frame.f_globals or {}, frame.f_locals) + except Exception: + return () + return self._items(main_value, normalize) + + @abc.abstractmethod + def _items(self, key, normalize=False): + raise NotImplementedError + + @property + def _fingerprint(self): + return (type(self), self.source, self.exclude) + + def __hash__(self): + return hash(self._fingerprint) + + def __eq__(self, other): + return (isinstance(other, BaseVariable) and + self._fingerprint == other._fingerprint) + + +class CommonVariable(BaseVariable): + def _items(self, main_value, normalize=False): + result = [(self.source, utils.get_shortish_repr(main_value, normalize=normalize))] + for key in self._safe_keys(main_value): + try: + if key in self.exclude: + continue + value = self._get_value(main_value, key) + except Exception: + continue + result.append(( + '{}{}'.format(self.unambiguous_source, self._format_key(key)), + utils.get_shortish_repr(value) + )) + return result + + def _safe_keys(self, main_value): + try: + for key in self._keys(main_value): + yield key + except Exception: + pass + + def _keys(self, main_value): + return () + + def _format_key(self, key): + raise NotImplementedError + + def _get_value(self, main_value, key): + raise NotImplementedError + + +class Attrs(CommonVariable): + def _keys(self, main_value): + return itertools.chain( + getattr(main_value, '__dict__', ()), + getattr(main_value, '__slots__', ()) + ) + + def _format_key(self, key): + return '.' + key + + def _get_value(self, main_value, key): + return getattr(main_value, key) + + +class Keys(CommonVariable): + def _keys(self, main_value): + return main_value.keys() + + def _format_key(self, key): + return '[{}]'.format(utils.get_shortish_repr(key)) + + def _get_value(self, main_value, key): + return main_value[key] + + +class Indices(Keys): + _slice = slice(None) + + def _keys(self, main_value): + return range(len(main_value))[self._slice] + + def __getitem__(self, item): + assert isinstance(item, slice) + result = deepcopy(self) + result._slice = item + return result + + +class Exploding(BaseVariable): + def _items(self, main_value, normalize=False): + if isinstance(main_value, Mapping): + cls = Keys + elif isinstance(main_value, Sequence): + cls = Indices + else: + cls = Attrs + + return cls(self.source, self.exclude)._items(main_value, normalize) diff --git a/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/service/down b/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/service/down new file mode 100644 index 000000000..e69de29bb diff --git a/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/service/log/down b/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/service/log/down new file mode 100644 index 000000000..e69de29bb diff --git a/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/service/log/run b/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/service/log/run new file mode 100755 index 000000000..74e759d9b --- /dev/null +++ b/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/service/log/run @@ -0,0 +1,3 @@ +#!/bin/sh +exec 2>&1 +exec multilog t s25000 n4 /var/log/dbus-fzsonick-48tl.TTY diff --git a/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/service/run b/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/service/run new file mode 100755 index 000000000..7f5301435 --- /dev/null +++ b/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/service/run @@ -0,0 +1,4 @@ +#!/bin/sh +exec 2>&1 + +exec softlimit -d 100000000 -s 1000000 -a 100000000 /opt/innovenergy/dbus-fzsonick-48tl/start.sh TTY diff --git a/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/signals.py b/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/signals.py new file mode 100644 index 000000000..163a83a65 --- /dev/null +++ b/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/signals.py @@ -0,0 +1,214 @@ +# coding=utf-8 + +import config as cfg +from convert import mean, read_float, read_led_state, read_bool, count_bits, comma_separated +from data import BatterySignal, Battery, LedColor, ServiceSignal, BatteryStatus, LedState + +# noinspection PyUnreachableCode +if False: + from typing import List, Iterable + + +def init_service_signals(batteries): + # type: (List[Battery]) -> Iterable[ServiceSignal] + + n_batteries = len(batteries) + product_name = cfg.PRODUCT_NAME + ' x' + str(n_batteries) + + return [ + ServiceSignal('/NbOfBatteries', n_batteries), # TODO: nb of operational batteries + ServiceSignal('/Mgmt/ProcessName', __file__), + ServiceSignal('/Mgmt/ProcessVersion', cfg.SOFTWARE_VERSION), + ServiceSignal('/Mgmt/Connection', cfg.CONNECTION), + ServiceSignal('/DeviceInstance', cfg.DEVICE_INSTANCE), + ServiceSignal('/ProductName', product_name), + ServiceSignal('/ProductId', cfg.PRODUCT_ID), + ServiceSignal('/Connected', 1) + ] + + +def init_battery_signals(): + # type: () -> Iterable[BatterySignal] + + read_voltage = read_float(register=999, scale_factor=0.01, offset=0) + read_current = read_float(register=1000, scale_factor=0.01, offset=-10000) + + read_led_amber = read_led_state(register=1004, led=LedColor.amber) + read_led_green = read_led_state(register=1004, led=LedColor.green) + read_led_blue = read_led_state(register=1004, led=LedColor.blue) + read_led_red = read_led_state(register=1004, led=LedColor.red) + + def read_power(status): + # type: (BatteryStatus) -> int + return int(read_current(status) * read_voltage(status)) + + def calc_power_limit_imposed_by_voltage_limit(v, i, v_limit, r_int): + # type: (float, float, float, float) -> float + + dv = v_limit - v + di = dv / r_int + p_limit = v_limit * (i + di) + + return p_limit + + def calc_power_limit_imposed_by_current_limit(v, i, i_limit, r_int): + # type: (float, float, float, float) -> float + + di = i_limit - i + dv = di * r_int + p_limit = i_limit * (v + dv) + + return p_limit + + def calc_max_charge_power(bs): + # type: (BatteryStatus) -> int + + b = bs.battery + v = read_voltage(bs) + i = read_current(bs) + + p_limits = [ + calc_power_limit_imposed_by_voltage_limit(v, i, b.v_max, b.r_int_min), + calc_power_limit_imposed_by_voltage_limit(v, i, b.v_max, b.r_int_max), + calc_power_limit_imposed_by_current_limit(v, i, b.i_max, b.r_int_min), + calc_power_limit_imposed_by_current_limit(v, i, b.i_max, b.r_int_max), + ] + + p_limit = min(p_limits) # p_limit is normally positive here (signed) + p_limit = max(p_limit, 0) # charge power must not become negative + + return int(p_limit) + + def calc_max_discharge_power(bs): + # type: (BatteryStatus) -> float + + b = bs.battery + v = read_voltage(bs) + i = read_current(bs) + + p_limits = [ + calc_power_limit_imposed_by_voltage_limit(v, i, b.v_min, b.r_int_min), + calc_power_limit_imposed_by_voltage_limit(v, i, b.v_min, b.r_int_max), + calc_power_limit_imposed_by_current_limit(v, i, -b.i_max, b.r_int_min), + calc_power_limit_imposed_by_current_limit(v, i, -b.i_max, b.r_int_max), + ] + + p_limit = max(p_limits) # p_limit is normally negative here (signed) + p_limit = min(p_limit, 0) # discharge power must not become positive + + return int(-p_limit) # make unsigned! + + def read_battery_cold(status): + return \ + read_led_green(status) >= LedState.blinking_slow and \ + read_led_blue(status) >= LedState.blinking_slow + + def read_soc(status): + soc = read_float(register=1053, scale_factor=0.1, offset=0)(status) + + # if the SOC is 100 but EOC is not yet reached, report 99.9 instead of 100 + if soc > 99.9 and not read_eoc_reached(status): + return 99.9 + if soc >= 99.9 and read_eoc_reached(status): + return 100 + + return soc + + def read_eoc_reached(status): + return \ + read_led_green(status) == LedState.on and \ + read_led_amber(status) == LedState.off and \ + read_led_blue(status) == LedState.off + + return [ + BatterySignal('/Dc/0/Voltage', mean, get_value=read_voltage, unit='V'), + BatterySignal('/Dc/0/Current', sum, get_value=read_current, unit='A'), + BatterySignal('/Dc/0/Power', sum, get_value=read_power, unit='W'), + + BatterySignal('/BussVoltage', mean, read_float(register=1001, scale_factor=0.01, offset=0), unit='V'), + BatterySignal('/Soc', mean, read_soc, unit='%'), + BatterySignal('/Dc/0/Temperature', mean, read_float(register=1003, scale_factor=0.1, offset=-400), unit='C'), + + BatterySignal('/NumberOfWarningFlags', sum, count_bits(base_register=1005, nb_of_registers=3, nb_of_bits=47)), + BatterySignal('/WarningFlags/TaM1', any, read_bool(base_register=1005, bit=1)), + BatterySignal('/WarningFlags/TbM1', any, read_bool(base_register=1005, bit=4)), + BatterySignal('/WarningFlags/VBm1', any, read_bool(base_register=1005, bit=6)), + BatterySignal('/WarningFlags/VBM1', any, read_bool(base_register=1005, bit=8)), + BatterySignal('/WarningFlags/IDM1', any, read_bool(base_register=1005, bit=10)), + BatterySignal('/WarningFlags/vsM1', any, read_bool(base_register=1005, bit=24)), + BatterySignal('/WarningFlags/iCM1', any, read_bool(base_register=1005, bit=26)), + BatterySignal('/WarningFlags/iDM1', any, read_bool(base_register=1005, bit=28)), + BatterySignal('/WarningFlags/MID1', any, read_bool(base_register=1005, bit=30)), + BatterySignal('/WarningFlags/BLPW', any, read_bool(base_register=1005, bit=32)), + BatterySignal('/WarningFlags/Ah_W', any, read_bool(base_register=1005, bit=35)), + BatterySignal('/WarningFlags/MPMM', any, read_bool(base_register=1005, bit=38)), + BatterySignal('/WarningFlags/TCMM', any, read_bool(base_register=1005, bit=39)), + BatterySignal('/WarningFlags/TCdi', any, read_bool(base_register=1005, bit=40)), + BatterySignal('/WarningFlags/WMTO', any, read_bool(base_register=1005, bit=41)), + BatterySignal('/WarningFlags/bit44', any, read_bool(base_register=1005, bit=44)), + BatterySignal('/WarningFlags/CELL1', any, read_bool(base_register=1005, bit=46)), + BatterySignal('/WarningFlags/bit47WarningDummy', any, read_bool(base_register=1005, bit=47)), + + BatterySignal('/NumberOfAlarmFlags', sum, count_bits(base_register=1009, nb_of_registers=3, nb_of_bits=47)), + BatterySignal('/AlarmFlags/Tam', any, read_bool(base_register=1009, bit=0)), + BatterySignal('/AlarmFlags/TaM2', any, read_bool(base_register=1009, bit=2)), + BatterySignal('/AlarmFlags/Tbm', any, read_bool(base_register=1009, bit=3)), + BatterySignal('/AlarmFlags/TbM2', any, read_bool(base_register=1009, bit=5)), + BatterySignal('/AlarmFlags/VBm2', any, read_bool(base_register=1009, bit=7)), + BatterySignal('/AlarmFlags/IDM2', any, read_bool(base_register=1009, bit=11)), + BatterySignal('/AlarmFlags/ISOB', any, read_bool(base_register=1009, bit=12)), + BatterySignal('/AlarmFlags/MSWE', any, read_bool(base_register=1009, bit=13)), + BatterySignal('/AlarmFlags/FUSE', any, read_bool(base_register=1009, bit=14)), + BatterySignal('/AlarmFlags/HTRE', any, read_bool(base_register=1009, bit=15)), + BatterySignal('/AlarmFlags/TCPE', any, read_bool(base_register=1009, bit=16)), + BatterySignal('/AlarmFlags/STRE', any, read_bool(base_register=1009, bit=17)), + BatterySignal('/AlarmFlags/CME', any, read_bool(base_register=1009, bit=18)), + BatterySignal('/AlarmFlags/HWFL', any, read_bool(base_register=1009, bit=19)), + BatterySignal('/AlarmFlags/HWEM', any, read_bool(base_register=1009, bit=20)), + BatterySignal('/AlarmFlags/ThM', any, read_bool(base_register=1009, bit=21)), + BatterySignal('/AlarmFlags/vsm1', any, read_bool(base_register=1009, bit=22)), + BatterySignal('/AlarmFlags/vsm2', any, read_bool(base_register=1009, bit=23)), + BatterySignal('/AlarmFlags/vsM2', any, read_bool(base_register=1009, bit=25)), + BatterySignal('/AlarmFlags/iCM2', any, read_bool(base_register=1009, bit=27)), + BatterySignal('/AlarmFlags/iDM2', any, read_bool(base_register=1009, bit=29)), + BatterySignal('/AlarmFlags/MID2', any, read_bool(base_register=1009, bit=31)), + BatterySignal('/AlarmFlags/CCBF', any, read_bool(base_register=1009, bit=33)), + BatterySignal('/AlarmFlags/AhFL', any, read_bool(base_register=1009, bit=34)), + BatterySignal('/AlarmFlags/TbCM', any, read_bool(base_register=1009, bit=36)), + BatterySignal('/AlarmFlags/BRNF', any, read_bool(base_register=1009, bit=37)), + BatterySignal('/AlarmFlags/HTFS', any, read_bool(base_register=1009, bit=42)), + BatterySignal('/AlarmFlags/DATA', any, read_bool(base_register=1009, bit=43)), + BatterySignal('/AlarmFlags/CELL2', any, read_bool(base_register=1009, bit=45)), + BatterySignal('/AlarmFlags/bit47AlarmDummy', any, read_bool(base_register=1009, bit=47)), + + BatterySignal('/LedStatus/Red', max, read_led_red), + BatterySignal('/LedStatus/Blue', max, read_led_blue), + BatterySignal('/LedStatus/Green', max, read_led_green), + BatterySignal('/LedStatus/Amber', max, read_led_amber), + + BatterySignal('/IoStatus/MainSwitchClosed', any, read_bool(base_register=1013, bit=0)), + BatterySignal('/IoStatus/AlarmOutActive', any, read_bool(base_register=1013, bit=1)), + BatterySignal('/IoStatus/InternalFanActive', any, read_bool(base_register=1013, bit=2)), + BatterySignal('/IoStatus/VoltMeasurementAllowed', any, read_bool(base_register=1013, bit=3)), + BatterySignal('/IoStatus/AuxRelay', any, read_bool(base_register=1013, bit=4)), + BatterySignal('/IoStatus/RemoteState', any, read_bool(base_register=1013, bit=5)), + BatterySignal('/IoStatus/HeaterOn', any, read_bool(base_register=1013, bit=6)), + BatterySignal('/IoStatus/EocReached', min, read_eoc_reached), + BatterySignal('/IoStatus/BatteryCold', any, read_battery_cold), + + # see protocol doc page 7 + BatterySignal('/Info/MaxDischargeCurrent', sum, lambda bs: bs.battery.i_max, unit='A'), + BatterySignal('/Info/MaxChargeCurrent', sum, lambda bs: bs.battery.i_max, unit='A'), + BatterySignal('/Info/MaxChargeVoltage', min, lambda bs: bs.battery.v_max, unit='V'), + BatterySignal('/Info/MinDischargeVoltage', max, lambda bs: bs.battery.v_min, unit='V'), + BatterySignal('/Info/BatteryLowVoltage' , max, lambda bs: bs.battery.v_min-2, unit='V'), + BatterySignal('/Info/NumberOfStrings', sum, lambda bs: bs.battery.n_strings), + + BatterySignal('/Info/MaxChargePower', sum, calc_max_charge_power), + BatterySignal('/Info/MaxDischargePower', sum, calc_max_discharge_power), + + BatterySignal('/FirmwareVersion', comma_separated, lambda bs: bs.battery.firmware_version), + BatterySignal('/HardwareVersion', comma_separated, lambda bs: bs.battery.hardware_version), + BatterySignal('/BmsVersion', comma_separated, lambda bs: bs.battery.bms_version) + + ] diff --git a/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/signals.pyc b/NodeRed/NodeRedFiles/dbus-fzsonick-48tl-Ivo/signals.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4260f83fbd285a22d81f6ceb783ca2312b2b5526 GIT binary patch literal 10358 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 z zM|C8nY*J>!NqLj0>-eF@sF^@>%(Luv5-V2uyZAFGQ`fBOD1!~Zd4>n9JHc36s0i}R zzf=`6(2}1PfL3L((at|w>OOkA3mr>X zVI0IdT~&6Exp7-@s0V~F9s#R^J?&#Gg?LoRFgpnM=dCF_Bm=N`pfJI#)uAU-15RZwQkupIa|m2 zHntiDWQ<|sSlnuC2P)0q9~|ReNPqXV#Z`p4I6%B^0-3O!n!Rt#-(eqO}2_^u<<_gqlhl{HpSUnjIAU# zSJ~jT47R*c1f;c4ks3o<4;<{R;F8jcf>p9PrF+vP60XOmJ#V5g?ag?Xya})1xn9n5 F{sE=+q;CKK literal 0 HcmV?d00001 diff --git a/NodeRed/NodeRedFiles/dbus-fzsonick-48tl/__pycache__/data.cpython-38.pyc b/NodeRed/NodeRedFiles/dbus-fzsonick-48tl/__pycache__/data.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..586475eb399cc62bfac553fccc244cef4e696558 GIT binary patch literal 3578 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̛Dj5}0=WsKuU<}^xoDsviCuPB8N26C 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 float + dv = v_limit - v + di = dv / r_int + p_limit = v_limit * (i + di) + return p_limit + +def calc_power_limit_imposed_by_current_limit(v, i, i_limit, r_int): + # type: (float, float, float, float) -> float + di = i_limit - i + dv = di * r_int + p_limit = i_limit * (v + dv) + return p_limit + +def read_switch_closed(status): + value = c.read_bool(register=1013, bit=0)(status) + if value: + return False + return True + +def read_alarm_out_active(status): + value = c.read_bool(register=1013, bit=1)(status) + if value: + return False + return True + +def read_aux_relay(status): + value = c.read_bool(register=1013, bit=4)(status) + if value: + return False + return True + +def hex_string_to_ascii(hex_string): + # Ensure the hex_string is correctly formatted without spaces + hex_string = hex_string.replace(" ", "") + # Convert every two characters (a byte) in the hex string to ASCII + ascii_string = ''.join([chr(int(hex_string[i:i+2], 16)) for i in range(0, len(hex_string), 2)]) + return ascii_string + +battery_status_reader = c.read_hex_string(1060,2) + +def read_eoc_reached(status): + battery_status_string = battery_status_reader(status) + return hex_string_to_ascii(battery_status_string) == "EOC_" + +def return_led_state(status, color): + led_state = c.read_led_state(register=1004, led=color)(status) + if led_state == LedState.blinking_fast or led_state == LedState.blinking_slow: + return "Blinking" + elif led_state == LedState.on: + return "On" + elif led_state == LedState.off: + return "Off" + return "Unknown" + +def return_led_state_blue(status): + return return_led_state(status, LedColor.blue) + +def return_led_state_red(status): + return return_led_state(status, LedColor.red) + +def return_led_state_green(status): + return return_led_state(status, LedColor.green) + +def return_led_state_amber(status): + return return_led_state(status, LedColor.amber) + +def read_serial_number(status): + serial_regs = [1055, 1056, 1057, 1058] + serial_parts = [] + for reg in serial_regs: + # reading each register as a single hex value + hex_value_fun = c.read_hex_string(reg, 1) + hex_value = hex_value_fun(status) + # append without spaces and leading zeros stripped if any + serial_parts.append(hex_value.replace(' ', '')) + # concatenate all parts to form the full serial number + serial_number = ''.join(serial_parts).rstrip('0') + return serial_number + +def time_since_toc_in_time_format(status): + time_in_minutes = c.read_float(register=1052)(status) + # Convert minutes to total seconds + total_seconds = int(time_in_minutes * 60) + # Calculate days, hours, minutes, and seconds + days = total_seconds // (24 * 3600) + total_seconds = total_seconds % (24 * 3600) + hours = total_seconds // 3600 + total_seconds %= 3600 + minutes = total_seconds // 60 + seconds = total_seconds % 60 + # Format the string to show days.hours:minutes:seconds + return f"{days}.{hours:02}:{minutes:02}:{seconds:02}" + +def create_csv_signals(firmware_version): + read_voltage = c.read_float(register=999, scale_factor=0.01, offset=0, places=2) + read_current = c.read_float(register=1000, scale_factor=0.01, offset=-10000, places=2) + read_limb_bitmap = c.read_bitmap(1059) + + def read_power(status): + return int(read_current(status) * read_voltage(status)) + + def string1_disabled(status): + bitmap_value = read_limb_bitmap(status) + return int((bitmap_value & 0b00001) != 0) + + def string2_disabled(status): + bitmap_value = read_limb_bitmap(status) + return int((bitmap_value & 0b00010) != 0) + + def string3_disabled(status): + bitmap_value = read_limb_bitmap(status) + return int((bitmap_value & 0b00100) != 0) + + def string4_disabled(status): + bitmap_value = read_limb_bitmap(status) + return int((bitmap_value & 0b01000) != 0) + + def string5_disabled(status): + bitmap_value = read_limb_bitmap(status) + return int((bitmap_value & 0b10000) != 0) + + def limp_strings_value(status): + return interpret_limb_bitmap(read_limb_bitmap(status)) + + def calc_max_charge_power(status): + # type: (BatteryStatus) -> int + n_strings = cfg.NUM_OF_STRING_PER_BATTERY-limp_strings_value(status) + i_max = n_strings * cfg.I_MAX_PER_STRING + v_max = cfg.V_MAX + r_int_min = cfg.R_STRING_MIN / n_strings + r_int_max = cfg.R_STRING_MAX / n_strings + + v = read_voltage(status) + i = read_current(status) + + p_limits = [ + calc_power_limit_imposed_by_voltage_limit(v, i, v_max, r_int_min), + calc_power_limit_imposed_by_voltage_limit(v, i, v_max, r_int_max), + calc_power_limit_imposed_by_current_limit(v, i, i_max, r_int_min), + calc_power_limit_imposed_by_current_limit(v, i, i_max, r_int_max), + ] + + p_limit = min(p_limits) # p_limit is normally positive here (signed) + p_limit = max(p_limit, 0) # charge power must not become negative + + return int(p_limit) + + def calc_max_discharge_power(status): + n_strings = cfg.NUM_OF_STRING_PER_BATTERY-limp_strings_value(status) + max_discharge_current = n_strings*cfg.I_MAX_PER_STRING + return int(max_discharge_current*read_voltage(status)) + + total_current = c.read_float(register=1062, scale_factor=0.01, offset=-10000, places=1) + + def read_total_current(status): + return total_current(status) + + def read_heating_current(status): + return total_current(status) - read_current(status) + + def read_heating_power(status): + return read_voltage(status) * read_heating_current(status) + + soc_ah = c.read_float(register=1002, scale_factor=0.1, offset=-10000, places=1) + + def read_soc_ah(status): + return soc_ah(status) + + return [ + CsvSignal('/Battery/Devices/FwVersion', firmware_version), + CsvSignal('/Battery/Devices/Dc/Power', read_power, 'W'), + CsvSignal('/Battery/Devices/Dc/Voltage', read_voltage, 'V'), + CsvSignal('/Battery/Devices/Soc', c.read_float(register=1053, scale_factor=0.1, offset=0, places=1), '%'), + CsvSignal('/Battery/Devices/Temperatures/Cells/Average', c.read_float(register=1003, scale_factor=0.1, offset=-400, places=1), 'C'), + CsvSignal('/Battery/Devices/Dc/Current', read_current, 'A'), + CsvSignal('/Battery/Devices/BusCurrent', read_total_current, 'A'), + CsvSignal('/Battery/Devices/CellsCurrent', read_current, 'A'), + CsvSignal('/Battery/Devices/HeatingCurrent', read_heating_current, 'A'), + CsvSignal('/Battery/Devices/HeatingPower', read_heating_power, 'W'), + CsvSignal('/Battery/Devices/SOCAh', read_soc_ah), + CsvSignal('/Battery/Devices/Leds/Blue', return_led_state_blue), + CsvSignal('/Battery/Devices/Leds/Red', return_led_state_red), + CsvSignal('/Battery/Devices/Leds/Green', return_led_state_green), + CsvSignal('/Battery/Devices/Leds/Amber', return_led_state_amber), + CsvSignal('/Battery/Devices/BatteryStrings/String1Active', string1_disabled), + CsvSignal('/Battery/Devices/BatteryStrings/String2Active', string2_disabled), + CsvSignal('/Battery/Devices/BatteryStrings/String3Active', string3_disabled), + CsvSignal('/Battery/Devices/BatteryStrings/String4Active', string4_disabled), + CsvSignal('/Battery/Devices/BatteryStrings/String5Active', string5_disabled), + CsvSignal('/Battery/Devices/IoStatus/ConnectedToDcBus', read_switch_closed), + CsvSignal('/Battery/Devices/IoStatus/AlarmOutActive', read_alarm_out_active), + CsvSignal('/Battery/Devices/IoStatus/InternalFanActive', c.read_bool(register=1013, bit=2)), + CsvSignal('/Battery/Devices/IoStatus/VoltMeasurementAllowed', c.read_bool(register=1013, bit=3)), + CsvSignal('/Battery/Devices/IoStatus/AuxRelayBus', read_aux_relay), + CsvSignal('/Battery/Devices/IoStatus/RemoteStateActive', c.read_bool(register=1013, bit=5)), + CsvSignal('/Battery/Devices/IoStatus/RiscActive', c.read_bool(register=1013, bit=6)), + CsvSignal('/Battery/Devices/Eoc', read_eoc_reached), + CsvSignal('/Battery/Devices/SerialNumber', read_serial_number), + CsvSignal('/Battery/Devices/TimeSinceTOC', time_since_toc_in_time_format), + CsvSignal('/Battery/Devices/MaxChargePower', calc_max_charge_power), + CsvSignal('/Battery/Devices/MaxDischargePower', calc_max_discharge_power), + ] + +def init_signals(hardware_version, firmware_version, n_batteries): + # type: (str,str,int) -> Iterable[Signal] + """ + A Signal holds all information necessary for the handling of a + certain datum (e.g. voltage) published by the battery. + + Signal(dbus_path, aggregate, get_value, get_text = str) + + dbus_path: str + object_path on DBus where the datum needs to be published + + aggregate: Iterable[object] -> object + function that combines the values of multiple batteries into one. + e.g. sum for currents, or mean for voltages + + get_value: (BatteryStatus) -> object [optional] + function to extract the datum from the modbus record, + alternatively: a constant + + get_text: (object) -> unicode [optional] + function to render datum to text, needed by DBus + alternatively: a constant + + The conversion functions use the same parameters (e.g scale_factor, offset) + as described in the document 'T48TLxxx ModBus Protocol Rev.7.1' which can + be found in the /doc folder + """ + + product_id_hex = '0x{0:04x}'.format(cfg.PRODUCT_ID) + + read_voltage = c.read_float(register=999, scale_factor=0.01, offset=0, places=2) + read_current = c.read_float(register=1000, scale_factor=0.01, offset=-10000, places=2) + read_limb_bitmap = c.read_bitmap(1059) + + def read_power(status): + return int(read_current(status) * read_voltage(status)) + + def limp_strings_value(status): + return interpret_limb_bitmap(read_limb_bitmap(status)) + + def max_discharge_current(status): + return (cfg.NUM_OF_STRING_PER_BATTERY-limp_strings_value(status))*cfg.I_MAX_PER_STRING + + def max_charge_current(status): + return status.battery.ampere_hours/2 + + def calc_max_charge_power(status): + # type: (BatteryStatus) -> int + n_strings = cfg.NUM_OF_STRING_PER_BATTERY-limp_strings_value(status) + i_max = n_strings * cfg.I_MAX_PER_STRING + v_max = cfg.V_MAX + r_int_min = cfg.R_STRING_MIN / n_strings + r_int_max = cfg.R_STRING_MAX / n_strings + + v = read_voltage(status) + i = read_current(status) + + p_limits = [ + calc_power_limit_imposed_by_voltage_limit(v, i, v_max, r_int_min), + calc_power_limit_imposed_by_voltage_limit(v, i, v_max, r_int_max), + calc_power_limit_imposed_by_current_limit(v, i, i_max, r_int_min), + calc_power_limit_imposed_by_current_limit(v, i, i_max, r_int_max), + ] + + p_limit = min(p_limits) # p_limit is normally positive here (signed) + p_limit = max(p_limit, 0) # charge power must not become negative + + return int(p_limit) + + product_name = cfg.PRODUCT_NAME + if n_batteries > 1: + product_name = cfg.PRODUCT_NAME + ' x' + str(n_batteries) + + return [ + # Node Red related dbus paths + Signal('/TimeToTOCRequest', max, c.read_float(register=1052)), + Signal('/EOCReached', c.return_in_list, read_eoc_reached), + Signal('/NumOfLimbStrings', c.return_in_list, get_value=limp_strings_value), + Signal('/NumOfBatteries', max, get_value=n_batteries), + Signal('/Dc/0/Voltage', c.mean, get_value=read_voltage, get_text=c.append_unit('V')), + Signal('/Dc/0/Current', c.ssum, get_value=read_current, get_text=c.append_unit('A')), + Signal('/Dc/0/Power', c.ssum, get_value=read_power, get_text=c.append_unit('W')), + Signal('/BussVoltage', c.mean, c.read_float(register=1001, scale_factor=0.01, offset=0, places=2), c.append_unit('V')), + Signal('/Soc', min, c.read_float(register=1053, scale_factor=0.1, offset=0, places=1), c.append_unit('%')), + Signal('/LowestSoc', min, c.read_float(register=1053, scale_factor=0.1, offset=0, places=1), c.append_unit('%')), + Signal('/Dc/0/Temperature', c.mean, c.read_float(register=1003, scale_factor=0.1, offset=-400, places=1), c.append_unit(u'°C')), + Signal('/Dc/0/LowestTemperature', min, c.read_float(register=1003, scale_factor=0.1, offset=-400, places=1), c.append_unit(u'°C')), + # Charge/Discharge current, voltage and power + Signal('/Info/MaxDischargeCurrent', c.ssum, max_discharge_current,c.append_unit('A')), + Signal('/Info/MaxChargeCurrent', c.ssum, max_charge_current, c.append_unit('A')), + Signal('/Info/MaxChargeVoltage', min, cfg.MAX_CHARGE_VOLTAGE, c.append_unit('V')), + Signal('/Info/MaxChargePower', c.ssum, calc_max_charge_power), + # Victron mandatory dbus paths + Signal('/Mgmt/ProcessName', c.first, __file__), + Signal('/Mgmt/ProcessVersion', c.first, cfg.SOFTWARE_VERSION), + Signal('/Mgmt/Connection', c.first, cfg.CONNECTION), + Signal('/DeviceInstance', c.first, cfg.DEVICE_INSTANCE), + Signal('/ProductName', c.first, product_name), + Signal('/ProductId', c.first, cfg.PRODUCT_ID, product_id_hex), + Signal('/Connected', c.first, 1), + Signal('/FirmwareVersion', c.return_in_list, firmware_version), + Signal('/HardwareVersion', c.first, cfg.HARDWARE_VERSION, hardware_version), + # Diagnostics + Signal('/Diagnostics/BmsVersion', c.first, lambda s: s.battery.bms_version), + # Warnings + Signal('/WarningFlags/TaM1', c.return_in_list, c.read_bool(register=1005, bit=1)), + Signal('/WarningFlags/TbM1', c.return_in_list, c.read_bool(register=1005, bit=4)), + Signal('/WarningFlags/VBm1', c.return_in_list, c.read_bool(register=1005, bit=6)), + Signal('/WarningFlags/VBM1', c.return_in_list, c.read_bool(register=1005, bit=8)), + Signal('/WarningFlags/IDM1', c.return_in_list, c.read_bool(register=1005, bit=10)), + Signal('/WarningFlags/vsm1', c.return_in_list, c.read_bool(register=1005, bit=22)), + Signal('/WarningFlags/vsM1', c.return_in_list, c.read_bool(register=1005, bit=24)), + Signal('/WarningFlags/iCM1', c.return_in_list, c.read_bool(register=1005, bit=26)), + Signal('/WarningFlags/iDM1', c.return_in_list, c.read_bool(register=1005, bit=28)), + Signal('/WarningFlags/MID1', c.return_in_list, c.read_bool(register=1005, bit=30)), + Signal('/WarningFlags/BLPW', c.return_in_list, c.read_bool(register=1005, bit=32)), + Signal('/WarningFlags/CCBF', c.return_in_list, c.read_bool(register=1005, bit=33)), + Signal('/WarningFlags/Ah_W', c.return_in_list, c.read_bool(register=1005, bit=35)), + Signal('/WarningFlags/MPMM', c.return_in_list, c.read_bool(register=1005, bit=38)), + Signal('/WarningFlags/TCdi', c.return_in_list, c.read_bool(register=1005, bit=40)), + Signal('/WarningFlags/LMPW', c.return_in_list, c.read_bool(register=1005, bit=44)), + Signal('/WarningFlags/TOCW', c.return_in_list, c.read_bool(register=1005, bit=47)), + Signal('/WarningFlags/BUSL', c.return_in_list, c.read_bool(register=1005, bit=49)), + # Alarms + Signal('/AlarmFlags/Tam', c.return_in_list, c.read_bool(register=1005, bit=0)), + Signal('/AlarmFlags/TaM2', c.return_in_list, c.read_bool(register=1005, bit=2)), + Signal('/AlarmFlags/Tbm', c.return_in_list, c.read_bool(register=1005, bit=3)), + Signal('/AlarmFlags/TbM2', c.return_in_list, c.read_bool(register=1005, bit=5)), + Signal('/AlarmFlags/VBm2', c.return_in_list, c.read_bool(register=1005, bit=7)), + Signal('/AlarmFlags/VBM2', c.return_in_list, c.read_bool(register=1005, bit=9)), + Signal('/AlarmFlags/IDM2', c.return_in_list, c.read_bool(register=1005, bit=11)), + Signal('/AlarmFlags/ISOB', c.return_in_list, c.read_bool(register=1005, bit=12)), + Signal('/AlarmFlags/MSWE', c.return_in_list, c.read_bool(register=1005, bit=13)), + Signal('/AlarmFlags/FUSE', c.return_in_list, c.read_bool(register=1005, bit=14)), + Signal('/AlarmFlags/HTRE', c.return_in_list, c.read_bool(register=1005, bit=15)), + Signal('/AlarmFlags/TCPE', c.return_in_list, c.read_bool(register=1005, bit=16)), + Signal('/AlarmFlags/STRE', c.return_in_list, c.read_bool(register=1005, bit=17)), + Signal('/AlarmFlags/CME', c.return_in_list, c.read_bool(register=1005, bit=18)), + Signal('/AlarmFlags/HWFL', c.return_in_list, c.read_bool(register=1005, bit=19)), + Signal('/AlarmFlags/HWEM', c.return_in_list, c.read_bool(register=1005, bit=20)), + Signal('/AlarmFlags/ThM', c.return_in_list, c.read_bool(register=1005, bit=21)), + Signal('/AlarmFlags/vsm2', c.return_in_list, c.read_bool(register=1005, bit=23)), + Signal('/AlarmFlags/vsM2', c.return_in_list, c.read_bool(register=1005, bit=25)), + Signal('/AlarmFlags/iCM2', c.return_in_list, c.read_bool(register=1005, bit=27)), + Signal('/AlarmFlags/iDM2', c.return_in_list, c.read_bool(register=1005, bit=29)), + Signal('/AlarmFlags/MID2', c.return_in_list, c.read_bool(register=1005, bit=31)), + Signal('/AlarmFlags/HTFS', c.return_in_list, c.read_bool(register=1005, bit=42)), + Signal('/AlarmFlags/DATA', c.return_in_list, c.read_bool(register=1005, bit=43)), + Signal('/AlarmFlags/LMPA', c.return_in_list, c.read_bool(register=1005, bit=45)), + Signal('/AlarmFlags/HEBT', c.return_in_list, c.read_bool(register=1005, bit=46)), + Signal('/AlarmFlags/CURM', c.return_in_list, c.read_bool(register=1005, bit=48)), + # LedStatus + Signal('/Diagnostics/LedStatus/Red', c.first, c.read_led_state(register=1004, led=LedColor.red)), + Signal('/Diagnostics/LedStatus/Blue', c.first, c.read_led_state(register=1004, led=LedColor.blue)), + Signal('/Diagnostics/LedStatus/Green', c.first, c.read_led_state(register=1004, led=LedColor.green)), + Signal('/Diagnostics/LedStatus/Amber', c.first, c.read_led_state(register=1004, led=LedColor.amber)), + # IO Status + Signal('/Diagnostics/IoStatus/MainSwitchClosed', c.return_in_list, read_switch_closed), + Signal('/Diagnostics/IoStatus/AlarmOutActive', c.return_in_list, read_alarm_out_active), + Signal('/Diagnostics/IoStatus/InternalFanActive', c.return_in_list, c.read_bool(register=1013, bit=2)), + Signal('/Diagnostics/IoStatus/VoltMeasurementAllowed', c.return_in_list, c.read_bool(register=1013, bit=3)), + Signal('/Diagnostics/IoStatus/AuxRelay', c.return_in_list, read_aux_relay), + Signal('/Diagnostics/IoStatus/RemoteState', c.return_in_list, c.read_bool(register=1013, bit=5)), + Signal('/Diagnostics/IoStatus/RiscOn', c.return_in_list, c.read_bool(register=1013, bit=6)), + ] + +def init_modbus(tty): + # type: (str) -> Modbus + logging.debug('initializing Modbus') + return Modbus( + port='/dev/' + tty, + method=cfg.MODE, + baudrate=cfg.BAUD_RATE, + stopbits=cfg.STOP_BITS, + bytesize=cfg.BYTE_SIZE, + timeout=cfg.TIMEOUT, + parity=cfg.PARITY) + +def init_dbus(tty, signals): + # type: (str, Iterable[Signal]) -> DBus + logging.debug('initializing DBus service') + dbus = DBus(servicename=cfg.SERVICE_NAME_PREFIX + tty) + logging.debug('initializing DBus paths') + for signal in signals: + init_dbus_path(dbus, signal) + return dbus + +# noinspection PyBroadException +def try_get_value(sig): + # type: (Signal) -> object + try: + return sig.get_value(None) + except: + return None + +def init_dbus_path(dbus, sig): + # type: (DBus, Signal) -> () + dbus.add_path( + sig.dbus_path, + try_get_value(sig), + gettextcallback=lambda _, v: sig.get_text(v)) + +def init_main_loop(): + # type: () -> DBusGMainLoop + logging.debug('initializing DBusGMainLoop Loop') + DBusGMainLoop(set_as_default=True) + return GLib.MainLoop() + +def report_slave_id(modbus, slave_address): + # type: (Modbus, int) -> str + slave = str(slave_address) + logging.debug('requesting slave id from node ' + slave) + try: + modbus.connect() + request = ReportSlaveIdRequest(unit=slave_address) + response = modbus.execute(request) + if response is ExceptionResponse or issubclass(type(response), ModbusException): + raise Exception('failed to get slave id from ' + slave + ' : ' + str(response)) + return response.identifier + finally: + modbus.close() + +def identify_battery(modbus, slave_address): + # type: (Modbus, int) -> Battery + logging.info('identifying battery...') + hardware_version, bms_version, ampere_hours = parse_slave_id(modbus, slave_address) + firmware_version = read_firmware_version(modbus, slave_address) + specs = Battery( + slave_address=slave_address, + hardware_version=hardware_version, + firmware_version=firmware_version, + bms_version=bms_version, + ampere_hours=ampere_hours) + logging.info('battery identified:\n{0}'.format(str(specs))) + return specs + +def identify_batteries(modbus): + # type: (Modbus) -> list[Battery] + def _identify_batteries(): + address_range = range(1, cfg.MAX_SLAVE_ADDRESS + 1) + for slave_address in address_range: + try: + yield identify_battery(modbus, slave_address) + except Exception as e: + logging.info('failed to identify battery at {0} : {1}'.format(str(slave_address), str(e))) + return list(_identify_batteries()) # force that lazy iterable! + +def parse_slave_id(modbus, slave_address): + # type: (Modbus, int) -> (str, str, int) + slave_id = report_slave_id(modbus, slave_address) + sid = re.sub(b'[^\x20-\x7E]', b'', slave_id) # remove weird special chars + match = re.match('(?P48TL(?P\d+)) *(?P.*)', sid.decode('ascii')) + if match is None: + raise Exception('no known battery found') + return match.group('hw'), match.group('bms'), int(match.group('ah')) + +def read_firmware_version(modbus, slave_address): + # type: (Modbus, int) -> str + logging.debug('reading firmware version') + try: + modbus.connect() + response = read_modbus_registers(modbus, slave_address, base_address=1054, count=1) + register = response.registers[0] + return '{0:0>4X}'.format(register) + finally: + modbus.close() # close in any case + +def read_modbus_registers(modbus, slave_address, base_address=cfg.BASE_ADDRESS, count=cfg.NO_OF_REGISTERS): + # type: (Modbus, int) -> ReadInputRegistersResponse + logging.debug('requesting modbus registers {0}-{1}'.format(base_address, base_address + count)) + return modbus.read_input_registers( + address=base_address, + count=count, + unit=slave_address) + +def read_battery_status(modbus, battery): + # type: (Modbus, Battery) -> BatteryStatus + """ + Read the modbus registers containing the battery's status info. + """ + logging.debug('reading battery status') + try: + modbus.connect() + data = read_modbus_registers(modbus, battery.slave_address) + return BatteryStatus(battery, data.registers) + finally: + modbus.close() # close in any case + +def publish_values(dbus, signals, statuses): + # type: (DBus, Iterable[Signal], Iterable[BatteryStatus]) -> () + for s in signals: + values = [s.get_value(status) for status in statuses] + with dbus as srv: + srv[s.dbus_path] = s.aggregate(values) + +previous_warnings = {} +previous_alarms = {} + +class MessageType: + ALARM_OR_WARNING = "AlarmOrWarning" + HEARTBEAT = "Heartbeat" + +class AlarmOrWarning: + def __init__(self, description, created_by): + self.date = datetime.now().strftime('%Y-%m-%d') + self.time = datetime.now().strftime('%H:%M:%S') + self.description = description + self.created_by = created_by + + def to_dict(self): + return { + "Date": self.date, + "Time": self.time, + "Description": self.description, + "CreatedBy": self.created_by + } + +def SubscribeToQueue(): + try: + connection = pika.BlockingConnection(pika.ConnectionParameters(host="10.2.0.11", + port=5672, + virtual_host="/", + credentials=pika.PlainCredentials("producer", "b187ceaddb54d5485063ddc1d41af66f"))) + channel = connection.channel() + channel.queue_declare(queue="statusQueue", durable=True) + print("Subscribed to queue") + except Exception as ex: + print("An error occurred while connecting to the RabbitMQ queue:", ex) + return channel + +is_first_update = True +first_subscribe = False +prev_status=0 +subscribed_to_queue_first_time=False +channel = SubscribeToQueue() +heartbit_interval = 0 +# Create an S3config instance +s3_config = S3config() +INSTALLATION_ID=int(s3_config.bucket.split('-')[0]) +PRODUCT_ID = 1 + +def update_state_from_dictionaries(current_warnings, current_alarms, node_numbers): + global previous_warnings, previous_alarms, INSTALLATION_ID, PRODUCT_ID, is_first_update, first_subscribe, channel,prev_status,heartbit_interval,subscribed_to_queue_first_time + + heartbit_interval+=1 + + if is_first_update: + changed_warnings = current_warnings + changed_alarms = current_alarms + is_first_update = False + else: + changed_alarms={} + changed_warnings={} + # calculate the diff in warnings and alarms + prev_alarm_value_list=list(previous_alarms.values()) + alarm_keys=list(previous_alarms.keys()) + + for i, alarm in enumerate(current_alarms.values()): + if alarm!=prev_alarm_value_list[i]: + changed_alarms[alarm_keys[i]]=True + else: + changed_alarms[alarm_keys[i]]=False + + prev_warning_value_list=list(previous_warnings.values()) + warning_keys=list(previous_warnings.keys()) + + for i, warning in enumerate(current_warnings.values()): + if warning!=prev_warning_value_list[i]: + changed_warnings[warning_keys[i]]=True + else: + changed_warnings[warning_keys[i]]=False + + status_message = { + "InstallationId": INSTALLATION_ID, + "Product": PRODUCT_ID, + "Status": 0, + "Type": 1, + "Warnings": [], + "Alarms": [] + } + + + alarms_number_list = [] + for node_number in node_numbers: + cnt = 0 + for alarm_name, alarm_value in current_alarms.items(): + if str(node_number) in alarm_name and alarm_value: + cnt+=1 + alarms_number_list.append(cnt) + + warnings_number_list = [] + for node_number in node_numbers: + cnt = 0 + for warning_name, warning_value in current_warnings.items(): + if str(node_number) in warning_name and 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()) + + 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()) + + if any(current_alarms.values()): + status_message["Status"]=2 + + if not any(current_alarms.values()) and any(current_warnings.values()): + status_message["Status"]=1 + + if not any(current_alarms.values()) and not any(current_warnings.values()): + status_message["Status"]=0 + + if status_message["Status"]!=prev_status or len(status_message["Warnings"])>0 or len(status_message["Alarms"])>0: + prev_status=status_message["Status"] + status_message["Type"]=0 + status_message = json.dumps(status_message) + channel.basic_publish(exchange="", routing_key="statusQueue", body=status_message) + print(status_message) + print("Message sent successfully") + elif heartbit_interval>=15 or not subscribed_to_queue_first_time: + print("Send heartbit message to rabbitmq") + heartbit_interval=0 + subscribed_to_queue_first_time=True + status_message = json.dumps(status_message) + channel.basic_publish(exchange="", routing_key="statusQueue", body=status_message) + + previous_warnings = current_warnings.copy() + previous_alarms = current_alarms.copy() + + return status_message, alarms_number_list, warnings_number_list + +def read_warning_and_alarm_flags(): + return [ + # Warnings + CsvSignal('/Battery/Devices/WarningFlags/TaM1', c.read_bool(register=1005, bit=1)), + CsvSignal('/Battery/Devices/WarningFlags/TbM1', c.read_bool(register=1005, bit=4)), + CsvSignal('/Battery/Devices/WarningFlags/VBm1', c.read_bool(register=1005, bit=6)), + CsvSignal('/Battery/Devices/WarningFlags/VBM1', c.read_bool(register=1005, bit=8)), + CsvSignal('/Battery/Devices/WarningFlags/IDM1', c.read_bool(register=1005, bit=10)), + CsvSignal('/Battery/Devices/WarningFlags/vsm1', c.read_bool(register=1005, bit=22)), + CsvSignal('/Battery/Devices/WarningFlags/vsM1', c.read_bool(register=1005, bit=24)), + CsvSignal('/Battery/Devices/WarningFlags/iCM1', c.read_bool(register=1005, bit=26)), + CsvSignal('/Battery/Devices/WarningFlags/iDM1', c.read_bool(register=1005, bit=28)), + CsvSignal('/Battery/Devices/WarningFlags/MID1', c.read_bool(register=1005, bit=30)), + CsvSignal('/Battery/Devices/WarningFlags/BLPW', c.read_bool(register=1005, bit=32)), + CsvSignal('/Battery/Devices/WarningFlags/CCBF', c.read_bool(register=1005, bit=33)), + CsvSignal('/Battery/Devices/WarningFlags/Ah_W', c.read_bool(register=1005, bit=35)), + CsvSignal('/Battery/Devices/WarningFlags/MPMM', c.read_bool(register=1005, bit=38)), + CsvSignal('/Battery/Devices/WarningFlags/TCdi', c.read_bool(register=1005, bit=40)), + CsvSignal('/Battery/Devices/WarningFlags/LMPW', c.read_bool(register=1005, bit=44)), + CsvSignal('/Battery/Devices/WarningFlags/TOCW', c.read_bool(register=1005, bit=47)), + CsvSignal('/Battery/Devices/WarningFlags/BUSL', c.read_bool(register=1005, bit=49)), + ], [ + # Alarms + CsvSignal('/Battery/Devices/AlarmFlags/Tam', c.read_bool(register=1005, bit=0)), + CsvSignal('/Battery/Devices/AlarmFlags/TaM2', c.read_bool(register=1005, bit=2)), + CsvSignal('/Battery/Devices/AlarmFlags/Tbm', c.read_bool(register=1005, bit=3)), + CsvSignal('/Battery/Devices/AlarmFlags/TbM2', c.read_bool(register=1005, bit=5)), + CsvSignal('/Battery/Devices/AlarmFlags/VBm2', c.read_bool(register=1005, bit=7)), + CsvSignal('/Battery/Devices/AlarmFlags/VBM2', c.read_bool(register=1005, bit=9)), + CsvSignal('/Battery/Devices/AlarmFlags/IDM2', c.read_bool(register=1005, bit=11)), + CsvSignal('/Battery/Devices/AlarmFlags/ISOB', c.read_bool(register=1005, bit=12)), + CsvSignal('/Battery/Devices/AlarmFlags/MSWE', c.read_bool(register=1005, bit=13)), + CsvSignal('/Battery/Devices/AlarmFlags/FUSE', c.read_bool(register=1005, bit=14)), + CsvSignal('/Battery/Devices/AlarmFlags/HTRE', c.read_bool(register=1005, bit=15)), + CsvSignal('/Battery/Devices/AlarmFlags/TCPE', c.read_bool(register=1005, bit=16)), + CsvSignal('/Battery/Devices/AlarmFlags/STRE', c.read_bool(register=1005, bit=17)), + CsvSignal('/Battery/Devices/AlarmFlags/CME', c.read_bool(register=1005, bit=18)), + CsvSignal('/Battery/Devices/AlarmFlags/HWFL', c.read_bool(register=1005, bit=19)), + CsvSignal('/Battery/Devices/AlarmFlags/HWEM', c.read_bool(register=1005, bit=20)), + CsvSignal('/Battery/Devices/AlarmFlags/ThM', c.read_bool(register=1005, bit=21)), + CsvSignal('/Battery/Devices/AlarmFlags/vsm2', c.read_bool(register=1005, bit=23)), + CsvSignal('/Battery/Devices/AlarmFlags/vsM2', c.read_bool(register=1005, bit=25)), + CsvSignal('/Battery/Devices/AlarmFlags/iCM2', c.read_bool(register=1005, bit=27)), + CsvSignal('/Battery/Devices/AlarmFlags/iDM2', c.read_bool(register=1005, bit=29)), + CsvSignal('/Battery/Devices/AlarmFlags/MID2', c.read_bool(register=1005, bit=31)), + CsvSignal('/Battery/Devices/AlarmFlags/HTFS', c.read_bool(register=1005, bit=42)), + CsvSignal('/Battery/Devices/AlarmFlags/DATA', c.read_bool(register=1005, bit=43)), + CsvSignal('/Battery/Devices/AlarmFlags/LMPA', c.read_bool(register=1005, bit=45)), + CsvSignal('/Battery/Devices/AlarmFlags/HEBT', c.read_bool(register=1005, bit=46)), + CsvSignal('/Battery/Devices/AlarmFlags/CURM', c.read_bool(register=1005, bit=48)), + ] + +import random + +'''def update_for_testing(modbus, batteries, dbus, signals, csv_signals): + global ALLOW + logging.debug('starting testing update cycle') + warning_signals, alarm_signals = read_warning_and_alarm_flags() + current_warnings = {} + current_alarms = {} + statuses = [read_battery_status(modbus, battery) for battery in batteries] + node_numbers = [battery.slave_address for battery in batteries] + if ALLOW: + any_warning_active = False + any_alarm_active = False + for i, node in enumerate(node_numbers): + for s in warning_signals: + signal_name = insert_id(s.name, i+1) + value = s.get_value(statuses[i]) + current_warnings[signal_name] = value + if ALLOW and value: + any_warning_active = True + for s in alarm_signals: + signal_name = insert_id(s.name, i+1) + value = random.choice([True, False]) + current_alarms[signal_name] = value + if ALLOW and value: + any_alarm_active = True + print(update_state_from_dictionaries(current_warnings, current_alarms)) + publish_values(dbus, signals, statuses) + create_csv_files(csv_signals, statuses, node_numbers) + logging.debug('finished update cycle\n') + return True''' + +def update(modbus, batteries, dbus, signals, csv_signals): + # type: (Modbus, Iterable[Battery], DBus, Iterable[Signal]) -> bool + """ + Main update function + + 1. requests status record each battery via modbus, + 2. parses the data using Signal.get_value + 3. aggregates the data from all batteries into one datum using Signal.aggregate + 4. publishes the data on the dbus + """ + logging.debug('starting update cycle') + warnings_signals, alarm_signals = read_warning_and_alarm_flags() + current_warnings = {} + current_alarms= {} + statuses = [read_battery_status(modbus, battery) for battery in batteries] + node_numbers = [battery.slave_address for battery in 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) + value = s.get_value(statuses[i]) + current_warnings[signal_name] = value + for s in alarm_signals: + signal_name = insert_id(s.name, i+1) + value = s.get_value(statuses[i]) + current_alarms[signal_name] = value + #print(update_state_from_dictionaries(current_warnings, current_alarms)) + status_message, alarms_number_list, warnings_number_list = update_state_from_dictionaries(current_warnings, current_alarms, node_numbers) + publish_values(dbus, signals, statuses) + create_csv_files(csv_signals, statuses, node_numbers, alarms_number_list, warnings_number_list) + logging.debug('finished update cycle\n') + return True + +def print_usage(): + print('Usage: ' + __file__ + ' ') + print('Example: ' + __file__ + ' ttyUSB0') + +def parse_cmdline_args(argv): + # type: (list[str]) -> str + if len(argv) == 0: + logging.info('missing command line argument for tty device') + print_usage() + sys.exit(1) + return argv[0] + +alive = True # global alive flag, watchdog_task clears it, update_task sets it +ALLOW = False + +def create_update_task(modbus, dbus, batteries, signals, csv_signals, main_loop): + # type: (Modbus, DBus, Iterable[Battery], Iterable[Signal], DBusGMainLoop) -> Callable[[],bool] + """ + Creates an update task which runs the main update function + and resets the alive flag + """ + def update_task(): + # type: () -> bool + global alive, ALLOW + if ALLOW: + ALLOW = False + else: + ALLOW = True + alive = update(modbus, batteries, dbus, signals, csv_signals) + #alive = update_for_testing(modbus, batteries, dbus, signals, csv_signals) + if not alive: + logging.info('update_task: quitting main loop because of error') + main_loop.quit() + return alive + return update_task + +def create_watchdog_task(main_loop): + # type: (DBusGMainLoop) -> Callable[[],bool] + """ + Creates a Watchdog task that monitors the alive flag. + The watchdog kills the main loop if the alive flag is not periodically reset by the update task. + Who watches the watchdog? + """ + def watchdog_task(): + # type: () -> bool + global alive + if alive: + logging.debug('watchdog_task: update_task is alive') + alive = False + return True + else: + logging.info('watchdog_task: killing main loop because update_task is no longer alive') + main_loop.quit() + return False + return watchdog_task + +def get_installation_name(file_path): + with open(file_path, 'r') as file: + return file.read().strip() + +def manage_csv_files(directory_path, max_files=20): + csv_files = [f for f in os.listdir(directory_path)] + 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: + file_to_delete = os.path.join(directory_path, csv_files.pop(0)) + os.remove(file_to_delete) + +def serialize_for_csv(value): + if isinstance(value, (dict, list, tuple)): + return json.dumps(value, ensure_ascii=False) + return str(value) + +def insert_id(path, id_number): + parts = path.split("/") + insert_position = parts.index("Devices") + 1 + parts.insert(insert_position, str(id_number)) + return "/".join(parts) + +def create_csv_files(signals, statuses, node_numbers, alarms_number_list, warnings_number_list): + global s3_config + timestamp = int(time.time()) + if timestamp % 2 != 0: + timestamp -= 1 + # Create CSV directory if it doesn't exist + if not os.path.exists(CSV_DIR): + os.makedirs(CSV_DIR) + csv_filename = f"{timestamp}.csv" + csv_path = os.path.join(CSV_DIR, csv_filename) + # Append values to the CSV file + with open(csv_path, 'a', newline='') as csvfile: + csv_writer = csv.writer(csvfile, delimiter=';') + # Add a special row for the nodes configuration + nodes_config_path = "/Config/Devices/BatteryNodes" + nodes_list = ",".join(str(node) for node in node_numbers) + config_row = [nodes_config_path, nodes_list, ""] + csv_writer.writerow(config_row) + # Iterate over each node and signal to create rows in the new format + for i, node in enumerate(node_numbers): + csv_writer.writerow([f"/Battery/Devices/{str(i+1)}/Alarms", alarms_number_list[i], ""]) + csv_writer.writerow([f"/Battery/Devices/{str(i+1)}/Warnings", warnings_number_list[i], ""]) + for s in signals: + signal_name = insert_id(s.name, i+1) + value = s.get_value(statuses[i]) + row_values = [signal_name, value, s.get_text] + csv_writer.writerow(row_values) + # Manage CSV files, keep a limited number of files + # Create the CSV as a string + csv_data = read_csv_as_string(csv_path) + + if csv_data is None: + print(" error while reading csv as string") + return + + # zip-comp additions + compressed_csv = compress_csv_data(csv_data) + compressed_filename = f"{timestamp}.csv" + + + + response = s3_config.create_put_request(compressed_filename, compressed_csv) + if response.status_code == 200: + #os.remove(csv_path) + print("Success") + else: + failed_dir = os.path.join(CSV_DIR, "failed") + if not os.path.exists(failed_dir): + os.makedirs(failed_dir) + failed_path = os.path.join(failed_dir, csv_filename) + os.rename(csv_path, failed_path) + print("Uploading failed") + manage_csv_files(failed_dir, 10) + manage_csv_files(CSV_DIR) + +def main(argv): + # type: (list[str]) -> () + logging.basicConfig(level=cfg.LOG_LEVEL) + logging.info('starting ' + __file__) + tty = parse_cmdline_args(argv) + modbus = init_modbus(tty) + batteries = identify_batteries(modbus) + n = len(batteries) + logging.info('found ' + str(n) + (' battery' if n == 1 else ' batteries')) + if n <= 0: + sys.exit(2) + bat = c.first(batteries) # report hw and fw version of first battery found + signals = init_signals(bat.hardware_version, bat.firmware_version, n) + csv_signals = create_csv_signals(bat.firmware_version) + main_loop = init_main_loop() # must run before init_dbus because gobject does some global magic + dbus = init_dbus(tty, signals) + update_task = create_update_task(modbus, dbus, batteries, signals, csv_signals, main_loop) + watchdog_task = create_watchdog_task(main_loop) + GLib.timeout_add(cfg.UPDATE_INTERVAL * 2, watchdog_task) # add watchdog first + GLib.timeout_add(cfg.UPDATE_INTERVAL, update_task) # call update once every update_interval + logging.info('starting GLib.MainLoop') + main_loop.run() + logging.info('GLib.MainLoop was shut down') + sys.exit(0xFF) # reaches this only on error + +if __name__ == "__main__": + main(sys.argv[1:]) diff --git a/NodeRed/NodeRedFiles/dbus-fzsonick-48tl/ext/velib_python/__pycache__/ve_utils.cpython-38.pyc b/NodeRed/NodeRedFiles/dbus-fzsonick-48tl/ext/velib_python/__pycache__/ve_utils.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ed1c69aff2765db72a34ce9de95c71df97c2f21b GIT binary patch literal 6666 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 literal 0 HcmV?d00001 diff --git a/NodeRed/NodeRedFiles/dbus-fzsonick-48tl/ext/velib_python/__pycache__/vedbus.cpython-38.pyc b/NodeRed/NodeRedFiles/dbus-fzsonick-48tl/ext/velib_python/__pycache__/vedbus.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d359ef5bfba26d9e66ad6a00bb01af2336b18362 GIT binary patch literal 15886 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 0) ? (daysLeft + \"d\") : \"\";\n hours_str = (hoursLeft > 0) ? (hoursLeft + \"h\") : \"\";\n minutes_str = (minutesLeft > 0) ? (minutesLeft + \"m\") : \"\";\n \n time_to_calibration_str = days_str+hours_str+minutes_str;\n\n return time_to_calibration_str;\n } else {\n return 1;\n }\n}\n\nvar today = new Date(); // Assuming today's date\nvar timeLeft = chargeWindows(today, weekday_calibration_charge, minutes_from_midnight_calibration_charge, time_to_TOC);\n\nmsg.payload = timeLeft;\nreturn msg;", + "func": "// Get minutes per day\nvar minutes_per_day = 1440;\n\n// Cal maximum minutes without calibration charge\nvar max_days_wihthout_EOC = 7;\nmax_minutes_without_EOC = max_days_wihthout_EOC*minutes_per_day;\n\n// Get LastEOC for the last EOC reached battery\nLastEOC =global.get('LastEOC','file');\n\n// Get EOC reached status for all batteries\nEOCReached_list = global.get('EOCReached','file');\n\nif (EOCReached_list.every(item => item === true)){// all batteries reach EOC\n msg.payload=0; // stop calibration charge\n return msg;\n}\n\n// Get calibration charge time (hh:mm) from user setting via Node Red Dashboard\nif(global.get('calibration_charge_start_time','file')!= null){\n minutes_from_midnight_calibration_charge = Math.floor(global.get('calibration_charge_start_time','file'));\n}else{\n minutes_from_midnight_calibration_charge = 32400000;//default value from 09:00\n}\n\n// Get calibration charge weekday from user setting via Node Red Dashboard\nif(global.get('calibration_charge_start_weekday','file')!=null){\n weekday_calibration_charge = global.get('calibration_charge_start_weekday','file');\n}else{\n weekday_calibration_charge = 0;//default value from Sunday\n}\n\n// Cal next calibration time\nfunction nextScheduleDay(adate, w) {\n var daysToAdd = (w - adate.getDay() + 7) % 7;\n var nextDate = new Date(adate);\n nextDate.setDate(adate.getDate() + daysToAdd);\n nextDate.setHours(0);\n nextDate.setMinutes(0);\n nextDate.setSeconds(0);\n return nextDate;\n}\n\n// Main function\nfunction chargeWindows(currentTime, weekday, starttime, LastEOC) {\n var d1 = nextScheduleDay(currentTime, weekday);\n\n // Convert starttime to a Date object\n var startTime = new Date(starttime);\n\n // Calculate the next ScheduleDay considering if the sum of timeToTOC and timeLeftMinutes is less than 7 days\n var timeLeftMinutes = Math.floor(((d1.getTime() + starttime)/1000-LastEOC)/60);\n\n if ( timeLeftMinutes < 6* minutes_per_day) {\n // If the sum is less than 7 days and larger than 1 day, push next ScheduleDay to next week\n d1.setDate(d1.getDate() + 7);\n }\n\n var startDateTimeD1 = new Date(d1);\n startDateTimeD1.setHours(startTime.getUTCHours(), startTime.getUTCMinutes(), 0, 0);\n\n // Check if current time is within the charge window\n if (currentTime < startDateTimeD1) {\n // Calculate time left until the end of the window\n var timeLeftMillis = startDateTimeD1 - currentTime;\n var daysLeft = Math.floor(timeLeftMillis / (1000 * 60 * 60 * 24));\n var hoursLeft = Math.floor((timeLeftMillis % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));\n var minutesLeft = Math.ceil((timeLeftMillis % (1000 * 60 * 60)) / (1000 * 60));\n \n days_str = (daysLeft > 0) ? (daysLeft + \"d\") : \"\";\n hours_str = (hoursLeft > 0) ? (hoursLeft + \"h\") : \"\";\n minutes_str = (minutesLeft > 0) ? (minutesLeft + \"m\") : \"\";\n \n time_to_calibration_str = days_str+hours_str+minutes_str;\n\n return time_to_calibration_str; // still some time left to do calibration charge\n } else {\n return 1; // it's time to do calibration charge\n }\n}\n\nvar today = new Date(); // Assuming today's date\nvar timeLeft = chargeWindows(today, weekday_calibration_charge, minutes_from_midnight_calibration_charge, LastEOC);\n\nmsg.payload = timeLeft;\nreturn msg;", "outputs": 1, "timeout": "", "noerr": 0, @@ -907,15 +827,15 @@ "y": 200, "wires": [ [ - "615bdf17da1a6422", - "e6c8eb42a10e21a3" + "2f1db37da138e532", + "f020fbc3bd8d0451" ] ] }, { - "id": "a0d686b515f76cae", + "id": "68751648fdf25a8c", "type": "function", - "z": "e2588b9d824334f7", + "z": "172866a9820f49e3", "name": "Turn off calibration charge now button when EOC", "func": "if(global.get('start_calibration_charge_now_button','file')==true)\n{\n msg.payload = false;\n}else{\n msg.payload = false;\n}\n\nreturn msg;\n\n", "outputs": 1, @@ -928,14 +848,14 @@ "y": 140, "wires": [ [ - "374a9784b13e6b91" + "0a24f718e758d2a9" ] ] }, { - "id": "0eda2d25df727b9a", + "id": "26b43f1b059c7c77", "type": "function", - "z": "e2588b9d824334f7", + "z": "172866a9820f49e3", "name": "Check whether the calibration charge now button is on", "func": "if(global.get('start_calibration_charge_now_button','file')==true)\n{\n text= \"Calibration charge now\";\n}else{\n text = msg.payload;\n}\nmsg.payload = text;\n\nreturn msg;\n", "outputs": 1, @@ -945,18 +865,18 @@ "finalize": "", "libs": [], "x": 2620, - "y": 560, + "y": 660, "wires": [ [ - "3ff4ceaaebe9defb" + "f43f9fdbb0ed174c" ] ] }, { - "id": "5909342727c04466", + "id": "520ed5df0f889c12", "type": "change", - "z": "e2588b9d824334f7", - "name": "LastEOC", + "z": "172866a9820f49e3", + "name": "", "rules": [ { "t": "set", @@ -971,54 +891,18 @@ "from": "", "to": "", "reg": false, - "x": 1000, - "y": 360, + "x": 970, + "y": 260, "wires": [ [ - "c2e5b1ab69e8b817" + "9777d2795825c36e" ] ] }, { - "id": "44264437fe17f23f", - "type": "function", - "z": "e2588b9d824334f7", - "name": "Cal time left to do calibration charge_backup1", - "func": "// Get minutes per day\nvar minutes_per_day = 1440;\n\n// Battery setting\nmax_day_wihthout_EOC = 7;\nmax_minutes_without_EOC = max_day_wihthout_EOC*minutes_per_day;\n\n// Get TimeToTOC which stores minutes from last EOC reached\ntime_to_TOC=global.get('TimeToTOC','file');\n//time_to_TOC=global.get('TimeToTOC');\n\nif (time_to_TOC ==0){//EOC reahced\n msg.payload=0;\n return msg;\n}\n\n// Get calibration charge time (hh:mm) from user setting\nif(global.get('calibration_charge_start_time','file')!= null){\n minutes_from_midnight_calibration_charge = Math.floor(global.get('calibration_charge_start_time','file')/1000/60);\n}else{\n minutes_from_midnight_calibration_charge = 0;//default value from midnight\n}\n\n// Get calibration charge weekday from user setting\nif(global.get('calibration_charge_start_weekday','file')!=null){\n weekday_calibration_charge = global.get('calibration_charge_start_weekday','file');\n}else{\n weekday_calibration_charge = 0;//default value from Sunday\n}\n\n// Get today's date\nvar today = new Date();\n\n// Find the current day of the week (0 = Sunday, 1 = Monday, ..., 6 = Saturday)\nvar currentDay = today.getDay();\nvar minutes_from_today_midnight = today.getHours()*60+today.getMinutes();\n\n// Calculate the number of days and minutes until next calibration weekday\nvar weekday_diff = weekday_calibration_charge - currentDay;\nvar minutes_diff = minutes_from_midnight_calibration_charge - minutes_from_today_midnight;\n\nif (weekday_diff < 0) {\n weekday_diff += 7; \n}\n\nif(weekday_diff==0 && minutes_diff<0){\n weekday_diff += 7;\n}\n\n// Calculate time difference in minutes from now to the set calibration charge time\nminutes_diff_all_from_now_to_calibration=weekday_diff*minutes_per_day+minutes_diff;\n\n// Calculate time difference in minutes from LastEOC to the set calibration charge time\nminutes_diff_all_from_LastEOC_to_calibration = time_to_TOC+ minutes_diff_all_from_now_to_calibration;\n\n// Set the time to next calibration time\nvar nextCalibrationDate = new Date(today);\nvar_setHours = Math.floor(minutes_from_midnight_calibration_charge/60);\nvar_setMinutes = minutes_from_midnight_calibration_charge - var_setHours*60;\n\nif(minutes_diff_all_from_LastEOC_to_calibration=minutes_fromLastEOCtoNextCalibrationTimestamp){// need to do first time calibration charge;if the calibration setting is too close to last EOC time, then skip the first time and do it next week\n msg.payload =1;\n return msg;\n}else{\n time_left_minutes_all = minutes_diff_all_from_now_to_calibration;\n time_left_days = Math.floor(time_left_minutes_all/60/24);\n time_left_days_display = time_left_days + (minutes_diff_all_from_LastEOC_to_calibration 0) ? (time_left_days_display + \"d\") : \"\";\n hours_str = (time_left_hours > 0) ? (time_left_hours + \"h\") : \"\";\n minutes_str = (time_left_minutes > 0) ? (time_left_minutes + \"m\") : \"\";\n \n time_to_calibration_str = days_str+hours_str+minutes_str;\n msg.payload=time_to_calibration_str;\n}\n\nreturn msg;", - "outputs": 1, - "timeout": "", - "noerr": 0, - "initialize": "", - "finalize": "", - "libs": [], - "x": 600, - "y": 560, - "wires": [ - [] - ] - }, - { - "id": "011bad015cb995db", - "type": "function", - "z": "e2588b9d824334f7", - "name": "Cal time left to do calibration charge_backup2", - "func": "// Get minutes per day\nvar minutes_per_day = 1440;\n\n// Battery setting\nmax_day_wihthout_EOC = 7;\nmax_minutes_without_EOC = max_day_wihthout_EOC*minutes_per_day;\n\n// Get TimeToTOC which stores minutes from last EOC reached\ntime_to_TOC=global.get('TimeToTOC','file');\n\nif (time_to_TOC ==0){//EOC reahced\n msg.payload=0;\n return msg;\n}\n\n// Get calibration charge time (hh:mm) from user setting\nif(global.get('calibration_charge_start_time','file')!= null){\n minutes_from_midnight_calibration_charge = Math.floor(global.get('calibration_charge_start_time','file'));\n}else{\n minutes_from_midnight_calibration_charge = 0;//default value from midnight\n}\n\n// Get calibration charge weekday from user setting\nif(global.get('calibration_charge_start_weekday','file')!=null){\n weekday_calibration_charge = global.get('calibration_charge_start_weekday','file');\n}else{\n weekday_calibration_charge = 0;//default value from Sunday\n}\n\nfunction nextScheduleDay(adate, w) {\n w = w % 7;\n var daysToAdd = (w - adate.getDay() - 1 + 7) % 7;\n var nextDate = new Date(adate);\n nextDate.setDate(adate.getDate() + daysToAdd);\n return nextDate;\n}\n\nfunction prevScheduleDay(adate, w) {\n w = w % 7;\n var daysToSubtract = (adate.getDay() + 7 - w) % 7 + 1;\n var prevDate = new Date(adate);\n prevDate.setDate(adate.getDate() - daysToSubtract);\n return prevDate;\n}\n\nfunction chargeWindows(currentTime, weekday, starttime, timeToTOC) {\n var d0 = prevScheduleDay(currentTime, weekday);\n var d1 = nextScheduleDay(currentTime, weekday);\n\n // Convert starttime to a Date object\n var startTime = new Date(starttime);\n\n // Calculate the next ScheduleDay considering if the sum of timeToTOC and timeLeftMinutes is less than 7 days\n var timeLeftMinutes = Math.ceil((d1.getTime() - currentTime.getTime() + starttime) / (1000 * 60));\n\n if (timeToTOC + timeLeftMinutes < max_minutes_without_EOC) {\n // If the sum is less than 7 days, push next ScheduleDay to next week\n d1.setDate(d1.getDate() + 7);\n }\n\n // Set the start time for d0 and d1\n var startDateTimeD0 = new Date(d0);\n startDateTimeD0.setHours(startTime.getUTCHours(), startTime.getUTCMinutes(), 0, 0);\n\n var startDateTimeD1 = new Date(d1);\n startDateTimeD1.setHours(startTime.getUTCHours(), startTime.getUTCMinutes(), 0, 0);\n\n // Check if current time is within the charge window\n if (currentTime >= startDateTimeD0 && currentTime < startDateTimeD1) {\n // Calculate time left until the end of the window\n var timeLeftMillis = startDateTimeD1 - currentTime;\n var daysLeft = Math.floor(timeLeftMillis / (1000 * 60 * 60 * 24));\n var hoursLeft = Math.floor((timeLeftMillis % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));\n var minutesLeft = Math.ceil((timeLeftMillis % (1000 * 60 * 60)) / (1000 * 60));\n\n return daysLeft + 'd' + hoursLeft + 'h' + minutesLeft + 'm';\n } else {\n return 1;\n }\n}\n\nvar today = new Date(); // Assuming today's date\nvar timeLeft = chargeWindows(today, weekday_calibration_charge, minutes_from_midnight_calibration_charge, time_to_TOC);\n\nmsg.payload = timeLeft;\n\nreturn msg;", - "outputs": 1, - "timeout": "", - "noerr": 0, - "initialize": "", - "finalize": "", - "libs": [], - "x": 600, - "y": 640, - "wires": [ - [] - ] - }, - { - "id": "985f0a278ffd922c", + "id": "652a29107ef4c403", "type": "change", - "z": "e2588b9d824334f7", + "z": "172866a9820f49e3", "name": "", "rules": [ { @@ -1035,17 +919,17 @@ "to": "", "reg": false, "x": 2580, - "y": 500, + "y": 460, "wires": [ [ - "3dc0dde6cbbd97c0" + "f5bba4f7a2152d29" ] ] }, { - "id": "de6a4357e8a1f15c", + "id": "1f497b3cf623d247", "type": "change", - "z": "e2588b9d824334f7", + "z": "172866a9820f49e3", "name": "", "rules": [ { @@ -1061,19 +945,19 @@ "from": "", "to": "", "reg": false, - "x": 2900, - "y": 620, + "x": 2980, + "y": 720, "wires": [ [ - "3e2692e252d4b7ce" + "edf42d9f5ebd6332" ] ] }, { - "id": "ce4254f159092244", + "id": "281c467e3b39527d", "type": "change", - "z": "e2588b9d824334f7", - "name": "set start_calibration_charge_now to 0", + "z": "172866a9820f49e3", + "name": "set global.start_calibration_charge_now to 0", "rules": [ { "t": "set", @@ -1088,18 +972,18 @@ "from": "", "to": "", "reg": false, - "x": 2570, - "y": 620, + "x": 2590, + "y": 720, "wires": [ [ - "de6a4357e8a1f15c" + "1f497b3cf623d247" ] ] }, { - "id": "644fe572f173602e", + "id": "1c9f62ea01d98941", "type": "change", - "z": "e2588b9d824334f7", + "z": "172866a9820f49e3", "name": "", "rules": [ { @@ -1115,18 +999,18 @@ "from": "", "to": "", "reg": false, - "x": 2440, + "x": 2420, "y": 240, "wires": [ [ - "d1f75adc62fbfadb" + "8a1706f0a4eed2ac" ] ] }, { - "id": "d1f75adc62fbfadb", + "id": "8a1706f0a4eed2ac", "type": "debug", - "z": "e2588b9d824334f7", + "z": "172866a9820f49e3", "name": "Debug for calibration", "active": false, "tosidebar": true, @@ -1141,9 +1025,9 @@ "wires": [] }, { - "id": "3dc0dde6cbbd97c0", + "id": "f5bba4f7a2152d29", "type": "debug", - "z": "e2588b9d824334f7", + "z": "172866a9820f49e3", "name": "Debug for calibration", "active": false, "tosidebar": true, @@ -1154,13 +1038,13 @@ "statusVal": "payload", "statusType": "auto", "x": 2860, - "y": 500, + "y": 460, "wires": [] }, { - "id": "3e2692e252d4b7ce", + "id": "edf42d9f5ebd6332", "type": "debug", - "z": "e2588b9d824334f7", + "z": "172866a9820f49e3", "name": "Debug for calibration", "active": false, "tosidebar": true, @@ -1170,14 +1054,86 @@ "targetType": "msg", "statusVal": "payload", "statusType": "auto", - "x": 3180, - "y": 620, + "x": 3300, + "y": 720, "wires": [] }, { - "id": "edf59fb9886b1048", + "id": "8a45f7d38dde66b3", "type": "victron-input-custom", - "z": "322b256f0daf33ef", + "z": "172866a9820f49e3", + "service": "com.victronenergy.battery/1", + "path": "/EOCReached", + "serviceObj": { + "service": "com.victronenergy.battery/1", + "name": "FZS 48TL200 x2 (1)" + }, + "pathObj": { + "path": "/EOCReached", + "name": "/EOCReached", + "type": "object" + }, + "name": "", + "onlyChanges": false, + "x": 420, + "y": 400, + "wires": [ + [ + "45c35e2b5c560d3e" + ] + ] + }, + { + "id": "45c35e2b5c560d3e", + "type": "function", + "z": "172866a9820f49e3", + "name": "Parse EOCReached list", + "func": "EOCReched_list = [];\n\nEOCReached = msg.payload;\n\n//equals to the number of battery\nn=EOCReached.length;\n\nfor (i = 0; i < n; i++) {\n EOCReched_list.push(EOCReached[i][1][0]);\n}\n\nmsg.payload = EOCReched_list;\nreturn msg;", + "outputs": 1, + "timeout": 0, + "noerr": 0, + "initialize": "", + "finalize": "", + "libs": [], + "x": 710, + "y": 400, + "wires": [ + [ + "ee9ba7412a0f3ebf" + ] + ] + }, + { + "id": "ee9ba7412a0f3ebf", + "type": "change", + "z": "172866a9820f49e3", + "name": "", + "rules": [ + { + "t": "set", + "p": "#:(file)::EOCReached", + "pt": "global", + "to": "payload", + "tot": "msg" + } + ], + "action": "", + "property": "", + "from": "", + "to": "", + "reg": false, + "x": 950, + "y": 400, + "wires": [ + [ + "9777d2795825c36e" + ] + ] + }, + { + "id": "2e3be5eb090fdd73", + "type": "victron-input-custom", + "z": "58aeeaac02a3a4c7", "service": "com.victronenergy.settings", "path": "/Settings/CGwacs/BatteryLife/MinimumSocLimit", "serviceObj": { @@ -1195,14 +1151,14 @@ "y": 200, "wires": [ [ - "e31bd3d3a1c25da5" + "4f65d582fda98737" ] ] }, { - "id": "e31bd3d3a1c25da5", + "id": "4f65d582fda98737", "type": "change", - "z": "322b256f0daf33ef", + "z": "58aeeaac02a3a4c7", "name": "min_soc", "rules": [ { @@ -1222,14 +1178,14 @@ "y": 200, "wires": [ [ - "ec4dfbf95393066c" + "464455af5139ee7f" ] ] }, { - "id": "e96ae0338cc426e7", + "id": "ef77ee764778ffbe", "type": "victron-input-custom", - "z": "322b256f0daf33ef", + "z": "58aeeaac02a3a4c7", "service": "com.victronenergy.battery/1", "path": "/Dc/0/Power", "serviceObj": { @@ -1247,14 +1203,14 @@ "y": 260, "wires": [ [ - "86d2d524dcca3330" + "11f86fe39b580847" ] ] }, { - "id": "86d2d524dcca3330", + "id": "11f86fe39b580847", "type": "change", - "z": "322b256f0daf33ef", + "z": "58aeeaac02a3a4c7", "name": "battery_power", "rules": [ { @@ -1274,39 +1230,14 @@ "y": 260, "wires": [ [ - "ec4dfbf95393066c" + "464455af5139ee7f" ] ] }, { - "id": "c21a992cf80c2d6f", - "type": "function", - "z": "322b256f0daf33ef", - "name": "controller_hold_min_soc_&_charge_to_min_soc&heating", - "func": "// get max charge power\nif(msg.payload.max_configured_charge_power==null ||msg.payload.max_configured_charge_power<0){\n max_charge_power=msg.payload.max_battery_charge_power;\n}else{\n max_charge_power=Math.min(msg.payload.max_configured_charge_power,msg.payload.max_battery_charge_power);\n}\n\nmax_inverter_power = msg.payload.num_phases*msg.payload.inverter_power;\n\n// variables for hold_min_soc controller\nBatterySelfDischargePower=200;//W\nn_batteries=msg.payload.num_batteries;\nHoldSocZone=1;\na=-2*BatterySelfDischargePower*n_batteries/HoldSocZone;\nb=-a*(msg.payload.min_soc+HoldSocZone);\nP_CONST = 0.5;\n// min soc among batteries\nsoc = msg.payload.lowest_soc;\ntarget_dc_power_to_hold_min_soc=soc*a+b;\n\n// current power setpoint\ninverter_power_setpoint= msg.payload.L1_AcPowerSetpoint+msg.payload.L2_AcPowerSetpoint+msg.payload.L3_AcPowerSetpoint;\n\nAC_in = msg.payload.AC_In;\nAC_out = msg.payload.AC_Out;\nPV_production =msg.payload.PVs_Power;\n\nif(global.get('start_calibration_charge_now_button','file') == true || global.get('start_calibration_charge_now','file')==1){\n d_p = max_charge_power-n_batteries*msg.payload.battery_power;\n power = AC_out+d_p;\n msg.payload.ess_mode =3;\n msg.payload.controller_info = \"Calibrtaion charge\";\n powerperphase=power/3;\n powerperphase=Math.max(powerperphase,-max_inverter_power);\n powerperphase=Math.floor(Math.min(powerperphase,max_inverter_power));\n msg.payload.power=powerperphase;\n return msg;\n}\n\nif(msg.payload.min_soc<=soc&&soc<=msg.payload.min_soc+1){\n d_p = target_dc_power_to_hold_min_soc-n_batteries*msg.payload.battery_power;\n delta = d_p*P_CONST;\n if(msg.payload.grid_setpoint>0){\n power = inverter_power_setpoint+delta;\n msg.payload.ess_mode =1;\n msg.payload.controller_info = \"Hold min SOC - ESS control\";\n }else{\n power = AC_out+delta-PV_production;\n msg.payload.ess_mode =3;\n msg.payload.controller_info = \"Hold min SOC - external control\";\n }\n}else if(soc=44V when discharging, further details in flow 3\nconfigured_max_inverter_power = num_phases*3000;//3000W for each phase\nmax_discharge_current_batteries = 15*(5*n_batteries-msg.payload.num_limb_string);\nDC_BUS_Voltage = msg.payload.DC_BUS_Voltage;\n\nif(44.1=2 limb strings", + "active": false, + "tosidebar": true, + "console": false, + "tostatus": true, + "complete": "payload", + "targetType": "msg", + "statusVal": "payload", + "statusType": "auto", + "x": 2120, + "y": 540, "wires": [] }, { - "id": "60d904f7b9264e32", + "id": "fcb98057e9e5a076", + "type": "debug", + "z": "58aeeaac02a3a4c7", + "name": "num_limb_string", + "active": false, + "tosidebar": true, + "console": false, + "tostatus": true, + "complete": "payload.num_limb_string", + "targetType": "msg", + "statusVal": "payload.num_limb_string", + "statusType": "auto", + "x": 1540, + "y": 480, + "wires": [] + }, + { + "id": "933a8eed519beb7a", + "type": "ui_text", + "z": "58aeeaac02a3a4c7", + "group": "e177392401620838", + "order": 3, + "width": 0, + "height": 0, + "name": "", + "label": "Battery Health", + "format": "{{msg.payload.battery_health}}", + "layout": "row-spread", + "className": "", + "style": false, + "font": "Arial,Arial,Helvetica,sans-serif", + "fontSize": "20", + "color": "#000000", + "x": 1540, + "y": 360, + "wires": [] + }, + { + "id": "4f18dc53efd7160c", "type": "function", - "z": "32b2f9d4415d82ce", - "name": "get_inverter_power", - "func": "str = msg.payload;\nfirstIndex = str.indexOf(\"/\");\nsecondIndex = str.indexOf(\"/\", firstIndex + 1);\n\nif (firstIndex !== -1 && secondIndex !== -1) {\n substring = str.substring(firstIndex + 1, secondIndex);\n msg.payload = Number(substring);\n}else{\n msg.payload = 0;\n}\n\nreturn msg;", + "z": "58aeeaac02a3a4c7", + "name": "get_total_number_of_limb_strings", + "func": "let total_num_limb_string=0;\nlimb_string_list = msg.payload.limb_string_list;\nmain_switch_state_list = msg.payload.main_switch_state;\nbattery_health = [];\nif (limb_string_list == null || main_switch_state_list == null){\n msg.payload.battery_health = \"BMS connection lost!\";\n msg.payload.num_limb_string = -1\n return msg;\n}\n\nfor (let i = 0; i < limb_string_list.length; i++) {\n num_limb_string = limb_string_list[i][1][0];\n main_switch_state=main_switch_state_list[i][1][0];\n \n if(num_limb_string>1){\n total_num_limb_string = -1;//if there are more than 1 limb string in a battery, should give alarm to stop use this battery\n battery_health.push(\"Battery \"+(i+2)+\" has more than 1 limb string!\");\n }\n \n if(main_switch_state == false){\n total_num_limb_string = -1;//no meaning here, just used for stopping calculating max discharge power\n battery_health.push(\"Battery \"+(i+2)+\" has main switch open!\");\n }\n \n if(num_limb_string<=1){\n total_num_limb_string+=num_limb_string;\n battery_health.push(\"Battery \"+(i+2)+\" has \" + num_limb_string+ \" limb strings.\");\n }\n}\nmsg.payload.num_limb_string = total_num_limb_string;\nmsg.payload.battery_health = battery_health;\n\nreturn msg;", "outputs": 1, "timeout": 0, "noerr": 0, "initialize": "", "finalize": "", "libs": [], - "x": 550, - "y": 1100, + "x": 1240, + "y": 420, "wires": [ [ - "8ce7f1993cecc835" + "fe54eaf69a7fe10f", + "933a8eed519beb7a", + "fcb98057e9e5a076" ] ] }, { - "id": "8ce7f1993cecc835", - "type": "change", - "z": "32b2f9d4415d82ce", - "name": "inverter_power", - "rules": [ - { - "t": "set", - "p": "topic", - "pt": "msg", - "to": "inverter_power", - "tot": "str" - } - ], - "action": "", - "property": "", - "from": "", - "to": "", - "reg": false, - "x": 780, - "y": 1100, - "wires": [ - [ - "e946ebc65cb86f48" - ] - ] - }, - { - "id": "9f2b4a19a3193a2b", - "type": "change", - "z": "32b2f9d4415d82ce", - "name": "num_phases", - "rules": [ - { - "t": "set", - "p": "topic", - "pt": "msg", - "to": "num_phases", - "tot": "str" - } - ], - "action": "", - "property": "", - "from": "", - "to": "", - "reg": false, - "x": 590, - "y": 1160, - "wires": [ - [ - "e946ebc65cb86f48" - ] - ] - }, - { - "id": "ab3e15b7fa7336e4", - "type": "comment", - "z": "32b2f9d4415d82ce", - "name": "Max Discharge Power of Inverter(Battery+PV)", - "info": "", - "x": 2330, - "y": 560, + "id": "c40f347a74b9ef10", + "type": "ui_text", + "z": "58aeeaac02a3a4c7", + "group": "e177392401620838", + "order": 1, + "width": 0, + "height": 0, + "name": "Controller Info", + "label": "Controller Info", + "format": "{{msg.payload.controller_info}}", + "layout": "row-spread", + "className": "", + "style": false, + "font": "Arial,Arial,Helvetica,sans-serif", + "fontSize": "20", + "color": "#000000", + "x": 2620, + "y": 160, "wires": [] }, { - "id": "4a421b5a9efccf75", + "id": "fbdb4518063f2fd0", + "type": "victron-input-vebus", + "z": "58aeeaac02a3a4c7", + "service": "com.victronenergy.vebus/276", + "path": "/Ac/NumberOfPhases", + "serviceObj": { + "service": "com.victronenergy.vebus/276", + "name": "MultiGrid 48/3000/35-50" + }, + "pathObj": { + "path": "/Ac/NumberOfPhases", + "type": "float", + "name": "Phase count" + }, + "name": "", + "onlyChanges": false, + "x": 190, + "y": 1560, + "wires": [ + [ + "e8fb7b9a4581ed30" + ] + ] + }, + { + "id": "52f0fa857f1d3a3c", + "type": "debug", + "z": "58aeeaac02a3a4c7", + "name": "Debug for controller info", + "active": false, + "tosidebar": true, + "console": false, + "tostatus": true, + "complete": "payload.controller_info", + "targetType": "msg", + "statusVal": "payload.controller_info", + "statusType": "auto", + "x": 2650, + "y": 200, + "wires": [] + }, + { + "id": "92ad8226f257785c", + "type": "victron-input-vebus", + "z": "58aeeaac02a3a4c7", + "service": "com.victronenergy.vebus/276", + "path": "/Dc/0/Voltage", + "serviceObj": { + "service": "com.victronenergy.vebus/276", + "name": "MultiGrid 48/3000/35-50" + }, + "pathObj": { + "path": "/Dc/0/Voltage", + "type": "float", + "name": "Battery voltage (V)" + }, + "name": "", + "onlyChanges": false, + "roundValues": "0", + "x": 210, + "y": 660, + "wires": [ + [ + "5b2a12a31ab376c0" + ] + ] + }, + { + "id": "02257e9416d1a7fa", + "type": "victron-input-ess", + "z": "58aeeaac02a3a4c7", + "service": "com.victronenergy.vebus/276", + "path": "/Hub4/L1/AcPowerSetpoint", + "serviceObj": { + "service": "com.victronenergy.vebus/276", + "name": "MultiGrid 48/3000/35-50" + }, + "pathObj": { + "path": "/Hub4/L1/AcPowerSetpoint", + "type": "integer", + "name": "AC Power L1 setpoint (W)" + }, + "name": "", + "onlyChanges": false, + "x": 230, + "y": 760, + "wires": [ + [ + "709a15b9236b4bb4" + ] + ] + }, + { + "id": "f2117fb0ac8584e0", + "type": "victron-input-ess", + "z": "58aeeaac02a3a4c7", + "service": "com.victronenergy.vebus/276", + "path": "/Hub4/L2/AcPowerSetpoint", + "serviceObj": { + "service": "com.victronenergy.vebus/276", + "name": "MultiGrid 48/3000/35-50" + }, + "pathObj": { + "path": "/Hub4/L2/AcPowerSetpoint", + "type": "integer", + "name": "AC Power L2 setpoint (W)" + }, + "name": "", + "onlyChanges": false, + "x": 230, + "y": 840, + "wires": [ + [ + "50510b712eae0e61" + ] + ] + }, + { + "id": "4c40824190b88353", + "type": "victron-input-ess", + "z": "58aeeaac02a3a4c7", + "service": "com.victronenergy.vebus/276", + "path": "/Hub4/L3/AcPowerSetpoint", + "serviceObj": { + "service": "com.victronenergy.vebus/276", + "name": "MultiGrid 48/3000/35-50" + }, + "pathObj": { + "path": "/Hub4/L3/AcPowerSetpoint", + "type": "integer", + "name": "AC Power L3 setpoint (W)" + }, + "name": "", + "onlyChanges": false, + "x": 230, + "y": 920, + "wires": [ + [ + "3cef16a03dd3e544" + ] + ] + }, + { + "id": "d4ab83f8c5fbbd6d", + "type": "victron-output-ess", + "z": "58aeeaac02a3a4c7", + "service": "com.victronenergy.vebus/276", + "path": "/Hub4/L3/AcPowerSetpoint", + "serviceObj": { + "service": "com.victronenergy.vebus/276", + "name": "MultiGrid 48/3000/35-50" + }, + "pathObj": { + "path": "/Hub4/L3/AcPowerSetpoint", + "type": "integer", + "name": "AC Power L3 setpoint (W)", + "writable": true + }, + "name": "", + "onlyChanges": false, + "x": 3090, + "y": 460, + "wires": [] + }, + { + "id": "44d34af9d1e68b87", + "type": "victron-output-ess", + "z": "58aeeaac02a3a4c7", + "service": "com.victronenergy.vebus/276", + "path": "/Hub4/L2/AcPowerSetpoint", + "serviceObj": { + "service": "com.victronenergy.vebus/276", + "name": "MultiGrid 48/3000/35-50" + }, + "pathObj": { + "path": "/Hub4/L2/AcPowerSetpoint", + "type": "integer", + "name": "AC Power L2 setpoint (W)", + "writable": true + }, + "name": "", + "onlyChanges": false, + "x": 3090, + "y": 400, + "wires": [] + }, + { + "id": "4ad6bb1ca25ee32a", + "type": "victron-output-ess", + "z": "58aeeaac02a3a4c7", + "service": "com.victronenergy.vebus/276", + "path": "/Hub4/L1/AcPowerSetpoint", + "serviceObj": { + "service": "com.victronenergy.vebus/276", + "name": "MultiGrid 48/3000/35-50" + }, + "pathObj": { + "path": "/Hub4/L1/AcPowerSetpoint", + "type": "integer", + "name": "AC Power L1 setpoint (W)", + "writable": true + }, + "name": "", + "onlyChanges": false, + "x": 3090, + "y": 340, + "wires": [] + }, + { + "id": "283f5123601abd28", + "type": "debug", + "z": "58aeeaac02a3a4c7", + "name": "power_to_hold_min_soc", + "active": false, + "tosidebar": true, + "console": false, + "tostatus": true, + "complete": "payload.test", + "targetType": "msg", + "statusVal": "payload.test", + "statusType": "auto", + "x": 2360, + "y": 160, + "wires": [] + }, + { + "id": "bf31818b5561403e", "type": "comment", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "name": "Parse Alarms: 26", "info": "", "x": 240, @@ -3177,9 +2711,9 @@ "wires": [] }, { - "id": "8596c0dc478b1b02", + "id": "6cfdcab40b355672", "type": "victron-input-custom", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "service": "com.victronenergy.battery/1", "path": "/AlarmFlags/CME", "serviceObj": { @@ -3197,14 +2731,14 @@ "y": 920, "wires": [ [ - "644fd6453eeca4be" + "48d69f82af0f511b" ] ] }, { - "id": "3e09054f0e54a588", + "id": "0d3303a79e289d82", "type": "victron-input-custom", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "service": "com.victronenergy.battery/1", "path": "/AlarmFlags/DATA", "serviceObj": { @@ -3222,14 +2756,14 @@ "y": 1480, "wires": [ [ - "30d43b7beebf9bb9" + "b0769222c0c81594" ] ] }, { - "id": "75f1ef23840fe7a9", + "id": "563074cf40579013", "type": "victron-input-custom", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "service": "com.victronenergy.battery/1", "path": "/AlarmFlags/FUSE", "serviceObj": { @@ -3247,14 +2781,14 @@ "y": 680, "wires": [ [ - "f3e5be9d70303fd9" + "ea496aafa62fca89" ] ] }, { - "id": "21b93e5c756c9a60", + "id": "51b00c9cd2fbe1b1", "type": "victron-input-custom", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "service": "com.victronenergy.battery/1", "path": "/AlarmFlags/HEBT", "serviceObj": { @@ -3272,14 +2806,14 @@ "y": 1580, "wires": [ [ - "b22ce8dbee5ca745" + "2687afa4a3fb4fdd" ] ] }, { - "id": "cfc5a92164354a07", + "id": "70e342a4485f1343", "type": "victron-input-custom", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "service": "com.victronenergy.battery/1", "path": "/AlarmFlags/HTFS", "serviceObj": { @@ -3297,14 +2831,14 @@ "y": 1440, "wires": [ [ - "e996de028f2a9e80" + "63715023d827fc1e" ] ] }, { - "id": "d6e422e6f274f8bb", + "id": "23c6de3f75ca40f7", "type": "victron-input-custom", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "service": "com.victronenergy.battery/1", "path": "/AlarmFlags/HTRE", "serviceObj": { @@ -3322,14 +2856,14 @@ "y": 740, "wires": [ [ - "c54215196b096586" + "48a80e06931ecc03" ] ] }, { - "id": "31ea89722d0b4664", + "id": "22e2996f04a6a03b", "type": "victron-input-custom", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "service": "com.victronenergy.battery/1", "path": "/AlarmFlags/HWEM", "serviceObj": { @@ -3347,14 +2881,14 @@ "y": 1040, "wires": [ [ - "8f8fd0429cee609e" + "8b5302ef345a5ade" ] ] }, { - "id": "c569c9d1ab910233", + "id": "9ae9fbd4b39b8fd9", "type": "victron-input-custom", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "service": "com.victronenergy.battery/1", "path": "/AlarmFlags/HWFL", "serviceObj": { @@ -3372,14 +2906,14 @@ "y": 980, "wires": [ [ - "478c1c46dcd45a31" + "c6162a8cbc2fa1dc" ] ] }, { - "id": "e7062b99bef916be", + "id": "cc6841127ddbf006", "type": "victron-input-custom", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "service": "com.victronenergy.battery/1", "path": "/AlarmFlags/IDM2", "serviceObj": { @@ -3397,14 +2931,14 @@ "y": 500, "wires": [ [ - "4f4f5ad0a98541db" + "5da7a58078b2d992" ] ] }, { - "id": "43c83a0c3f8b9062", + "id": "d60a6034a1e15ff7", "type": "victron-input-custom", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "service": "com.victronenergy.battery/1", "path": "/AlarmFlags/ISOB", "serviceObj": { @@ -3422,14 +2956,14 @@ "y": 560, "wires": [ [ - "23008a02e8e7da76" + "145932ec555401dd" ] ] }, { - "id": "0c8cf7e25d76c2bb", + "id": "1617808449c51a48", "type": "victron-input-custom", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "service": "com.victronenergy.battery/1", "path": "/AlarmFlags/LMPA", "serviceObj": { @@ -3447,14 +2981,14 @@ "y": 1540, "wires": [ [ - "87e8ae20b843c381" + "47401c80b95f2d5f" ] ] }, { - "id": "a947047c597fb003", + "id": "211ea82f9826409d", "type": "victron-input-custom", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "service": "com.victronenergy.battery/1", "path": "/AlarmFlags/MID2", "serviceObj": { @@ -3472,14 +3006,14 @@ "y": 1380, "wires": [ [ - "943a0ba24db0fab4" + "52aa4d1b9994d41f" ] ] }, { - "id": "b537a788864448e2", + "id": "324aea697f08ab86", "type": "victron-input-custom", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "service": "com.victronenergy.battery/1", "path": "/AlarmFlags/MSWE", "serviceObj": { @@ -3497,14 +3031,14 @@ "y": 620, "wires": [ [ - "e104c979769c9e92" + "7020aeefc2b065f7" ] ] }, { - "id": "8453c5b3a2515d71", + "id": "2aef1941d39c2783", "type": "victron-input-custom", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "service": "com.victronenergy.battery/1", "path": "/AlarmFlags/STRE", "serviceObj": { @@ -3522,14 +3056,14 @@ "y": 860, "wires": [ [ - "00b4380b1ae68023" + "ea1c84dce431e761" ] ] }, { - "id": "2b6ae98d1f9327d1", + "id": "73fde116548e1d39", "type": "victron-input-custom", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "service": "com.victronenergy.battery/1", "path": "/AlarmFlags/TCPE", "serviceObj": { @@ -3547,14 +3081,14 @@ "y": 800, "wires": [ [ - "9603499ff1d02af5" + "f5dd3b77cf306c42" ] ] }, { - "id": "c5c363f24fdb8e5b", + "id": "c5eaf605d4d54f6d", "type": "victron-input-custom", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "service": "com.victronenergy.battery/1", "path": "/AlarmFlags/TaM2", "serviceObj": { @@ -3572,14 +3106,14 @@ "y": 200, "wires": [ [ - "3f6cc0eea8917fc6" + "f0bd6424378e6521" ] ] }, { - "id": "21173aa9d7b7a996", + "id": "3e3a5c9dae5a45c8", "type": "victron-input-custom", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "service": "com.victronenergy.battery/1", "path": "/AlarmFlags/Tam", "serviceObj": { @@ -3597,14 +3131,14 @@ "y": 140, "wires": [ [ - "894cd30780eeff13" + "651cbb5a7a3b7c86" ] ] }, { - "id": "5374532911ad6bbf", + "id": "42e7c69a41b04403", "type": "victron-input-custom", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "service": "com.victronenergy.battery/1", "path": "/AlarmFlags/TbM2", "serviceObj": { @@ -3622,14 +3156,14 @@ "y": 320, "wires": [ [ - "d45457b5810a9327" + "940370b80f41928c" ] ] }, { - "id": "46dff9c084aea665", + "id": "5e766a107066d90e", "type": "victron-input-custom", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "service": "com.victronenergy.battery/1", "path": "/AlarmFlags/Tbm", "serviceObj": { @@ -3647,34 +3181,35 @@ "y": 260, "wires": [ [ - "c49f4275f033343e" + "fccbcd60339ffc71" ] ] }, { - "id": "030d713b96e8cc5e", + "id": "5d32609a7b711e03", "type": "function", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "name": "Parse_alarms_and_warnings", - "func": "//battery health list\nbattery_health = [];\n\n//alarm list initialization\nTam_list = [];\nTaM2_list=[];\nTbm_list=[];\nTbM2_list=[];\nVBm2_list=[];\nVBM2_list=[];\nIDM2_list=[];\nISOB_list=[];\nMSWE_list=[];\nFUSE_list=[];\nHTRE_list=[];\nTCPE_list=[];\nSTRE_list=[];\nCME_list=[];\nHWFL_list=[];\nHWEM_list=[];\nThM_list=[];\nvsm2_list=[];\nvsM2_list=[];\niCM2_list=[];\niDM2_list=[];\nMID2_list=[];\nHTFS_list=[];\nDATA_list=[];\nLMPA_list=[];\nHEBT_list=[];\n\n//warning list initialization\nTaM1_list=[];\nTbM1_list=[];\nVBm1_list=[];\nVBM1_list=[];\nIDM1_list=[];\nvsm1_list=[];\nvsM1_list=[];\niCM1_list=[];\niDM1_list=[];\nMID1_list=[];\nBLPW_list=[];\nCCBF_list=[];\nAh_W_list=[];\nMPMM_list=[];\nTCdi_list=[];\nLMPW_list=[];\nTOCW_list=[];\n\n//read alarm data\nalarm_Tam = msg.payload.Tam;\nalarm_TaM2 = msg.payload.TaM2;\nalarm_Tbm = msg.payload.Tbm;\nalarm_TbM2 = msg.payload.TbM2;\nalarm_VBm2 = msg.payload.VBm2;\nalarm_VBM2 = msg.payload.VBM2;\nalarm_IDM2 = msg.payload.IDM2;\nalarm_ISOB = msg.payload.ISOB;\nalarm_MSWE = msg.payload.MSWE;\nalarm_FUSE = msg.payload.FUSE;\nalarm_HTRE = msg.payload.HTRE;\nalarm_TCPE = msg.payload.TCPE;\nalarm_STRE = msg.payload.STRE;\nalarm_CME = msg.payload.CME;\nalarm_HWFL = msg.payload.HWFL;\nalarm_HWEM = msg.payload.HWEM;\nalarm_ThM = msg.payload.ThM;\nalarm_vsm2 = msg.payload.vsm2;\nalarm_vsM2 = msg.payload.vsM2;\nalarm_iCM2 = msg.payload.iCM2;\nalarm_iDM2 = msg.payload.iDM2;\nalarm_MID2 = msg.payload.MID2;\nalarm_HTFS = msg.payload.HTFS;\nalarm_DATA = msg.payload.DATA;\nalarm_LMPA = msg.payload.LMPA;\nalarm_HEBT = msg.payload.HEBT;\n\n//read warning data\nwar_TaM1=msg.payload.TaM1;\nwar_TbM1=msg.payload.TbM1;\nwar_VBm1=msg.payload.VBm1;\nwar_VBM1=msg.payload.VBM1;\nwar_IDM1=msg.payload.IDM1;\nwar_vsm1=msg.payload.vsm1;\nwar_vsM1=msg.payload.vsM1;\nwar_iCM1=msg.payload.iCM1;\nwar_iDM1=msg.payload.iDM1;\nwar_MID1=msg.payload.MID1;\nwar_BLPW=msg.payload.BLPW;\nwar_CCBF=msg.payload.CCBF;\nwar_Ah_W=msg.payload.Ah_W;\nwar_MPMM=msg.payload.MPMM;\nwar_TCdi=msg.payload.TCdi;\nwar_LMPW=msg.payload.LMPW;\nwar_TOCW=msg.payload.TOCW;\n\n//equals to the number of battery\nn=alarm_Tam.length;\n\nfor (i = 0; i < n; i++) {\n Tam_list.push(alarm_Tam[i][1][0]);\n TaM2_list.push(alarm_TaM2[i][1][0]);\n Tbm_list.push(alarm_Tbm[i][1][0]);\n TbM2_list.push(alarm_TbM2[i][1][0]);\n VBm2_list.push(alarm_VBm2[i][1][0]);\n VBM2_list.push(alarm_VBM2[i][1][0]);\n IDM2_list.push(alarm_IDM2[i][1][0]);\n ISOB_list.push(alarm_ISOB[i][1][0]);\n MSWE_list.push(alarm_MSWE[i][1][0]);\n FUSE_list.push(alarm_FUSE[i][1][0]);\n HTRE_list.push(alarm_HTRE[i][1][0]);\n TCPE_list.push(alarm_TCPE[i][1][0]);\n STRE_list.push(alarm_STRE[i][1][0]);\n CME_list.push(alarm_CME[i][1][0]);\n HWFL_list.push(alarm_HWFL[i][1][0]);\n HWEM_list.push(alarm_HWEM[i][1][0]);\n ThM_list.push(alarm_ThM[i][1][0]);\n vsm2_list.push(alarm_vsm2[i][1][0]);\n vsM2_list.push(alarm_vsM2[i][1][0]);\n iCM2_list.push(alarm_iCM2[i][1][0]);\n iDM2_list.push(alarm_iDM2[i][1][0]);\n MID2_list.push(alarm_MID2[i][1][0]);\n HTFS_list.push(alarm_HTFS[i][1][0]);\n DATA_list.push(alarm_DATA[i][1][0]);\n LMPA_list.push(alarm_LMPA[i][1][0]);\n HEBT_list.push(alarm_HEBT[i][1][0]);\n \n TaM1_list.push(war_TaM1[i][1][0]);\n TbM1_list.push(war_TbM1[i][1][0]);\n VBm1_list.push(war_VBm1[i][1][0]);\n VBM1_list.push(war_VBM1[i][1][0]);\n IDM1_list.push(war_IDM1[i][1][0]);\n vsm1_list.push(war_vsm1[i][1][0]);\n vsM1_list.push(war_vsM1[i][1][0]);\n iCM1_list.push(war_iCM1[i][1][0]);\n iDM1_list.push(war_iDM1[i][1][0]);\n MID1_list.push(war_TaM1[i][1][0]);\n BLPW_list.push(war_BLPW[i][1][0]);\n CCBF_list.push(war_CCBF[i][1][0]);\n Ah_W_list.push(war_Ah_W[i][1][0]);\n MPMM_list.push(war_MPMM[i][1][0]);\n TCdi_list.push(war_TCdi[i][1][0]);\n LMPW_list.push(war_LMPW[i][1][0]);\n TOCW_list.push(war_TOCW[i][1][0]);\n}\n\nif(Tam_list.includes(\"true\")){\n battery_health.push(\"Recoverable: BMS temperature too low\");\n}else if(TaM2_list.includes(\"true\")){\n battery_health.push(\"Recoverable: BMS temperature too high\");\n}else if(Tbm_list.includes(\"true\")){\n battery_health.push(\"Recoverable: Battery temperature too low\");\n}else if(TbM2_list.includes(\"true\")){\n battery_health.push(\"Recoverable: Battery temperature too high\");\n}else if(VBm2_list.includes(\"true\")){\n battery_health.push(\"Recoverable: Bus voltage too low\");\n}else if(VBM2_list.includes(\"true\")){\n battery_health.push(\"Recoverable: Bus voltage too high\");\n}else if(IDM2_list.includes(\"true\")){\n battery_health.push(\"Recoverable: Discharge current too high\");\n}else if(ISOB_list.includes(\"true\")){\n battery_health.push(\"Unrecoverable: Electrical insulation failure\");\n}else if(MSWE_list.includes(\"true\")){\n battery_health.push(\"Unrecoverable: Main switch failure\");\n}else if(FUSE_list.includes(\"true\")){\n battery_health.push(\"Unrecoverable: Main fuse blown\");\n}else if(HTRE_list.includes(\"true\")){\n battery_health.push(\"Recoverable: Battery failed to warm up\");\n}else if(TCPE_list.includes(\"true\")){\n battery_health.push(\"Unrecoverable: Temperature sensor failure\");\n}else if(STRE_list.includes(\"true\")){\n battery_health.push(\"Recoverable: Voltage measurement circuit fails\");\n}else if(CME_list.includes(\"true\")){\n battery_health.push(\"Recoverable: Current sensor failure\");\n}else if(HWFL_list.includes(\"true\")){\n battery_health.push(\"Recoverable: BMS hardware failure\");\n}else if(HWEM_list.includes(\"true\")){\n battery_health.push(\"Recoverable: Hardware protection tripped\");\n}else if(ThM_list.includes(\"true\")){\n battery_health.push(\"Recoverable: Heatsink temperature too high\");\n}else if(vsm2_list.includes(\"true\")){\n battery_health.push(\"Unrecoverable: Low string voltage failure\");\n}else if(vsM2_list.includes(\"true\")){\n battery_health.push(\"Recoverable: String voltage too high\");\n}else if(iCM2_list.includes(\"true\")){\n battery_health.push(\"Unrecoverable: Charge current too high\");\n}else if(iDM2_list.includes(\"true\")){\n battery_health.push(\"Recoverable: Discharge current too high\");\n}else if(MID2_list.includes(\"true\")){\n battery_health.push(\"Recoverable: String voltage unbalance too high\");\n}else if(HTFS_list.includes(\"true\")){\n battery_health.push(\"Unrecoverable: Heater Fuse Blown\");\n}else if(DATA_list.includes(\"true\")){\n battery_health.push(\"Unrecoverable: Parameters out of range\");\n}else if(LMPA_list.includes(\"true\")){\n battery_health.push(\"Unrecoverable: String voltages unbalance alarm\");\n}else if(HEBT_list.includes(\"true\")){\n battery_health.push(\"Recoverable: Loss of heartbeat\");\n}else if(TaM1_list.includes(\"true\")){\n battery_health.push(\"Warning: BMS temperature high\");\n}else if(TbM1_list.includes(\"true\")){\n battery_health.push(\"Warning: Battery temperature high\");\n}else if(VBm1_list.includes(\"true\")){\n battery_health.push(\"Warning: Bus voltage low\");\n}else if(VBM1_list.includes(\"true\")){\n battery_health.push(\"Warning: Bus voltage high\");\n}else if(IDM1_list.includes(\"true\")){\n battery_health.push(\"Warning: Discharge current high\");\n}else if(vsm1_list.includes(\"true\")){\n battery_health.push(\"Warning: String voltage too low\");\n}else if(vsM1_list.includes(\"true\")){\n battery_health.push(\"Warning: String voltage high\");\n}else if(iCM1_list.includes(\"true\")){\n battery_health.push(\"Warning: Charge current high\");\n}else if(iDM1_list.includes(\"true\")){\n battery_health.push(\"Warning: Discharge current high\");\n}else if(MID1_list.includes(\"true\")){\n battery_health.push(\"Warning: String voltages unbalanced\");\n}else if(BLPW_list.includes(\"true\")){\n battery_health.push(\"Warning: Not enough charging power on bus\");\n}else if(CCBF_list.includes(\"true\")){\n battery_health.push(\"Warning: Internal charger hardware failure\");\n}else if(Ah_W_list.includes(\"true\")){\n battery_health.push(\"Warning: String SOC low\");\n}else if(MPMM_list.includes(\"true\")){\n battery_health.push(\"Warning: Midpoint wiring problem\");\n}else if(TCdi_list.includes(\"true\")){\n battery_health.push(\"Warning: Temperature difference between strings high\");\n}else if(LMPW_list.includes(\"true\")){\n battery_health.push(\"Warning: String voltages unbalance warning\");\n}else if(TOCW_list.includes(\"true\")){\n battery_health.push(\"Warning: Top of Charge requested\");\n}else{\n battery_health.push(\"No warning and no alarm\")\n}\n\nmsg.payload = battery_health;\nreturn msg;", + "func": "//battery health list\nbattery_health = [];\n\n//alarm list initialization\nTam_list = [];\nTaM2_list=[];\nTbm_list=[];\nTbM2_list=[];\nVBm2_list=[];\nVBM2_list=[];\nIDM2_list=[];\nISOB_list=[];\nMSWE_list=[];\nFUSE_list=[];\nHTRE_list=[];\nTCPE_list=[];\nSTRE_list=[];\nCME_list=[];\nHWFL_list=[];\nHWEM_list=[];\nThM_list=[];\nvsm2_list=[];\nvsM2_list=[];\niCM2_list=[];\niDM2_list=[];\nMID2_list=[];\nHTFS_list=[];\nDATA_list=[];\nLMPA_list=[];\nHEBT_list=[];\n\n//warning list initialization\nTaM1_list=[];\nTbM1_list=[];\nVBm1_list=[];\nVBM1_list=[];\nIDM1_list=[];\nvsm1_list=[];\nvsM1_list=[];\niCM1_list=[];\niDM1_list=[];\nMID1_list=[];\nBLPW_list=[];\nCCBF_list=[];\nAh_W_list=[];\nMPMM_list=[];\nTCdi_list=[];\nLMPW_list=[];\nTOCW_list=[];\n\n//read alarm data\nalarm_Tam = msg.payload.Tam;\nalarm_TaM2 = msg.payload.TaM2;\nalarm_Tbm = msg.payload.Tbm;\nalarm_TbM2 = msg.payload.TbM2;\nalarm_VBm2 = msg.payload.VBm2;\nalarm_VBM2 = msg.payload.VBM2;\nalarm_IDM2 = msg.payload.IDM2;\nalarm_ISOB = msg.payload.ISOB;\nalarm_MSWE = msg.payload.MSWE;\nalarm_FUSE = msg.payload.FUSE;\nalarm_HTRE = msg.payload.HTRE;\nalarm_TCPE = msg.payload.TCPE;\nalarm_STRE = msg.payload.STRE;\nalarm_CME = msg.payload.CME;\nalarm_HWFL = msg.payload.HWFL;\nalarm_HWEM = msg.payload.HWEM;\nalarm_ThM = msg.payload.ThM;\nalarm_vsm2 = msg.payload.vsm2;\nalarm_vsM2 = msg.payload.vsM2;\nalarm_iCM2 = msg.payload.iCM2;\nalarm_iDM2 = msg.payload.iDM2;\nalarm_MID2 = msg.payload.MID2;\nalarm_HTFS = msg.payload.HTFS;\nalarm_DATA = msg.payload.DATA;\nalarm_LMPA = msg.payload.LMPA;\nalarm_HEBT = msg.payload.HEBT;\n\n//read warning data\nwar_TaM1=msg.payload.TaM1;\nwar_TbM1=msg.payload.TbM1;\nwar_VBm1=msg.payload.VBm1;\nwar_VBM1=msg.payload.VBM1;\nwar_IDM1=msg.payload.IDM1;\nwar_vsm1=msg.payload.vsm1;\nwar_vsM1=msg.payload.vsM1;\nwar_iCM1=msg.payload.iCM1;\nwar_iDM1=msg.payload.iDM1;\nwar_MID1=msg.payload.MID1;\nwar_BLPW=msg.payload.BLPW;\nwar_CCBF=msg.payload.CCBF;\nwar_Ah_W=msg.payload.Ah_W;\nwar_MPMM=msg.payload.MPMM;\nwar_TCdi=msg.payload.TCdi;\nwar_LMPW=msg.payload.LMPW;\nwar_TOCW=msg.payload.TOCW;\n\n//equals to the number of battery\nif(alarm_Tam == null){\n msg.payload = \"Battery lost!\"\n return msg;\n}else{\n n=alarm_Tam.length;\n}\n\nfor (i = 0; i < n; i++) {\n Tam_list.push(alarm_Tam[i][1][0]);\n TaM2_list.push(alarm_TaM2[i][1][0]);\n Tbm_list.push(alarm_Tbm[i][1][0]);\n TbM2_list.push(alarm_TbM2[i][1][0]);\n VBm2_list.push(alarm_VBm2[i][1][0]);\n VBM2_list.push(alarm_VBM2[i][1][0]);\n IDM2_list.push(alarm_IDM2[i][1][0]);\n ISOB_list.push(alarm_ISOB[i][1][0]);\n MSWE_list.push(alarm_MSWE[i][1][0]);\n FUSE_list.push(alarm_FUSE[i][1][0]);\n HTRE_list.push(alarm_HTRE[i][1][0]);\n TCPE_list.push(alarm_TCPE[i][1][0]);\n STRE_list.push(alarm_STRE[i][1][0]);\n CME_list.push(alarm_CME[i][1][0]);\n HWFL_list.push(alarm_HWFL[i][1][0]);\n HWEM_list.push(alarm_HWEM[i][1][0]);\n ThM_list.push(alarm_ThM[i][1][0]);\n vsm2_list.push(alarm_vsm2[i][1][0]);\n vsM2_list.push(alarm_vsM2[i][1][0]);\n iCM2_list.push(alarm_iCM2[i][1][0]);\n iDM2_list.push(alarm_iDM2[i][1][0]);\n MID2_list.push(alarm_MID2[i][1][0]);\n HTFS_list.push(alarm_HTFS[i][1][0]);\n DATA_list.push(alarm_DATA[i][1][0]);\n LMPA_list.push(alarm_LMPA[i][1][0]);\n HEBT_list.push(alarm_HEBT[i][1][0]);\n \n TaM1_list.push(war_TaM1[i][1][0]);\n TbM1_list.push(war_TbM1[i][1][0]);\n VBm1_list.push(war_VBm1[i][1][0]);\n VBM1_list.push(war_VBM1[i][1][0]);\n IDM1_list.push(war_IDM1[i][1][0]);\n vsm1_list.push(war_vsm1[i][1][0]);\n vsM1_list.push(war_vsM1[i][1][0]);\n iCM1_list.push(war_iCM1[i][1][0]);\n iDM1_list.push(war_iDM1[i][1][0]);\n MID1_list.push(war_TaM1[i][1][0]);\n BLPW_list.push(war_BLPW[i][1][0]);\n CCBF_list.push(war_CCBF[i][1][0]);\n Ah_W_list.push(war_Ah_W[i][1][0]);\n MPMM_list.push(war_MPMM[i][1][0]);\n TCdi_list.push(war_TCdi[i][1][0]);\n LMPW_list.push(war_LMPW[i][1][0]);\n TOCW_list.push(war_TOCW[i][1][0]);\n}\n\nif(Tam_list.includes(true)){\n battery_health.push(\"Recoverable: BMS temperature too low\");\n}\n\nif(TaM2_list.includes(true)){\n battery_health.push(\"Recoverable: BMS temperature too high\");\n}\n\nif(Tbm_list.includes(true)){\n battery_health.push(\"Recoverable: Battery temperature too low\");\n}\n\nif(TbM2_list.includes(true)){\n battery_health.push(\"Recoverable: Battery temperature too high\");\n}\n\nif(VBm2_list.includes(true)){\n battery_health.push(\"Recoverable: Bus voltage too low\");\n}\n\nif(VBM2_list.includes(true)){\n battery_health.push(\"Recoverable: Bus voltage too high\");\n}\n\nif(IDM2_list.includes(true)){\n battery_health.push(\"Recoverable: Discharge current too high\");\n}\n\nif(ISOB_list.includes(true)){\n battery_health.push(\"Unrecoverable: Electrical insulation failure\");\n}\n\nif(MSWE_list.includes(true)){\n battery_health.push(\"Unrecoverable: Main switch failure\");\n}\n\nif(FUSE_list.includes(true)){\n battery_health.push(\"Unrecoverable: Main fuse blown\");\n}\n\nif(HTRE_list.includes(true)){\n battery_health.push(\"Recoverable: Battery failed to warm up\");\n}\n\nif(TCPE_list.includes(true)){\n battery_health.push(\"Unrecoverable: Temperature sensor failure\");\n}\n\nif(STRE_list.includes(true)){\n battery_health.push(\"Recoverable: Voltage measurement circuit fails\");\n}\n\nif(CME_list.includes(true)){\n battery_health.push(\"Recoverable: Current sensor failure\");\n} \n\nif(HWFL_list.includes(true)){\n battery_health.push(\"Recoverable: BMS hardware failure\");\n} \n\nif(HWEM_list.includes(true)){\n battery_health.push(\"Recoverable: Hardware protection tripped\");\n}\n\nif(ThM_list.includes(true)){\n battery_health.push(\"Recoverable: Heatsink temperature too high\");\n}\n\nif(vsm2_list.includes(true)){\n battery_health.push(\"Unrecoverable: Low string voltage failure\");\n}\n\nif(vsM2_list.includes(true)){\n battery_health.push(\"Recoverable: String voltage too high\");\n}\n\nif(iCM2_list.includes(true)){\n battery_health.push(\"Unrecoverable: Charge current too high\");\n}\n\nif(iDM2_list.includes(true)){\n battery_health.push(\"Recoverable: Discharge current too high\");\n} \n\nif(MID2_list.includes(true)){\n battery_health.push(\"Recoverable: String voltage unbalance too high\");\n} \n\nif(HTFS_list.includes(true)){\n battery_health.push(\"Unrecoverable: Heater Fuse Blown\");\n} \n\nif(DATA_list.includes(true)){\n battery_health.push(\"Unrecoverable: Parameters out of range\");\n} \n\nif(LMPA_list.includes(true)){\n battery_health.push(\"Unrecoverable: String voltages unbalance alarm\");\n} \n\nif(HEBT_list.includes(true)){\n battery_health.push(\"Recoverable: Loss of heartbeat\");\n} \n\nif(TaM1_list.includes(true)){\n battery_health.push(\"Warning: BMS temperature high\");\n} \n\nif(TbM1_list.includes(true)){\n battery_health.push(\"Warning: Battery temperature high\");\n} \n\nif(VBm1_list.includes(true)){\n battery_health.push(\"Warning: Bus voltage low\");\n} \n\nif(VBM1_list.includes(true)){\n battery_health.push(\"Warning: Bus voltage high\");\n} \n\nif(IDM1_list.includes(true)){\n battery_health.push(\"Warning: Discharge current high\");\n} \n\nif(vsm1_list.includes(true)){\n battery_health.push(\"Warning: String voltage too low\");\n} \n\nif(vsM1_list.includes(true)){\n battery_health.push(\"Warning: String voltage high\");\n}\n\nif(iCM1_list.includes(true)){\n battery_health.push(\"Warning: Charge current high\");\n} \n\nif(iDM1_list.includes(true)){\n battery_health.push(\"Warning: Discharge current high\");\n} \n\nif(MID1_list.includes(true)){\n battery_health.push(\"Warning: String voltages unbalanced\");\n} \n\nif(BLPW_list.includes(true)){\n battery_health.push(\"Warning: Not enough charging power on bus\");\n} \n\nif(CCBF_list.includes(true)){\n battery_health.push(\"Warning: Internal charger hardware failure\");\n} \n\nif(Ah_W_list.includes(true)){\n battery_health.push(\"Warning: String SOC low\");\n} \n\nif(MPMM_list.includes(true)){\n battery_health.push(\"Warning: Midpoint wiring problem\");\n} \n\nif(TCdi_list.includes(true)){\n battery_health.push(\"Warning: Temperature difference between strings high\");\n} \n\nif(LMPW_list.includes(true)){\n battery_health.push(\"Warning: String voltages unbalance warning\");\n} \n\nif(TOCW_list.includes(true)){\n battery_health.push(\"Warning: Top of Charge requested\");\n}\n\nif(battery_health.length === 0){\n battery_health.push(\"No warning and no alarm\");\n}\n\nmsg.payload = battery_health;\nreturn msg;", "outputs": 1, "timeout": 0, "noerr": 0, "initialize": "", "finalize": "", "libs": [], - "x": 1220, + "x": 1120, "y": 1700, "wires": [ [ - "31d2ccfc88f34577" + "9950564581b5af4e", + "c8f9fbd1a718e92b" ] ] }, { - "id": "894cd30780eeff13", + "id": "651cbb5a7a3b7c86", "type": "change", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "name": "Tam", "rules": [ { @@ -3694,14 +3229,14 @@ "y": 140, "wires": [ [ - "a81c3a74b362e5f6" + "714cafa3bd1315f1" ] ] }, { - "id": "a81c3a74b362e5f6", + "id": "714cafa3bd1315f1", "type": "join", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "name": "", "mode": "custom", "build": "object", @@ -3718,18 +3253,18 @@ "reduceInit": "", "reduceInitType": "", "reduceFixup": "", - "x": 980, + "x": 860, "y": 1700, "wires": [ [ - "030d713b96e8cc5e" + "5d32609a7b711e03" ] ] }, { - "id": "3f6cc0eea8917fc6", + "id": "f0bd6424378e6521", "type": "change", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "name": "TaM2", "rules": [ { @@ -3749,14 +3284,14 @@ "y": 200, "wires": [ [ - "a81c3a74b362e5f6" + "714cafa3bd1315f1" ] ] }, { - "id": "31d2ccfc88f34577", + "id": "9950564581b5af4e", "type": "ui_text", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "group": "e177392401620838", "order": 4, "width": 0, @@ -3770,14 +3305,14 @@ "font": "Arial,Arial,Helvetica,sans-serif", "fontSize": "20", "color": "#000000", - "x": 1520, + "x": 1400, "y": 1700, "wires": [] }, { - "id": "c49f4275f033343e", + "id": "fccbcd60339ffc71", "type": "change", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "name": "Tbm", "rules": [ { @@ -3797,14 +3332,14 @@ "y": 260, "wires": [ [ - "a81c3a74b362e5f6" + "714cafa3bd1315f1" ] ] }, { - "id": "994d8e0ea718bc6d", + "id": "b87eb54e5438f25d", "type": "victron-input-custom", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "service": "com.victronenergy.battery/1", "path": "/AlarmFlags/VBm2", "serviceObj": { @@ -3822,14 +3357,14 @@ "y": 380, "wires": [ [ - "18bd214be6e83186" + "1935d7ec73a6e600" ] ] }, { - "id": "bfe694db786e0b7b", + "id": "c7506cd384e34f9f", "type": "victron-input-custom", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "service": "com.victronenergy.battery/1", "path": "/AlarmFlags/VBM2", "serviceObj": { @@ -3847,14 +3382,14 @@ "y": 440, "wires": [ [ - "0fbc9bb6fb67ec89" + "da45a83ea0455f32" ] ] }, { - "id": "09eb3b6ca994d987", + "id": "6892a20f1aa2b6e5", "type": "victron-input-custom", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "service": "com.victronenergy.battery/1", "path": "/AlarmFlags/ThM", "serviceObj": { @@ -3872,14 +3407,14 @@ "y": 1100, "wires": [ [ - "1b1f83e8b2991535" + "0eea322902b7925f" ] ] }, { - "id": "1de58d8c4751e1be", + "id": "98888650ea5d2a96", "type": "victron-input-custom", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "service": "com.victronenergy.battery/1", "path": "/AlarmFlags/vsm2", "serviceObj": { @@ -3897,14 +3432,14 @@ "y": 1160, "wires": [ [ - "1b0e39d1628ab7bd" + "d5c9a8c50fc8d0f4" ] ] }, { - "id": "ec723389362c7503", + "id": "c3f7ef97557d7615", "type": "victron-input-custom", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "service": "com.victronenergy.battery/1", "path": "/AlarmFlags/vsM2", "serviceObj": { @@ -3922,14 +3457,14 @@ "y": 1220, "wires": [ [ - "c7ecd3f162a8522d" + "69f4c090bfb3b6a7" ] ] }, { - "id": "112f05465eebdf01", + "id": "8634dd2bb374e7dc", "type": "victron-input-custom", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "service": "com.victronenergy.battery/1", "path": "/AlarmFlags/iCM2", "serviceObj": { @@ -3947,14 +3482,14 @@ "y": 1280, "wires": [ [ - "755ac176bd905084" + "3a8599bc483c79aa" ] ] }, { - "id": "72455b894e977db6", + "id": "7fa84f8332c8fb96", "type": "victron-input-custom", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "service": "com.victronenergy.battery/1", "path": "/AlarmFlags/iDM2", "serviceObj": { @@ -3972,14 +3507,14 @@ "y": 1340, "wires": [ [ - "c8d63cbf665caf02" + "d274893e4a47892d" ] ] }, { - "id": "d45457b5810a9327", + "id": "940370b80f41928c", "type": "change", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "name": "TbM2", "rules": [ { @@ -3999,14 +3534,14 @@ "y": 320, "wires": [ [ - "a81c3a74b362e5f6" + "714cafa3bd1315f1" ] ] }, { - "id": "18bd214be6e83186", + "id": "1935d7ec73a6e600", "type": "change", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "name": "VBm2", "rules": [ { @@ -4026,14 +3561,14 @@ "y": 380, "wires": [ [ - "a81c3a74b362e5f6" + "714cafa3bd1315f1" ] ] }, { - "id": "0fbc9bb6fb67ec89", + "id": "da45a83ea0455f32", "type": "change", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "name": "VBM2", "rules": [ { @@ -4053,14 +3588,14 @@ "y": 440, "wires": [ [ - "a81c3a74b362e5f6" + "714cafa3bd1315f1" ] ] }, { - "id": "4f4f5ad0a98541db", + "id": "5da7a58078b2d992", "type": "change", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "name": "IDM2", "rules": [ { @@ -4080,14 +3615,14 @@ "y": 500, "wires": [ [ - "a81c3a74b362e5f6" + "714cafa3bd1315f1" ] ] }, { - "id": "23008a02e8e7da76", + "id": "145932ec555401dd", "type": "change", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "name": "ISOB", "rules": [ { @@ -4107,14 +3642,14 @@ "y": 560, "wires": [ [ - "a81c3a74b362e5f6" + "714cafa3bd1315f1" ] ] }, { - "id": "e104c979769c9e92", + "id": "7020aeefc2b065f7", "type": "change", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "name": "MSWE", "rules": [ { @@ -4134,14 +3669,14 @@ "y": 620, "wires": [ [ - "a81c3a74b362e5f6" + "714cafa3bd1315f1" ] ] }, { - "id": "f3e5be9d70303fd9", + "id": "ea496aafa62fca89", "type": "change", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "name": "FUSE", "rules": [ { @@ -4161,14 +3696,14 @@ "y": 680, "wires": [ [ - "a81c3a74b362e5f6" + "714cafa3bd1315f1" ] ] }, { - "id": "c54215196b096586", + "id": "48a80e06931ecc03", "type": "change", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "name": "HTRE", "rules": [ { @@ -4188,14 +3723,14 @@ "y": 740, "wires": [ [ - "a81c3a74b362e5f6" + "714cafa3bd1315f1" ] ] }, { - "id": "9603499ff1d02af5", + "id": "f5dd3b77cf306c42", "type": "change", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "name": "TCPE", "rules": [ { @@ -4215,14 +3750,14 @@ "y": 800, "wires": [ [ - "a81c3a74b362e5f6" + "714cafa3bd1315f1" ] ] }, { - "id": "00b4380b1ae68023", + "id": "ea1c84dce431e761", "type": "change", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "name": "STRE", "rules": [ { @@ -4242,14 +3777,14 @@ "y": 860, "wires": [ [ - "a81c3a74b362e5f6" + "714cafa3bd1315f1" ] ] }, { - "id": "644fd6453eeca4be", + "id": "48d69f82af0f511b", "type": "change", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "name": "CME", "rules": [ { @@ -4269,14 +3804,14 @@ "y": 920, "wires": [ [ - "a81c3a74b362e5f6" + "714cafa3bd1315f1" ] ] }, { - "id": "478c1c46dcd45a31", + "id": "c6162a8cbc2fa1dc", "type": "change", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "name": "HWFL", "rules": [ { @@ -4296,14 +3831,14 @@ "y": 980, "wires": [ [ - "a81c3a74b362e5f6" + "714cafa3bd1315f1" ] ] }, { - "id": "8f8fd0429cee609e", + "id": "8b5302ef345a5ade", "type": "change", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "name": "HWEM", "rules": [ { @@ -4323,14 +3858,14 @@ "y": 1040, "wires": [ [ - "a81c3a74b362e5f6" + "714cafa3bd1315f1" ] ] }, { - "id": "1b1f83e8b2991535", + "id": "0eea322902b7925f", "type": "change", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "name": "ThM", "rules": [ { @@ -4350,14 +3885,14 @@ "y": 1100, "wires": [ [ - "a81c3a74b362e5f6" + "714cafa3bd1315f1" ] ] }, { - "id": "1b0e39d1628ab7bd", + "id": "d5c9a8c50fc8d0f4", "type": "change", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "name": "vsm2", "rules": [ { @@ -4377,14 +3912,14 @@ "y": 1160, "wires": [ [ - "a81c3a74b362e5f6" + "714cafa3bd1315f1" ] ] }, { - "id": "c7ecd3f162a8522d", + "id": "69f4c090bfb3b6a7", "type": "change", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "name": "vsM2", "rules": [ { @@ -4404,14 +3939,14 @@ "y": 1220, "wires": [ [ - "a81c3a74b362e5f6" + "714cafa3bd1315f1" ] ] }, { - "id": "755ac176bd905084", + "id": "3a8599bc483c79aa", "type": "change", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "name": "iCM2", "rules": [ { @@ -4431,14 +3966,14 @@ "y": 1280, "wires": [ [ - "a81c3a74b362e5f6" + "714cafa3bd1315f1" ] ] }, { - "id": "c8d63cbf665caf02", + "id": "d274893e4a47892d", "type": "change", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "name": "iDM2", "rules": [ { @@ -4458,14 +3993,14 @@ "y": 1340, "wires": [ [ - "a81c3a74b362e5f6" + "714cafa3bd1315f1" ] ] }, { - "id": "943a0ba24db0fab4", + "id": "52aa4d1b9994d41f", "type": "change", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "name": "MID2", "rules": [ { @@ -4485,14 +4020,14 @@ "y": 1380, "wires": [ [ - "a81c3a74b362e5f6" + "714cafa3bd1315f1" ] ] }, { - "id": "e996de028f2a9e80", + "id": "63715023d827fc1e", "type": "change", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "name": "HTFS", "rules": [ { @@ -4512,14 +4047,14 @@ "y": 1440, "wires": [ [ - "a81c3a74b362e5f6" + "714cafa3bd1315f1" ] ] }, { - "id": "30d43b7beebf9bb9", + "id": "b0769222c0c81594", "type": "change", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "name": "DATA", "rules": [ { @@ -4539,14 +4074,14 @@ "y": 1480, "wires": [ [ - "a81c3a74b362e5f6" + "714cafa3bd1315f1" ] ] }, { - "id": "87e8ae20b843c381", + "id": "47401c80b95f2d5f", "type": "change", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "name": "LMPA", "rules": [ { @@ -4566,14 +4101,14 @@ "y": 1540, "wires": [ [ - "a81c3a74b362e5f6" + "714cafa3bd1315f1" ] ] }, { - "id": "b22ce8dbee5ca745", + "id": "2687afa4a3fb4fdd", "type": "change", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "name": "HEBT", "rules": [ { @@ -4593,14 +4128,14 @@ "y": 1580, "wires": [ [ - "a81c3a74b362e5f6" + "714cafa3bd1315f1" ] ] }, { - "id": "4b522112c9a3e00e", + "id": "50d6cb46307252fa", "type": "victron-input-custom", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "service": "com.victronenergy.battery/1", "path": "/WarningFlags/TaM1", "serviceObj": { @@ -4618,14 +4153,14 @@ "y": 1700, "wires": [ [ - "d51013c9024393c2" + "3f7e9f9d738dbdbd" ] ] }, { - "id": "0b0601f7912f4ded", + "id": "70096fd1a8d1e527", "type": "comment", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "name": "Parse Warnings: 17", "info": "", "x": 250, @@ -4633,9 +4168,9 @@ "wires": [] }, { - "id": "b04314be6aa4d486", + "id": "028062370fed913e", "type": "victron-input-custom", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "service": "com.victronenergy.battery/1", "path": "/WarningFlags/TbM1", "serviceObj": { @@ -4653,14 +4188,14 @@ "y": 1760, "wires": [ [ - "44369ffe6af08526" + "d810e3509532a76d" ] ] }, { - "id": "dd9526f3fae49939", + "id": "1b22f9619f20aef4", "type": "victron-input-custom", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "service": "com.victronenergy.battery/1", "path": "/WarningFlags/VBm1", "serviceObj": { @@ -4678,14 +4213,14 @@ "y": 1820, "wires": [ [ - "9a0ad343ba27a8d8" + "aec3c11c306fc487" ] ] }, { - "id": "927c6342055e28b3", + "id": "b1b68c7e0f04d624", "type": "victron-input-custom", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "service": "com.victronenergy.battery/1", "path": "/WarningFlags/VBM1", "serviceObj": { @@ -4703,14 +4238,14 @@ "y": 1880, "wires": [ [ - "e77dad2d329159c7" + "1a27a18f8afcc0fd" ] ] }, { - "id": "9faf41489bfa5cb7", + "id": "fc32c5e6a2a29520", "type": "victron-input-custom", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "service": "com.victronenergy.battery/1", "path": "/WarningFlags/IDM1", "serviceObj": { @@ -4728,14 +4263,14 @@ "y": 1940, "wires": [ [ - "40f85c56d33f4c07" + "933f082d544c7d43" ] ] }, { - "id": "69cd4e171b1e45f4", + "id": "bd531ea175cf9396", "type": "victron-input-custom", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "service": "com.victronenergy.battery/1", "path": "/WarningFlags/vsm1", "serviceObj": { @@ -4753,14 +4288,14 @@ "y": 2000, "wires": [ [ - "0e04636407a5958a" + "b68dfa2ca1af5042" ] ] }, { - "id": "9b2ed9f2d58f6366", + "id": "849842cd109d005a", "type": "victron-input-custom", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "service": "com.victronenergy.battery/1", "path": "/WarningFlags/vsM1", "serviceObj": { @@ -4778,14 +4313,14 @@ "y": 2060, "wires": [ [ - "f8aeb00b6b7b7507" + "646620aa94a5a58b" ] ] }, { - "id": "d9809a44cf6f943d", + "id": "62e7d8499b663da4", "type": "victron-input-custom", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "service": "com.victronenergy.battery/1", "path": "/WarningFlags/iCM1", "serviceObj": { @@ -4803,14 +4338,14 @@ "y": 2120, "wires": [ [ - "9e849ea69b4c800c" + "2f126354727a23bf" ] ] }, { - "id": "e96a379add9c8cf7", + "id": "9dd7fb6509c7f419", "type": "victron-input-custom", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "service": "com.victronenergy.battery/1", "path": "/WarningFlags/iDM1", "serviceObj": { @@ -4828,14 +4363,14 @@ "y": 2180, "wires": [ [ - "b6c5033f770dd82e" + "633fb1e3fb40aa85" ] ] }, { - "id": "8af913c74e11c847", + "id": "7d7ae3d9bcd23f66", "type": "victron-input-custom", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "service": "com.victronenergy.battery/1", "path": "/WarningFlags/MID1", "serviceObj": { @@ -4853,14 +4388,14 @@ "y": 2240, "wires": [ [ - "d7023b57a6070ec2" + "59be305aa99ae241" ] ] }, { - "id": "7804c68a85f2d79d", + "id": "091b46b7dbb1bc8c", "type": "victron-input-custom", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "service": "com.victronenergy.battery/1", "path": "/WarningFlags/BLPW", "serviceObj": { @@ -4878,14 +4413,14 @@ "y": 2300, "wires": [ [ - "1e50dc0d0b135ae7" + "fb2f75ab6931515f" ] ] }, { - "id": "f6c2902c5b53eff4", + "id": "083488e978f234a8", "type": "victron-input-custom", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "service": "com.victronenergy.battery/1", "path": "/WarningFlags/CCBF", "serviceObj": { @@ -4903,14 +4438,14 @@ "y": 2360, "wires": [ [ - "8a84c7dd92f14c6c" + "6248c986d96c6ad6" ] ] }, { - "id": "fab0d9eba4a64aac", + "id": "b20ac5ae742b5138", "type": "victron-input-custom", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "service": "com.victronenergy.battery/1", "path": "/WarningFlags/Ah_W", "serviceObj": { @@ -4928,14 +4463,14 @@ "y": 2420, "wires": [ [ - "5e1d4266f1aca1b2" + "aa8070809a252db6" ] ] }, { - "id": "b475f90f9e578717", + "id": "71b228354309c56f", "type": "victron-input-custom", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "service": "com.victronenergy.battery/1", "path": "/WarningFlags/MPMM", "serviceObj": { @@ -4953,14 +4488,14 @@ "y": 2480, "wires": [ [ - "bffcd0ca2610ae9d" + "4faab6568a5d4404" ] ] }, { - "id": "f6c914a6970ff165", + "id": "ad7f9ba97722ce51", "type": "victron-input-custom", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "service": "com.victronenergy.battery/1", "path": "/WarningFlags/TCdi", "serviceObj": { @@ -4978,14 +4513,14 @@ "y": 2540, "wires": [ [ - "2f1ff34c055b36ca" + "52365fad40a27f93" ] ] }, { - "id": "2e8241d774096460", + "id": "a8d7dd081a0fdf21", "type": "victron-input-custom", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "service": "com.victronenergy.battery/1", "path": "/WarningFlags/LMPW", "serviceObj": { @@ -5003,14 +4538,14 @@ "y": 2600, "wires": [ [ - "7ddee613ebbb38a7" + "df72d64cca5dd3cd" ] ] }, { - "id": "cce2f7beba26a94e", + "id": "3087d4cf9e009296", "type": "victron-input-custom", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "service": "com.victronenergy.battery/1", "path": "/WarningFlags/TOCW", "serviceObj": { @@ -5028,14 +4563,14 @@ "y": 2660, "wires": [ [ - "b7e75846443cc632" + "52110469fa1648e6" ] ] }, { - "id": "d51013c9024393c2", + "id": "3f7e9f9d738dbdbd", "type": "change", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "name": "TaM1", "rules": [ { @@ -5055,14 +4590,14 @@ "y": 1700, "wires": [ [ - "a81c3a74b362e5f6" + "714cafa3bd1315f1" ] ] }, { - "id": "44369ffe6af08526", + "id": "d810e3509532a76d", "type": "change", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "name": "TbM1", "rules": [ { @@ -5082,14 +4617,14 @@ "y": 1760, "wires": [ [ - "a81c3a74b362e5f6" + "714cafa3bd1315f1" ] ] }, { - "id": "9a0ad343ba27a8d8", + "id": "aec3c11c306fc487", "type": "change", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "name": "VBm1", "rules": [ { @@ -5109,14 +4644,14 @@ "y": 1820, "wires": [ [ - "a81c3a74b362e5f6" + "714cafa3bd1315f1" ] ] }, { - "id": "e77dad2d329159c7", + "id": "1a27a18f8afcc0fd", "type": "change", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "name": "VBM1", "rules": [ { @@ -5136,14 +4671,14 @@ "y": 1880, "wires": [ [ - "a81c3a74b362e5f6" + "714cafa3bd1315f1" ] ] }, { - "id": "40f85c56d33f4c07", + "id": "933f082d544c7d43", "type": "change", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "name": "IDM1", "rules": [ { @@ -5163,14 +4698,14 @@ "y": 1940, "wires": [ [ - "a81c3a74b362e5f6" + "714cafa3bd1315f1" ] ] }, { - "id": "0e04636407a5958a", + "id": "b68dfa2ca1af5042", "type": "change", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "name": "vsm1", "rules": [ { @@ -5190,14 +4725,14 @@ "y": 2000, "wires": [ [ - "a81c3a74b362e5f6" + "714cafa3bd1315f1" ] ] }, { - "id": "f8aeb00b6b7b7507", + "id": "646620aa94a5a58b", "type": "change", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "name": "vsM1", "rules": [ { @@ -5217,14 +4752,14 @@ "y": 2060, "wires": [ [ - "a81c3a74b362e5f6" + "714cafa3bd1315f1" ] ] }, { - "id": "9e849ea69b4c800c", + "id": "2f126354727a23bf", "type": "change", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "name": "iCM1", "rules": [ { @@ -5244,14 +4779,14 @@ "y": 2120, "wires": [ [ - "a81c3a74b362e5f6" + "714cafa3bd1315f1" ] ] }, { - "id": "b6c5033f770dd82e", + "id": "633fb1e3fb40aa85", "type": "change", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "name": "iDM1", "rules": [ { @@ -5271,14 +4806,14 @@ "y": 2180, "wires": [ [ - "a81c3a74b362e5f6" + "714cafa3bd1315f1" ] ] }, { - "id": "d7023b57a6070ec2", + "id": "59be305aa99ae241", "type": "change", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "name": "MID1", "rules": [ { @@ -5298,14 +4833,14 @@ "y": 2240, "wires": [ [ - "a81c3a74b362e5f6" + "714cafa3bd1315f1" ] ] }, { - "id": "1e50dc0d0b135ae7", + "id": "fb2f75ab6931515f", "type": "change", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "name": "BLPW", "rules": [ { @@ -5325,14 +4860,14 @@ "y": 2300, "wires": [ [ - "a81c3a74b362e5f6" + "714cafa3bd1315f1" ] ] }, { - "id": "8a84c7dd92f14c6c", + "id": "6248c986d96c6ad6", "type": "change", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "name": "CCBF", "rules": [ { @@ -5352,14 +4887,14 @@ "y": 2360, "wires": [ [ - "a81c3a74b362e5f6" + "714cafa3bd1315f1" ] ] }, { - "id": "5e1d4266f1aca1b2", + "id": "aa8070809a252db6", "type": "change", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "name": "Ah_W", "rules": [ { @@ -5379,14 +4914,14 @@ "y": 2420, "wires": [ [ - "a81c3a74b362e5f6" + "714cafa3bd1315f1" ] ] }, { - "id": "bffcd0ca2610ae9d", + "id": "4faab6568a5d4404", "type": "change", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "name": "MPMM", "rules": [ { @@ -5406,14 +4941,14 @@ "y": 2480, "wires": [ [ - "a81c3a74b362e5f6" + "714cafa3bd1315f1" ] ] }, { - "id": "2f1ff34c055b36ca", + "id": "52365fad40a27f93", "type": "change", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "name": "TCdi", "rules": [ { @@ -5433,14 +4968,14 @@ "y": 2540, "wires": [ [ - "a81c3a74b362e5f6" + "714cafa3bd1315f1" ] ] }, { - "id": "7ddee613ebbb38a7", + "id": "df72d64cca5dd3cd", "type": "change", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "name": "LMPW", "rules": [ { @@ -5460,14 +4995,14 @@ "y": 2600, "wires": [ [ - "a81c3a74b362e5f6" + "714cafa3bd1315f1" ] ] }, { - "id": "b7e75846443cc632", + "id": "52110469fa1648e6", "type": "change", - "z": "812b3c1b3d3fa76b", + "z": "449f3115316b1767", "name": "TOCW", "rules": [ { @@ -5487,14 +5022,31 @@ "y": 2660, "wires": [ [ - "a81c3a74b362e5f6" + "714cafa3bd1315f1" ] ] }, { - "id": "b24e3f9e55310caa", + "id": "c8f9fbd1a718e92b", + "type": "debug", + "z": "449f3115316b1767", + "name": "Debug for warnings and alarms", + "active": false, + "tosidebar": true, + "console": false, + "tostatus": true, + "complete": "payload", + "targetType": "msg", + "statusVal": "payload", + "statusType": "auto", + "x": 1430, + "y": 1640, + "wires": [] + }, + { + "id": "1d4797e6a377f6bd", "type": "ui_text_input", - "z": "dd75eef8547a776f", + "z": "9744d7fd57e81fe3", "name": "Grid Setpoint", "label": "Grid Setpoint", "tooltip": "", @@ -5513,14 +5065,14 @@ "y": 320, "wires": [ [ - "c0d1f3cc766406f9" + "47479c689064cedc" ] ] }, { - "id": "c0d1f3cc766406f9", + "id": "47479c689064cedc", "type": "victron-output-custom", - "z": "dd75eef8547a776f", + "z": "9744d7fd57e81fe3", "service": "com.victronenergy.settings", "path": "/Settings/CGwacs/AcPowerSetPoint", "serviceObj": { @@ -5539,9 +5091,9 @@ "wires": [] }, { - "id": "7aa9ca6b5a7a4b84", + "id": "556390611f6a678e", "type": "victron-input-custom", - "z": "dd75eef8547a776f", + "z": "9744d7fd57e81fe3", "service": "com.victronenergy.settings", "path": "/Settings/CGwacs/AcPowerSetPoint", "serviceObj": { @@ -5559,14 +5111,14 @@ "y": 320, "wires": [ [ - "b24e3f9e55310caa" + "1d4797e6a377f6bd" ] ] }, { - "id": "351a4c8e3b05e80b", + "id": "b0ce481c0c609c63", "type": "victron-input-custom", - "z": "dd75eef8547a776f", + "z": "9744d7fd57e81fe3", "service": "com.victronenergy.settings", "path": "/Settings/CGwacs/BatteryLife/MinimumSocLimit", "serviceObj": { @@ -5584,14 +5136,14 @@ "y": 380, "wires": [ [ - "ccfa1e9e74d45f5d" + "69cd8accae6fa947" ] ] }, { - "id": "ccfa1e9e74d45f5d", + "id": "69cd8accae6fa947", "type": "ui_text_input", - "z": "dd75eef8547a776f", + "z": "9744d7fd57e81fe3", "name": "Min SOC", "label": "Min SOC", "tooltip": "", @@ -5610,14 +5162,14 @@ "y": 380, "wires": [ [ - "11baf8f4cdfc9eed" + "c13e22a0d82b1d03" ] ] }, { - "id": "11baf8f4cdfc9eed", + "id": "c13e22a0d82b1d03", "type": "victron-output-custom", - "z": "dd75eef8547a776f", + "z": "9744d7fd57e81fe3", "service": "com.victronenergy.settings", "path": "/Settings/CGwacs/BatteryLife/MinimumSocLimit", "serviceObj": { @@ -5636,9 +5188,9 @@ "wires": [] }, { - "id": "6397816a6019c94c", + "id": "0b3ff7262ff95b26", "type": "ui_template", - "z": "dd75eef8547a776f", + "z": "9744d7fd57e81fe3", "group": "e177392401620838", "name": "Battery Monitor", "order": 5, @@ -5651,10 +5203,56 @@ "templateScope": "local", "className": "", "x": 200, - "y": 480, + "y": 500, "wires": [ [] ], "icon": "node-red/arrow-in.svg" + }, + { + "id": "d45cda2314ed0452", + "type": "victron-input-custom", + "z": "9744d7fd57e81fe3", + "service": "com.victronenergy.battery/1", + "path": "/Soc", + "serviceObj": { + "service": "com.victronenergy.battery/1", + "name": "FZS 48TL200 x2 (1)" + }, + "pathObj": { + "path": "/Soc", + "name": "/Soc", + "type": "number" + }, + "name": "", + "onlyChanges": false, + "x": 230, + "y": 440, + "wires": [ + [ + "2ba3d56099bc52e7" + ] + ] + }, + { + "id": "2ba3d56099bc52e7", + "type": "ui_text", + "z": "9744d7fd57e81fe3", + "group": "3290bd5996bd3175", + "order": 3, + "width": 0, + "height": 0, + "name": "SOC", + "label": "SOC", + "format": "{{msg.payload}}", + "layout": "row-spread", + "className": "", + "style": false, + "font": "", + "fontSize": 16, + "color": "#000000", + "x": 430, + "y": 440, + "wires": [] } ] \ No newline at end of file diff --git a/NodeRed/NodeRedFiles/openvpn b/NodeRed/NodeRedFiles/openvpn new file mode 100644 index 0000000000000000000000000000000000000000..466bd39d8ff5d6101a4412b71eb8f0f0b00b9327 GIT binary patch literal 7819340 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 h@^~ z%PlIM@>ZFOpJDa;9`cxJ-@8Ru+Q&hE>0q5v_OA`d&yA9yX>5@EPptRtd^M(Q)_+pa zD9NAplW%f@G^aPXtO;i5v)x;CpZGW@G@!FQ5>pw2887453sp`M9k3&HM^xq2u#Zb; z=BvznYJMZQMuRdNKSY@$29}gA)y@_5#7AkO%0(6_W+srg~$d0Z~?Kxc8O-+lGxRRew4 zCS|{Uj^{f(C!&`;$3D#r&*}VU^1p$<=4tEZa5px6a3SY6oArLyiz|Iw#`SQ&Tz)0{ z8zm1eElaj(E*#1j-6huc82Tl9b)Iu>DTQRSPQu&HJ>J?A?(jky^OB2*hw4mj(`=q8=ITFEDr}!ONfD z@3Uc}?D}VCU^k(?WjE*-9p61ceYve1s_QJwNG$O}zmN={=j|-6Y77m(_h2XKml;oW zCYGg^atGth;E*ZHUZSx*M83|8qR$KdyRx$`0)I>*J^EQc z^N8}JJVQKtd4_pvEg!jAeuyXYh4O&U)~nS?cBuqLR;t$PiehaGC=F) z7reQLGwb&cr*-TA?kwQa5zapP7qD8hGJed+02g`i)=l(dbOzt2&7b2{Ltp6^YL`?f4mV(dD44syREW5)D2YfpC|43h|Iy`Q8#2qxS(2*jw{05Ah`oCw_yVi>hw567?36s8jEypj z%$5w5Jo4ozwx0q%7|2w$*Y%l|Uan~sHi+rSlO>++#g;y4>|n`mZ+xNKOYF$lR{GbDL!&3b+3fpB&DOXrEWs+KKkL>wM0abnn-weKy1f z?pL{&yb|QIE>53I<1=xxFB4@$3D))gOghy$ut^QE<-dL~XGh!eF9b$qtK9IQa_LL4 zwRf^Vmb}}O%RHS^x*^9|#ne^%Njku4|0D2}(=F~7 zgSij=P8OQU$?l-Ti6@p8HGfq>Q}m&9KShm^Ck~*KAzWbrWB@-r0DW~6XZ+oHV9~p` z(y?pJZRB3$S#)cZAz3)m?b$`epOg$GXQ4_{Fh-o@K% zJ{oR-V*{rJJZs-_;U_P;Y&TA@DsEMOTtRc*!1zutzUl~Z z_xO2*2jOl&+4G670N!!PzOV9Mcb)B{-~2Y@c$dU)$MnB??W3$XaQfj>{BX*Fw;c+f zHY_rd>t9KW?p+y_bk?0 z=-$xF*rW|G4yE7JIF%o*9lAsIs!7+M=6waxd&6O2?`3R*%h>$g+;7ghaB4yOfui?8 z^o8u%#1r*a%HQvDdE!)+ANz%Y{qu}v(cX=mt7#z3!?d*#zODAcON{;KM#-!$-V08e zI1i88G#>!(xs<0dt~uuyif1p5dEv=%@NkW9gv4*CH3fjcJa)ue?M6NitedSK{u)w zSOx*h9fUPO6BW^H;cfcB*hKOUx5n1E$kO7C(EK3qeJ(UGsPmp--2KROnkcQIohnDT z*SYpfXrtQOgFd_y{{%yK+0ut8U*VewpG){S4;Rt9z%{Z$9GJ%>h3f~MPXN;@(o~RM zb`lY#A$&RE+E0}&%}oC5eB@di z4{&}gX>>2xBaCrh*FB!TpN(7-rp{Nwfxcr@C$OAO+bRefhF`FCk*@{V{;3Of!7iABf4q76& zlJ`>HEs5KTU#|bn7~uEAeRtfyi1*XIliNc6*>ku9mopj1fNSst?pjOt z;%Y5AkFjO*4(AE{4*~OBU|#$ZZ{h;uCft4Gm+OC3FZciV!^&OjU&NQEJ<|UJ)R(($ zt@BgH-X`20T;X*+y30q|&yDl{VPMXp&&-bI!ymwoHkiuV*l_kPCY|>07GI?PxK6yA zc3x*}PVCs_v~y}HNITDx`x@H5y8 z=#3HS0CgV;@&|Gaw9fmVYbNSUm&OTtCH9i^&KC1d?>b!UJ$g6b%BETETt9)kXuwaJ z|I&4`4qRHzHTj!Y5Xt$g_X_|Fipb5F~akMZG$rwETT9$;PJvBb|K zK8@dxpGExa@tp6)orSA?m^R#*xXDkmHo~3pk+tT{*XiV4h+q4^?YIft`M8rvcO33S z++%TDaEIf@acgkL;SR-(P>$XrYsA%?uT8kSajS8QxDB{@+`941r=+jNjVmAS1-NNs zN!?dmHIy~geCD=vqL}W?);z+zqy1v-t7^{K!#pvbIcE=Z!|1_*z9e~NyEzSaXMC-5 zI_?hKQ*pa+Pr==adou18T(voeJ3{U&XIO9l?hLDG8Sb2BtEu-4Ytl*0R&9N=wG;Qi zOi$HoiDzX7Eos7F`T}>+7dm zEz}tyd==sA_kv$jX zlUz(*NBSU@ZO%7%b@=5_CdnqVKA?`+{NZCsuX?IIcazmqkY9T~5%#;4w%qQOy_9H$%U<2HtaZVo zwC7&xRs8pf*WGj)R}Ul8XI=awC*ChOi5~^3XB&{)mQ&{)Kb()vNfo^ZkHtG}QGh z?u&fe_|C>Jyom0u{;Z7*>fIIKxglsp^k4(WB=k9fxO)et@<0!eR;%1P(UjJR;4LUR zQ9eJ9?jQB*(7LXUvYTjI`-uDB2r%vtOT*lM$X>(LLwgOPr}mNa^Loco|FzH3V9Ipg z2ax_-=Zd5wm#h5+xzdNrje2g{bG5&qaP2RsKEcX5OL|cLyJx7X=*NlRa{>3GZ1Cz8 zJ+sE^wQ<=KHM(!SJ2p1hRRD zd~)NSU+s}U>bYvyA-J(OI}C1c8ixkjM=r?M+Ah9?X9G8`;11#nZq`Ny?h0JNU5P8W z2jL2C!K*ujw2!0ueK=IV{DQk2E+2j$Zne*c6MP;9r*IPY@Z09YN!Yu=uizZR+jm1) zTflFA78ohL{IbLJ@(s{gG>BdrUAt&VYm>TMr?Y{%(@w#6;tlygr@J132*Oql+DyQ| zlGqJF=f-9&?(Lx@?{Tag_P2?4WA`(ps-YChWrv24Ya-|wpar926hDh6hZa8|J`8W3 zU~uNTAu#Yz zz%SnOJHpi_{eOY~b`oBe7`UjlAih^BFhyJFgM9i2ot}vrpDb{!#^b zv^S)3G;ZJxhW-M$qCfF@(I0bx88^&T=I(RS>yGB$LAVaCwJ&D&Y6e+Hn|+tcKe=7}*Zxi3@bSfxA^o?BzIM@Dw z+$_?h1}Z#;@$kHBUSj$(ANW-8n`4{rO7uHFU|GB3N!^Qk!$G`v&Ac%lCtK zneQ9#GT)kaneV=LnQ#8P%y-+n%y-i}PJD&^hLPU=C5%ChMaD`Yz}P9@>(^dD zEq#0bd$@0szJ?ETKLTlz=yap>FYleyjkNoaM@ts#SoVE;^S?me;skjE-v<8QGRl>e zG!7>oopE~2n8sF@wBq}^*P`XZjI$it8MqJ5e)6IB2yEcc9gDTth#8rJb?U4LHbjKo zbk>66siwVobDmc7gvJ7Q%^LYc^M~)(7$5lrcZO14Y(RM}gh{@ZEIHgOZzt)S&ug~6 z#GqZsAQLS=%744sz5h@AFV5aLJSaS#`?voNkJp^?cg7^7UqAHdTMF5LD|0GL=^|xe z$`3BW<0(V&tf}F}-aTgE^{=c=#Z#X-fp-(Allc)lZQb{r-5ew@`r*gzi1iiQ8e!%Q zjn9cAIvwFkW0WzCUYfI;;7jbvrijZeN7Z zv-|vyL{b#7xk%qvKwQ5IdmtN#oKktr~02KUwPb6wOwNoy9x9v^$lh6 zcP)K79{Lt--%z1>GOxGrdRy6W6ir`Cr-(P`emub~c~52M1PAz}4|c&PG|w&IAq z9Z`50e!+LzjihI-c=}vy<#2bdroVaj`-(ed1Ge0`jdoSxei~PI_TPe=!(H~fgMI68 zbzjBhggwgt4*p-t|HZhvW3Pq(8gCKc>w*s@@e78vuULJJ)RFiL_e9}p4K;~8Cj$Fy zh2tNG|9$x9;@29g8Gk+gar}?+UvHD&gU-B;vL9kSsB&ckVeaQA{^+~7LzzAmZR*a7 z)ezg4_}1`!neQunS|^FVv@UuQJgQt{Q%OB)>&R*D9#DjGbyu!M{9E(fat)n$ebb37 zGM~Oto5!-JRY^O?;CA6(h3!NDzi`#X|L?veoa9Sao|!4G2PfTp>I>13?tshkRdcRs z%S_oW@{R_5C|ODH)JM3Emt*&*^!OhlPW`kNcQ)?qTWxG1umPZM^_Pvi z1@|E1Wh3t2aOZIUqQ)w`iFH}Fa22#Mhx-V>G|K9mi~B{~dAPIDAI=`e9VPPuecOVr z&8cWAb{@1#|85(darTylpXP<{C0w+-hq(2(+kLxn_e{+=U*~_G|GW7g7)BY?k>~$G z&QFE-Z*e!>U-umBdmH_MY%>=h4NTO%5C3lbV|fo_CI0-?g5_$X7qTPBwAjLoc&h^5 z5-*Aed<+=*c4;4LJ^9+mcMtix@ps{$jejBjb@)5*&%r+*|0?|R@Xy147kZ6 zGW?&!|E2ujiF?X_+I@3KKZ)=-{!f#B7XESgTk(Gq{|x-i_?P4VIQ|W|de60vu$%C2 z#V>d@XU+=nb{=us`?|r4Yr?-5|8@AKQ_#eiQSJKPKmT}T5ALUzt8ss-$uSC`JUq2#HX?UGVag$ z_A%B&No0J3Pf!l*g?o<+Q2Im@&l0PK3>E8d)*%>GEY1@pY*-64Q zX8_NPa~WSZ9zK??AxvY;A4^t>Ig7Egb58$w`WgTI@pLA%;E$)%bsiD=(0H=0&N%yS z&p7WVOuVRSTEebMF97Vv7G$O7j&;M5(X9UFsvU*??89{O41@CV>Qcbpnp z!e)Ij?Pm>E=)jE*pewz(B3!t#7ktX2w+eJfqCwH!>`k13x5&Hoza{*B+EHGnc)HeW z9~w}m-cB;|0Im(cjX^uzwBOK9EN#~90qi!k7p}WlbJ68ScGvnqd+~a|UHaFmnAQxL z;tZt)4)O7Cdh!W87dZ!fdu@ra);*1Vc{A5j&SSLwx4<*R&EQ9AeEgWS zq-z?GF2fkoUa;D;lJ-c?XWm>vUzWwz1iCXa^HoQsi{hc06RTL$Jo9FSCr9ahlk8@r zBSfx_N`J!`s$h-0gYzIeNxSZIdZVF#y{kF+mu0X??y4os1~$n$ht|a)L2wNP2+8c_ zWhWZ5&`!FzbU@ih@qXE^va;2G5z6ij9A36xu0KzM>p~s8wS#$3GK1dPxR?KeI|c5` z)6F`%(^){A_*jOqlPOClTIit8_TOAt6ugGEN4e_?+SZN&V~O~RmG5*m##n0{y|g%S z1o8Q$&KZwa_T|rJ9uF*YZlX;6*P20gIom%2{J`kPe~ftMHf+nXHPVx4T^JhGzZL;y z_3gh|S`^*a_V4%qANPbC-{HCU;_jo3 z))b#t@(vL&P+!;|bDflvivSbtl%D@Ac*6aJS;?%?y9Wt7jWF?9=)T5Esf||nw4<`6 z`yS`sT=ZXt=f$!$+`BT|jy*qojs<@q?)P3?fH>}hA08l1eT2Vc&4hQ}${Qo2wlEf5 zef@Ik9Rn=OKIig<75E$R--rJ}{`)ew=wv*8$^IXPRy3Bd!!|PFR~Q!`qJi*`LNzpE zN799A-h7kJr#~!rSl9;esB{}5{psAW+@Ua^rdBB}xRGw*n|G*R6VfH`+Udz(S|ew@ zx!KiaO)IU7E+1}17qM@3wUG<(!&5|W*&6t0g>1yv!(&9dTGz`pwjA_{sSlh7s53~N zx`(MT&G}ESZWM}#>P9zwsBYPRTkPLkvF+?-Jx|@!xUY0M{UiU64J`5pjQ=_O*P8gy zAv^o&#$RRpi-!w7tq%pC+~tgCU#~0L5uAdr?ri_g?kuhI=>yrW((IDeVzNJ=W_5^72WRWZj(04I#=aY*vsA!&Xbh$%S%Oj z*Aze|XqZ;oMOYWMcM%I4cI@xwK{r}+cQ&rA=pb&8#W@h-=gBs&bE{)#w>p6YuF_Fv z$Xe`RqY)kyWjz|CA9K=jHysTLS1=YvpCjH~Q~D)-tuq9R{#Rq$6!?sr zb{=_qu*=9{m$8lYh(8uI4!&$_jRQ?kzt%oo#D_S;_RMD$zRLL%x@N8WHAkk2dx~)N z;~>_)8Orp_YNPBINi&-?_fV$z`$WRTugcHkYy%eGZep@`-db~4BWbsiznT1>_43Px zLNHYkCYZWBn0`_Q(_Ypi4-)=1YZD)qo!BmHAYY!ik9uYOlCrKUt4}r>8%eW?G}n7+ zWZSZ_tej5LJWZNaq-piiyx_q!hp@RGJYNSM;YWCyLHMnN%eKRZM|OR}b%MAFrkuR) z80c*+OVdc2Z1UG(sN+bSBtZTw#$e158?n zE)xx)vw-&+UNZ>VRQUZ0kM*GEzE<}Yp38t=VjKT;I`@1oGRhK-p+K|;8IS$L==L`% zV%y)4UVI2~E-kxdT{Opq?@a2oX~Uz+2QG$vvAytUXU3UFJM5Is6HY7q8W~Lc23iaG z_-Pus)_IA1G34z3v0VOr3u(rcrO}(RInro-^GDK%zGUYi`jAX2`l$8#^^cpug^kVDyfBS7N z4!W$2a{_HV(JOC~SKjZ*r}6Z@GT5YNdxP*~8El&4MZ222o&Yw@PtBC|{C9Yxkhy&d z^OIznskqniE#iX#TIch9ickB*(ixq}cNO2|eE0Kh=DUs0+&_|@T(r~LV__aKE_bmZ z%ZbMX;_#>wp^KFCL{rdj!(S4}F{3&i#{9XVXSH9|C7stI!Q0?@C6{-nNlT&;$5sWUHd`(pTEhYQ{N=^hU=-9`PUY zRcT!~+>1A|2KFpfDQJRv2I(zE>XN*Hty(w`8=tSa@Rovf_Fo;P^`FlBnfIRISE8dt z=?rMD+RR(i%=bgzQSkS&bn+&@fm;WoA~Uip+! zA%6H8c{HaQyP4P}9$eQLxS;i+qG!oGsz+mP?l3&J&U?jqLCgY1IxFHe{2uJ6E&E5&pK~$S)g0^^-4e`Zxk6 zaOBztth>@?uL!+2>!cabqsFb>Ai4mbti#RP6S~y;bH0JkeRJ(SG4N0L$DyH1udw@~ z&@Wn0Ge4K_ZJ4^e{mRF>EBnU5bN=1>ZhD9MPX9OSyO;Xnrar;ywoy3H-j-Q&gMXdL z;%!OCq8;F*Lb8MU_Xg?~9$MZ3hVZ`$!zY2E1sF6or2Ds_Wv$14G0pB9c`-D^cvOG0 zuV(N$3pn17{#7&+it!VbltrI_M~xA!gL9`r++`Z&&u1W`cqyzb!J%pg}|dao+_(D z_7H049bP;2p0?rj(!pcLOK>&s%aJt4h^QwEpDr4JV>mqT#P0WQhHUoC@6^+_h%|F?b| z2(I{mbQh6MGFdO_ILFm1`i^OZcVTuRu<+xYzwV>+*mqyQ~F*4Eh8@l?? zX?Ab9{}cG7KTXmm*$ipVTlQ(l5rr7*6uqmi`x(^c2IgV$2xRMUQ-V6;jOoPiqK*Cr z-d4lAaKllc@UFb>-;wRo)EWehu=t&1tw5UnxErj#edvhn>Ke0W^YE#{MFM+F@F-a$ zmMugn8@oNDdl0SaeRT28EN#{ryrIl~;Y8}IAdUYXdm3E%a_wBwPXJeQB5R$M;7V(7 zGd7f-_NafP!>C1fq5Ir)p0OHzMkKw|IgPWXlP+YOQm+-e+u>e?UfH<%WovD7F>CNT z%1*04*>{)CS?9MZ`zA8y{?zM}ArQsR*9Ke9^ZUd*y!fA2}XWTfO?BO(y9!Pdu zrao|Yv2YykbOP~O7r${AzdBc3j$dO}mvZOoH?J3N8N(iKukvuKKG3+Y1gFtB@6tuw zd5klhMZGWJ&pXxeHP3CKUBa=>E&Dbir&Fi;p_wtak1@Nh3=f*0gk$ZQUvLP=D;(1& zv@b*22smy4w^7?Z~L^~-w%=j46V}-hSuqaYWg8UKiuN=gX*Kw?``R}v`w~aMukgCQ!ktS~(0d(tZ8`$IvsQBHJuaDNs@@g}H$nda^nc6` zx-+ic@CooPdXA{=%xmH!qT|K{dj}TtAvA3G13UyB#&eGX>p=QNuB>l@c2m&qJ?ev4 zqKI8|eJJYgs$JhlvfTAv7iO{BTqOS6MC3&CM4I23=ld5}Bjh&GSny8?e0-eLGL{80ROFXg!W z7@b8KjWRwB?hHR3h`+RpKhY`s+>B$F$2L-?@F-n^&tr2(=L(CdV<6o%kk6;Nb37Vm z-ZA}AYoYH17L_3z7tz=uUYd64>*xRN@=}#AUMiWf{JvQqKMmmL4Dch~!Me2feDE{f z!;kQxIr$Jya_+d**{37TQI`lOq!CW+M1yM!on)*=pfPY6;Eq?>Ml)_}nn)|T=W8=G zUNtujbLkCSX^d*Fla5g9avxXX2d^IiS0lky`F!;IQ`|8xdSjj}iROf(ChGww3%=^W zpUTw!z@hnvak<39nVAn5lO^ymhxF}b?*VDNYyUX^SG!L-VH^K+{I%?1nsk);3Sk<@ z;-jyTPVRc9A(D8>5Kk(3L8B0hEX~G)E62%cX@pwIi#m-9-B>^ z_{;6WFY}o6^Xji8;qTO6H+yN-7n<|R>+}2TBVHQaJNRk(D>d^*nz6(D=8qkX3x9rl zr?I2{@_Ehs{$cD;=76!IGR@eb&y4KG*m-KdD_8jQ**_aQL%sg`S7T?8!E^SXjvbxX z_}l;3ed@2H=!>=iec|^(MDrqJU^jj0@-Fn2(FdG{DDpKlaVoeK-x@aEUDJvG`ZDtn zGbY@5s~Ns4dysdM6@@(- zdmP3tJo{C<%KS&qt8+P4{oY3OO13+1iI#OY$KI3EPL#R8Un^^UCs}%a*&L#ILA>RI zroY^Exz?o31JcRfrGc=E2c)~EtW7icuf3d5)N2R#PndQ9OBHg7X$N8I$NqMh|NZS? zeQl4dDT;?^K8RwQq)t|| zZG8EEBdwq3-MG!~aoZdB+;>yPJLO4GX4}76?%aPfonKcM>38r&jtW~W6 zqqT10JSFNf7Z(5hYU-*Q8+7Xwd;u$W2tMhrBGxi!dI7rVb_16mrgVOo%0`Y0&toi4 z3_PGQVD`*()_M|twP%iWVWj&2={`2iovX$$ZiTN+*Sh`~e%WNd%~?xWgIR+es1;1y zH~(i>e=2xoSNTEg$Hnut#*^MJgw6P87MXI4E=zR=h}%z_YX3#vD)N48KwdjG!Q9R9 z-Gc|&W}Z@tfa^!xb2p{dO1D2$w(2?Hxxi`qS@WI3HTHXGx8|y6`BU`dNeb-XrM-A`14VB8Bf!CcRl5C&Y88tLYdZU^ZkH~Hn+F?7)I zTG=nFpOFVDkWZO&kOwGl8~F^6CGT^lj{KqhAgyx;&Vl7;QhwmorTxUW;PP6-eE~xF zZ~p6E{ULnA`OH}x_I!lbTHV7J*WFg=%lZEnHg-wum6F&iUG{1A)|un?f)DUpdVF6+ z-=4ON^BvstQo+8fJ`WAihFP3RtHMs>ZPG~wkX`Ql?;Pw~&w8SI*a~Madh8A8$T#BO z&saQwzZ?H1{QK~~jX!$g3a4?@3MX+^#%bj&TO9u+{JPI_LnPzOCj0<)&-dNz_SF{p z>POUB(-T1XOYyD_uq2!AQZLDIfd>OiK zOD;5f_m$Ak@AqO)8)MB$KKV6Y_p|~t>BsQR;G4)dj=Ym_6MU_F)A@c)-Zp!MlfODc zKPM!^gg0YHF%LVUB=ujvPIfW83tW+Lk`^DjttL(H&v5g?*YeCZoSLNzl!`<5U)J* zNI!SzGUvPgH_OkE?+gx!c z5cl4rbeDSPo?Iy7Y^lvSTcL+-&_nh76;5Qb`f7Ti<(7;i{0&o|vCs3x3Gi9;Vu(HU zHh3COxaxoQZ!R6He|i=IKmCQ?vsY^u@dojTt?-tY$+H9g@bsH@-yrgd7H*@D{c|fr z$j`TH1NojL&gU)T$)|Pmx5)?pJS2C^wqVmATpN&`oUhhhM1p5HWB7XhYb{+~&Th&P zk6J@H-WhJAk7@>{XKo4fX|2*SAkSvstKZCjLpjZ}1(>*s$Q8{0&QXpG}`h#)e;)GTb?$y_Z^K2)SDGiEoL&-9dWE zk-qF`+u*Yi=I^R46S;#+e~k0f{J(T}{vXt{g)+PU56bo1-9gz2z9zoNfO@L%TYMq( zi!xM2j@*#I89Fh-pUR3F7NhkW2{G_sETeDejal%LSrYq;6 z!y9AEcPrkNy;wJA`eiTa3#H+>o0vPlL74u39k&tp zYo6Okoa`9u2>S}I@~tJG{B^{wA#4l(xA0$gee1vO`W8%rQ7|pXKOO%AxUIOIxCz{Q zag(?mxHE8<;7-I{j5`T;5pD}^26r6p0^B%m8h0$N?hDh|RKJgZcXOau{j&}Jeg|7XA&Ecohx}%)m=&qYo8Nb=;@tc3=&IkVtcQv{e*#HR7(B~3lT-Fqa-w&ZVp%U8N zWY!GEHeqN_NOPxq2bFkR5W0}7FkD-AzRiZlx(W5GXVi|3!EzR$?WSF>iZ9@CmZbK$)Ti!r~5 zj^o%#M%}aJ53hIYfJWI4ovt&|^-s+rZ8}k8Kce1BGd9UDoBp0Lg3sIo6b>cT)@dd7 zYs{VPN)t-+ehT&Y>1~V2!NXJT2zb)HTm$hWy8*2wHYHdm#5LwzTYt&r*P3?mW~Pn@ z(hh}9H(};1Is4@98b#|6!D;57gy6hd?~l_yf6dZ=-vD_G460MM6`F^_+zS|rri;}P z{IPUV_mBLRGpfRKD3P_nD~t|3T2i>>d^oUZ4n7-LqLiWgT#QaGvGBVJKi$AMt-yK! zkr!JpYyt$E;1?Zh{S+;e8>El{Puqzz9y**yYujSK&_S2+S^@sg&JMh#iJ^L zKNssLZi#fk4?2oZ{2Q=Wz60!U8yWuH!JZxfJJY9;A*6SgjdDZIKX){vBzwPe!O6xn zYv7dneR@gz#%CiNZOW=YuPZeZFWUOKfhkdvopBidcF%tre)Y?_-N;MHH4e1YEBaTS zm(4hF-%JzjocVEg4S;^($x!EVhdX=<-}{)(bMQ7-Jga-lcUe)!328NcLdivWo%P>6 z8~d!(rFpyi$GbJ&RQBVh{;Lb<)1TBB3t@9<$1XAYMZG0_7(Hf1kJpv9dGsh9qXxw zxTxq*9cl;l)ak6Z>XYk-`RCRNukv-hz{Pv$g3Gln)1HCB3$S~A$9+RC4-kGjy#MeG zaKV|#GF%X5bjbGD2}Rj4OOGUdGPrnLxL^rhKbEt5HQpU2mX$Peiop+Sode8G!pobJ zUA$lm^^SOXr#d*VdI&Gjkc$_}R{g>Y=P7yxgZ#2fp2J?O=5FjM5wxT?o?O~C@`2$$ zBb~ARCtU-4%<9b6#2E)IDfbOV&Y3v1j5EnNS}VyWSoY9^qwRS+ea|q)PR-!#_BXie z2HWNKh}y0(B)ShJ7UnA$8|dj)SHxd?BaF==ZATaFj)8DgYa7PM%^E|AQdKu|hT_#n z)KeR!uI_gDDQ;{#-?L7GNBh-;+0iA%K<7Pq-W4q%b1gxpD%stO%sDFACv~9%RQq-3 zc=l}Fzqr7xAJRk9tP5RR#l`&Z@cxT01`@!Obmu$mW6Z_&G0D0|JbuA!_Y8{ogKW>F z|6i1K*SK?S&a+I;K;rIMNS{YHlWrbyWBI9z18@roho0 z4@XuGy@JL@j<=t|yT)fcD7w>~D)W&;t#Hd|{2s22{NVl9c$>3ZeR6|zv?$fFJE*=v z<8L$b_IBI-&oDQ4xz>krjJsTy)6896N9C|@jX%9dvYYgWW-Jr`%+WL8`Qm5p{M_(E z%Y7p*;jRxiD-PTTDvcady6#u*n9CAAc&96~-v>WG8NJwk&aLg|Oj$d4)x7;v(!lpi z0rFcZ=I(Q|rS3?^kxX2NjA|Ff7U2cb`} zpsTt7dZ%=z_y}bmM|nNu+eEqpKX+ltk^e5@QoxZ4vIhUCOJB8w-$D49_qcOV1pjUL zU;McAl#Cr{>=yjuE91yJ^S5q!Hxs7w=gp&`xrlgxyXFubhN8UD!Wr~UUfO$2er$8R zd2R{wS?Xc8K8y0NA%0JQaxQdXk}gbm+)3CVFKjtsUnT4VA9eGs!+#n6(VqWN{1@W~ zuV!tpyJp@@xaCPl9;Y8W&>!hOkzvwL(zc1zJ(jpOaIL*K?SK6ze)}Bw1pQMt5}hC4 zRYzxv(|g@KpWsT&^~_=RIqfCgqY@?Eap?J~ym(~iUBcC#AG-7qr93N_FNu!q-1 z{wV!5j62{%F+S2ye};PzD6estbeI|E@u5~9davHs(KCIWIyA<0Z?SYT+X$QVXS;8! z7gw&Qk-f*o#6kO}T=5I(X}XS(Hc8rZNh`U*rjC7Y^y`8&{?O69DA@jow}=LocLDUL zxIcSwZ^CPIeonCZ@N9`@OK&s&rMrnzkL>Lm2BZkoli3KR0M#B`2Q5&Ccd3~I{fJHsei=h+BlCjmws~jV*ecpiW6^< zY@)PnR;D-D+!XSh)88-f zSv!R#vl*W9&g81JZ64=w5J>;^BKZVhi_eJ}Z` zivL}-QFd+0YeiQ&I%hh8H^4aCp!J8%z8&)sXKsOO5-$LgBc&fphT~4OR1O{cZq<7O z_L>PhhwLQVr387t_h;_eqCc|UeW_oKMe^0jg*EeHD;?EWMSluUOUYB6=YRf&BK=t- z9gG!Oi9VWhj9XMT_UhJT`zg{@0YAE_-XI+|kNlBQI>YVqW9Zh%ZK5sFxa6hfz>tnd z%zmTj+UQ@9!DahkWFdH@fA@#%VQt2uc#HPHZbCrNc)Wm&$MQ*z(4K4?_b*7c&^Z#( zrSAPyJ0iJG-2=fpg7b}@#L6u&Yjo|aPW1LCl)fR_>6ra7`VwAgWIgrcZ1y8W570pU zdg$Kf9Vz&6U7mG?vF}U`&udSi!_1-PKG*s{_3#pV1l&=_S}AwG6GK+1vKq9$;;mWU zPTo4c*zn3Nh4s&BeZX0ZNcJH+(($FDqf@9&sva+SWeiC_|`c?kE@lWqLVT5!` zhvUHLfea2fQ=H4zsQt)}w0%a2wF&n&4=;TmSM!2kUIfg@@V(NTh=!z>k*mH6CDk9( z3bF^ccso{iCaUkGYpY9PQxHj4pdXPu5maB+@+PBXF~L`j%n(YrvRMP+dXI=TO1RGZ zUl&_Zfh<>{xwnC|lI!$eYY@4j3CM4k+AVlehJR-ZpJvXIo=R(4=^!=s1z!Nyte|q`VQ+b1EbgICH{JfSbb^^Pcf5fF-O-mSXRjB}&@=Wz3VXu~ z1Fl2m6umIft;*R?-QWqjZu% z2HI(J7R1mCh)^m1Cwi+(zys7)#;Ev%=vsFfqTgo^134#= z#@06N^j_)WL3i+J&r|b==o$JAUwI05hjE8q`8|9S2@_xS?+(+wVK089|K70Y`S0Hw z7S*{f#;NY%JD&f7LHC9Uj%C2{&)`H}>umr=!TC%Xj12=|Y&-&tCmaFBhst35av6+o z>dcAY4!sFFc*d3wclHqxoSQ^erATm+%1nT9;bR-M<;at|_7GH?-N1!Y+dE z!~dioo_#;Ga@*mw@-$(GXeGtn8qmsxem{_QoZk=pU*Y!y{~yr*Io!)cy9RUq*~m6A z?&eKow*%YHkVSTd7z-Lt+EcP4n@dWwkG*y~6)et*W}KU(`n>;c69ha)9yc zuZ<=E+g`@$UgVQs{DHQR?mp6p59`eEEY=@_WxZ!ZmHTi`^UE&bYDk2)j)6tz{!{1K zeY3#3_O70KFXaG>?1D6Yb&f%2W^|5WvG|?ko?|%d{7ibOGo3qCb&gJFXI`WnY>OQB zQhJdiO1e8x=M$ut(%OD3u58>TXMF>>)qcP2+DDX4s$?&<^J31^NC&kcTiKU_{~U!N zA>MNoM5XgIKOc0s&3gm`7GzaIY9BL@RZ~vo9+o0^lSSxh9JZ5v)tJmc9>NWjOe%Ykxe#p<#Ud?4k z;^D8K{Es~R=Y**}a_Ry z=Kp0|w0E-n9Bko56VRc5t{ZwS+p*S$T`0sOvL(Km^5 z2FjsV2HbhOQT#&tg4`>xh%;2uA+4p{Ih^m(oZo?Mr{=!r|KReWPU2Q!JNd;MT|Mke z%t`XEkUwd7U?IH#UD8C`b0S z8<_ia)|R=ju#PlYKH1!^k7ls{%s4M5bys|Xd&M%&TfnFFW>sS8bB_Xx_H?udzKXr) zIn=X?Ij~A{E^FP(WV6cLa-nTKX{CCg&udC!Y_7A)_RyEtl}_bhI z{E?rsCp)#Ps~1Vn zo=y~(6Ry76LHIVkX`S-!^y6;7YEKuhJN;HGU6i||Xv6HAw10Ii_Yp02u8@2JjEd8o z9_dEM(aCurKK7-IZcS+ee)W;srvJ5(HO_lxx@DeD-UeWg@P>CC@cZ-Z_-MBD_21jv<-W%G zBK7Njw7ti;_oHpQ$-RT@Zx{66>DNQtj|nfoUup_8D!!w7o2Zx1+;^W~4&m%&vGY4F z3`yerc5&y}p>|yd?(3*OK!5u8(dDUAH24R>&pdB+yZ6xvuL}RY!p;42*Axy8xR36y z?{FX8VDCP}3y-GQ=g@jIp*=^& zNd)_5&YfEk2_KDL^1(%fbu(65 ze=OT%>{1y+iz!=Uw|h)xc3>~prO~IUZ~g#&b=Qrr*U}w0?|GH?)S=@9uF}Y+-yxmu#fifEPh!lf4&8@i?s$f# z)ju_Dm3^1M+g`#-mU+5>nKasscAHNN>?UDLe=#YX9X&z=ig< z9xYp6h!>|QLvLrdP{zZQQNAY9+oL(sOecOE@zA89N4**F5ok{LMLuwTKP@&A{vpEk zW`OPk$is_TaLpa5#EFKddigTs(>|i;SZmrV39lock3;S8y+GXS#2ruFpZDs{;a551 zy>f0XtA8DF=MlaGS?f8~Pkz5V*`uqyn@BU5@@_Wxg1*4-?WAphru2Uf|1~%L>AS(c z&ynV9H@M?n`+Jwr*LoXV?a^6L!Eu5IN1_Z4*;O1zcq?!mM|swo%Dy?$r+IG%_;+M7 z4;{K6Q+H$Pj?B?~{@s{E`LDB=%oFC$O#hzDW%zI7GwYFfwy=$JVWMG{OyS#4bot`8 z(TD3zZt=p)*Jpp6(Z4?XFa4kDo|n?To618zMy|d0Jg}gBB(+x~l9_FX>@4edS z-FqdwjR<#(OHSVH!OnmC`5AWao-+St{AyzadCXtu+w85-bhC$}HJL^GQ@m?+E1#82 z6f1~BMk#1sy`4GlWB;MGP{QnONIv`_>E7c0`i;c-{E~IFd0(o%Pic{bk#Rj8cR{ua z5yobEEO9EA_-g3HPouS}?y3}T8A9C=tr3AqcU8XT<%uwFD$iQM$hcP-5&Y8W>c8+1 z!nVb@-d&rG5!c^HISOy`{7s(!(EbE=IEwF~&*VzCXj6X=dq=zrSU3}yWXF=fxU<4a zWeYiAsp)~|A>)i7E>yeH*~fb%``~Yvp3OP|9K!p;q0mZa%PYDk3|`xMx8aEp!;&7- zd;3%29qfOIH?u|x+u&1s$iMnc1@Chx&EfBzIE4E$o9QEDZ}Hcjmb=Y9hw!d_jxiZH^@5**!X?vWfk%BP|HU`lExRuIn|lg?{eh%p--NL-+krf#@Msi0)R?=S zosmrO;hB|vvN6+LeLwkp(A-@rnu^3bom+2pO=LpU)GalWxXl6`3PkRSE9Y6h(CT{S-|&W;M>5xcIwX!Ucc`2{5w6r z)+eer8qWr`-zM7BycLLNM-q0D@HQ`^^OooY!Ou;!U+ojT|C_uWSMJjMSkFvF1j$0IrRe4lD8D%enXAB zD|zFgn((&E0=@qKNtXwDI|%zQVR9$pS6}+&Y0RP9Dky9+c-4DDDob_gU0~HEz9Agk zqj==DOXYfX`e%Bi6R>H6?C@C^mTG`kc9#m%Ss*_wR#vX`Fz7{0+1qDS_NAdi7I#Z> z$i32|hOkA=FefaZ$-6<+KaVioUzUq=_U*wypVEb}EmAsY*z8lwwl)U*IqKFKC&lS3 zd^=?bS0>N+c4J$sbkd^^eP2IMdm!rSg0AXyd759|#)zw5dlL71d~Q2zS zq5XNaTW9+(_S$XAp4{K=m%R4;1a~W+=1lPc=;F|Qi=E!QGcbI)7oPLRR=3B4xAG9$G8*SjC~V&W4;`TEBRG4GRY2CPp8FwnP(>Y#gV$|);rN%BO$@n5p{CH;;d;GX-H*cre z2k6We4xAO}%kYH+TQs|jaowK%-~$EipNmHXRc0zt92C#mn$N?)dC;7X_U-Rp)#)f2&Zrl#qE&6EiT>aNQ0B?J5f0+O1x%}`0W#I?P z!mXih|0})4_)~iEA-^2+-%GFmemUlUS-4-0!u@jAd$8^G=dl>`6Jglw;`Y;_;uW?x ze}8Y8%pE?lb&T+?K;|D@KfuX9HF2f(H_3Qo0e8TCnTiS11I7qb0k3;}2O z`Y&fR_m&oC!Ext3=g1x}Q9H%Q0M)>BviAlY^8&hE z@{eEWL_X4g|B>puvFsio)u;WSE4}*sHA@2<9;&a0wFB@Qc|&8onzcu{U$Dq-O)!X# z62Q?ld70BAS_fy6@d>ZFoba9E6{NWo*fa)(mlndmbiLlLN|eUKBc=OXiC=NZ*1P<- zgw#Hrs|c{~qB{!y16i?sCOBd(axQT;c-Py29pu&65njYUzd{=M_5V@+_dxIZUxf|b zH}R{VF2*kU`D3iU|KT12D+euk>AOa3&OhR%d7FJ((VxoAwW)8=D?=iF**%QG9gIEc znzU}ByIx!cURQx{(S9#sEfp0Z0jjgA!h=fCLH?+?K| zlXP!EqZ27p_cy65f38rO<0(V)#0g%x(@4*G$6obsod<`~_mJ*&!qvZb(a+bYulZsF z+_+bybK7x!VI&33P^~i;X zWKpI2oYFCNDl~Rzi)7e{(v0X&r#-PF(d$D4>Rqii(4Ko4A4&Lj%ddE|nlOK?_~XQH zlh&iV%i8q1*QTAcX^B_1k9)zYwewYiH*VI%*l)PwTjO2*^cmT#(`M``%{X7K@-AM; zIOrdHemUb*4s3TU{Q( zICsyQ`hNfHsqZHrwd?N9G{a;5@F?w2Sp(ynW5i<{>+3NF#wSL04sQhxr8!dmYc6#2 zPxoLoHnb`3i33iTPbEsD!0#~bmlHg?W6oxcEFFm297u|9Wou-o(^eFpxBHF{v^;y09!dl=F8wimJMJ6Ge% zN-u=Z_S=S7F;{n_H`U5*Ml{!r1tz`M^Vb`IhrGI9ps9?0{QG;fmU`j0?imj8k6|oa zHMUN|t>L?k$*jCj#5dZes7+TJ{g#!-KIvI-9q)4N{JpfP)y#hp3qLZo)+`m^tB&?E zhl4Y8Yw!-W-HLP#w;~G=wb@%IT_~zNw3Bo0N~8aBBh=~N$N$n=ckDr2tWBBEh!;P3 z-3wR0$p20J%CGqNW9W0eHC2PRR?+_WAYiCvF1wQXB?v8;v#roh1NP&BiTpv$S!3A~ zZksQ8rM-AhjQJ(oZr<4lQ;+uWq~F#)^<%;{JVSXH=cTdexQEm9=$%*x|{#Y`2I|%e;U`E3#IMi z({>7287tTiM59f70 z2#&E)Q$I4VpGO&kXnXP+w-2jQ3-jY+cNeS3Ulo1sjc*{o+UdKC>U%r-mNSI%{r*%x zsy~;3ci~!ns(l#F5SaedI2j*%-kHGtRWQi#AYjqiQaj#Ke6$;U#yQ7I|EOHQOqK7` z$X%4Hx29CCXhd(;#bu|Gy4&l|=jqP}4J}A+@%yuawyHnXXW|imr>*Kw|NQD0!XnO}btBKvN6PP~_4~>1BfoD#aqQr^`##vs-2mM#uazu)J?&I~SqT^K>hFhN<17;I zd(mI@^U!-WJ^($j7cf{bvxoN5^?|;5S?$$LD@|Om#F@mWGu@%=N=JL~>bv78L+SO- zb{fAGU+Fxre3Yko+Dg*iK)dsC^69+#qy_EFquAV~mJ|o2GWig+z!{xlFxCnkUz*q0 zXTD}`N2dyJ2t_Z?k7u3oacEY!>0n$xO!<>$E^$KXmCi(5o$)`PHVBtS-q+h=6 z>{`+ups!3>(7WVLmA{hmREN3isVw~-`g$wr{c)I=W@0QIV!ucPam z7eNWy1Hg$dUe$6}JJ}%swejEM- zX=nK`d+>@^h-X;fVzvi|Z2x5IW!mPYJH#tUHv>)c-emMSn5~_4#%+H`={Nm%&a|N=?lu=mYfg0_+v?TllijU z0chn3^6MS%BKcLH^gxTRVXc(T78c1BZmsFOHOsyMunmG2(9F|xrqeG+=RL85HE+oG zP>%S>8Q1AflQquixS}VWZRsM7zxOqsdgqc)d%&B?Be_Ai;J)|b&~DBSbYB!`2JS&o zS7)d99;ZMjHu*#|vMu_;>&(&J(wVj72MKS{FBzISn|vCxs(;Y6ZX2{86=IKn5NGl^ zr?6Ulku#gf3D+U-EE!H7#_YAmrdGCD8edlI9_KOOQhTZ+*gH;l%aY9u8L1Ec1C7#; z1}`d`dF9-4m`?`gNc2~ZU{qT1Wx?jR<2tn=k|=`rL**4oBiMI(^}T_=4O;&;u(<8Y z7GCw@4w!syyEzwE&lx!2UE}7a^Wc90Kk>bHu3)S|!^a~HiLVX{SXM3nFXPi4 zBd6kC$R|1${l>f3IH69p6FN%4)Y4@7U-~R7d-rf`edyO|r6+JrpLQ;C2w>d1aA>`>uWU@b&iK)o z*vXhW9=dD+m$@U1smI9YkEsphUq>3B=ZV*e=Pf6EGHnnZu*dH0EURY@=~q%uih6=x zJ-bO`#z52`0}}$5P>0`6|RWWanO<&*!r#@>P*f^J^3u6VmLf)B-) z^NewnBRi1qmt3Bqd)g(RhSJDfao|qDXH%=3%Bagbg{Kzqq%l~@7_5vSw=fQeS&R3u zUauFuI20xGVbdc+vVeaD1PyROZYVY-;e9_fN}g6Utr!U zsLZIh4-@s)Hhy@*+qX#!*tco)(l-uB-|D4r_0s!y|7s1lcjR_QcF+f-!6JM7$l2EF zYS!3VlLx98Hz?g=qiBkAZj^7RbD5YmVi=fA%4zb9Ua@hfnH%EBAOp7pnhyvwm{*u@-mr2)0SyI`#l} zr3+8mi#BU=WDCjI{=G=%tgrM8?{F88_^Zy#NInxDCExt(xdk53LfH3;v?Jm2Jjs+X;EoMQdnxi~E$JU4t;V>Y zu6jVa&%y_E&M8Ye^!ny5hw?gmh|4oZS9x`6k7Nh_@-*v7BOT3sUK+_fL9dVZvv<+a z?zUSv5Z>(wHXh&}Sx>S^Z^wZ0W>B8??CH1nC>2byz@f290OZIJM zZuj3CyMuJX^%&?wdV~P~Rn|eJv(YaHQgJ>{(*y4HCw_#$6P z_c3MhtIp-@ZREjWl)0Mwp^6R22@_Oiigm~fZa-^oP}xVZKK&Hy)5^|l%||=4!EiQP zb8|Ku48*fFGvkt@rj;(Eos|*hvE+l!CfcHTu8yMAbCYx;O|hlLMqoZ4Se3ttHZ?}pIA47p zn87RePrVqhQl*K}Z1D0Z_X$LoR`3n~0{+S~vNh~KR4k9J9WMNIM$jV{?7k-QH&UPI zmvg_4KhGnlv#wO1uW{y*_EPN!#j~Xcz}tu@_#|F)yVhVA;g_9Bj`Awv*vgPb@cnhG z3m5se+uW1XPPkbECRaI2Y5NBJKYpOH?{((3ZoVwv-Oy<4ty9f?yF2jb__p$iHpMTQ z^UZz?cJ95t-vU2D>cf7z*8&##ZPEq^yV9g{<;79ZXmxZABSCj9EYO_`K~pX?t2pZj zar@9KcF~{G0n!f5Jq0@nKSXwxPDe2OS?{E$62+0wfzD1(-o|_ckDMq!xYc|%n*YHO z?fJlnOujDifD_~$Z>& z3C0$fG_}?;XX>LmuYwH(d$USc5mjA^ck5JHwaIqI7;^`Grm<#pPSMdu7lanAUVUbC zcJSi$(8G@+ZXc_!FM=0$k#A6fH34u+CKlXJjtul=SBaOqvX|->uR8=kust}6y;b4C zZ&RY(neDapCDLmDs=Tf@>BAUxHIqi?{ACAT9$!mbWpqNZk$B}l8ycz|*KDBxxAM>m zXK&0tkNPP>ziG~4u0apGlzSr%@4Mf=+knSHD9=hO$tm*B~a z^%(tip4SGAeYb7Ox6HYNv}&)?Q^ruU2Nd`FYhk{QG?T%JU^(eb7dN59`fDNmMmp19 z3yr>HV1G&e6>p66EH!g}dHp?KbL%%@lYt3)HTBn0@cK+ypN_}h3@(3~xBFy!y>LLh z`a$!~i^Ttm_+Q>%*;faig=6iZ2)D5u?aV_bxf$lJj39Upf$tM9X@IW!$4FCZjWZ_A zdNhyB&sPEb>L2djD{>cR@q7Q}%5cbn@bqjcN4*2vd>V0TuWUI7TWfx21Jqm2s+C)To_ZJb{SG;y|_PkfpAV@Zf~6?xL-(#4}f z^9xbZS+(;Ec3rkGf=_pMu*aMaSRHv|+e!K0s{Uu-BN3zB$c1_<@u&E$oV&MaMelZA z#(y99Y5-rpUTF;LWusRrTXzSt)B&Eg{}&qb;P71R{tD5B;Vtl2@t1IvG^uPMo>=3Y z@{o5fKhE5f2G^ZgTRh|n<_*mg8pE$#4Xp|`@<|6}XugwkTwdPGg?r`~rOhcVdZ9mH zrxC`#MYgEWZ77|!Pp4e1X~oBe5LXM$3+JM{PZ1XJ{Kx=iouxE4HwXH(CR3UdiD!SO zbhF~|Yh4@Gc*`Zs-RJ%~>}>Tb;|1RA@rVU^?ROa+B5`%zfAPNk$bSCZvllwsJCya? zSrdvQpi%H)VEY_AX{*LO`O0-^vnfmZAb;(z^xfnao-F1*mAi_3s|b4!vbI0={!%rIEm%n@@Xx7=^y7TaO@siqXyK_Em7XFV0=Vp%}+FtDE|BK)! zi}H2d?X-1~^F3gEh<;LEa{oox@2|g}9_V8|+Pe;Z?BjSb<8TYLSjWr9st>)_~Bop5cs1K6#vD=3= zW50te{Se>%YaMt>7+YlBv9&r7dzHERRVT#$iWO=vM8}Y4OnV_X7Cy}<(l2B@X zQF31porLyMq(eOZD6My|=I^VH9pQ^{w^t~A7(Zc5)`+K!fDSc22S>fJS+R6aReGs2 z=yX?JGJ0fSI+1b(yT&lISF;0p60Gp8)i$tN(N~=S^#$Q?LHV0-n->&jjy*Ad60oZs z2ghxO{&+tHo9vm5C*_~xu2Bp6_4nq+TJFB2bi}Ux+ETN(qkW_`9z47$SuY*0O+IAI z-p*UN6=62-58Tch0=Q;BJs0SU5jPjtMXqbm5r6L;*iwyNx zm{ep3W(G!_(Lo+H)T5$ekr$I&W|l{#B10oZQ}f|Gu#;x&#=Vho%dWroXYI9_%@ObI z_kVc3*v#2`uf5iHeV^BNeb-vC>rM>~Jlo1U{HQE+R~#>rB(FAsuYSC~$>Su z-#9#%PWkUm$T7BK1>dON5Z_GJZ=?T-JyNEI^0E!{gFW3tZn*qkp7 zpvw~M`zxKF4;y)@M`j|Lw^Dpqb5N18>^L*)y{<; z4%63HX-m3F^AUN<)lg3M?q>G>G`0|&O6U9YRvNQJfz!vy5Z+C8e~lTMX*PKPjnFMb9N2Vz|0>6XrT8q^`37v7O$qk zsR0_?4jh7A^Aw6R1mT9?%zjT(EPn5!jBt9o_E+VbySbNMJ~8At7owX#&82vg)=-G= zjsHs>`*||q^+CG%&v$q{Nvw81?uB>ZUpUho^zp(gzy0`+cv`8Atzs2@l{3aZU z_kw)43-||K1Ex%#94W=-O}&OM7g6W7gomTYC|9Cfl>SKWc5Lv*f(dwEGGKV0F`b9E zweET1Gs^xMy0zJQf;>8(`ktY_nly4kIp*B@{XWiK7a2Iz_D^y14+mh9Jo+$=p^nEa zOfOUJJj&^vFH^O=-(uhYhWDb2ct&ftytX6z$AQ=Pu2fv`XihQH@^UO^;HCQF!+`mf81P1;YupP3bK3Lef5G@r-}(7{ z`pvt_YW9=W_m5Y-{}M267oG!hFdle6DO?BYxtemZwAVM4ui@VB+b62ZzMsrI&Dz9~ zR%VW+f3eh{&0>=Uqj&I^jLaM-+93~$DObzP+qYSn5w7ufPN1xGm+KENQh$Bkf3WHs>0rhzYO5{Z0;4u5+8hxdX!_`#j_^@ zW&9Y+HN3~a?_UBf##&nJffm(v>W?YrwMW6{*eQcc=nn7e0B zS5Gcp4DhyOP4O&G@2qvl{e4i@9$*|PS(`}g?NFLD#)(`qjbEp&9Bp%&s{88!fsXTj)cBE5+ zK9lwx@qMN#e|xw8d}#aK0F2^S!T4;|xAN=W&jy?aKeCGVpnlV3#|ef^4)Wm-Q3@qRv)7t!7;Duz3BB&0PeG)*97_(7Ci#>NZ+fE!Ll`!HS+(;fo1QdZ<4JC_iM7it_I%A?`nk}%Z7{poF8_=?+^6DWOtSeKdHg7PY4|SGjez%`1scV4kd@Op{s#Ya(LhJ znt=(H?)Y0KuG)uhq_)hx!?+`nFWtzq2F^p!oYW@HL_n{Yn4JEKSG4X+zB*&C_-V|S z$Pd#Pd=7C!@uT*`T4?bX)R_@@G?bcHR-Rd?o%k^G3yK?&_wi_0e3C`K0!tLw|DIgv7TwoEH!zDpVL+0pRW zEGVM0nLo>=b8sEXxr$=1Drd zwP>QpEa)OS(NEP|3TN@F$XAXg&Mils4zo@yoP6Gmur^uqGNYJ>2?yqow4duFXdKB- zD@IbeBJ-}zIxAN+5nRecsAGI9`iPEgjKxnC4O5x&MA0z8K1HGx=TjsXYwl*T_LnJr z-O!PJr&cf?psoaC-w5NoXmM#dnw+eBz1t#%7u|5`MYj%kM(cc(tv#i>ZTZqzt}yEe z>oR9)E^B!x`64k*t`s>m%!Q9^rLT=k%$zu}O%r3xg_yI-_PUzSs%yWgIJ?!Gy8_XO zz^uv}^eY7Z9)v#P89yE+UTBAonk(G$(t$Xh4XyW5erAB?LB7~X`5{iebSq_o>s*6; zai=ZA9+La{!k?=O@`vUL>pv?VVU0vzzH;w$`j~-FpzBn4V?--CT)S8wS?Db%v%O|5 z-!SKv-NT$^TtDU7wA)GD;qD{X{Sfvj(Vnf7)MkGMaV_D^l$x(*-u zA7euUGmoO*eVOuI;3_!JbGYVzfQPx9S7Muy_jay4^EMrKy3CQYchSX_?a)y&R8Ko8 z{Pwb=Bf2XXTCwSJvGwp@=8J;Kj&H5VV2U*`pzY_dzVQfBv zzD>9Xn83%Sz%(MwoFVVK>F;5pSvFs~99#?o4|<-Y{H+!j=naDl^6e^=F}R3=i!iu| z1aNT){nNZ?5EnIx#l?#)F6PlL*m-;>A$%DK}hrin#t$ z?!)k0Fh8Ma^~o;u$$$MeG;m0oIj(%Z^bc?$9V48z(3aNYY~kMEi+iod*}%PU)yVy3 z?&Gx8r)S&?Pe;N-i^h4eKjl&QIg=NwPrRSH!^@deEYH`m8OqC+&!nDMntg(SN&F?> zd1j#87|O|SP)@?H1UF>_JNmz0bAyr*_|fogJc;f|!1KU*y7sc?o#qAl>7y_6m+^Zi zGXE+v|3m7dOhx-j?n2I0-Y>VAGLKN^X7V|{M>*;LtyN`uC?mf}`HLGUBmKWIpfBe0 zej>1EdB5JarTM9D%BY`z1Qs73@*fuPd=h0>*s^OWb4I{^w@^m)%%9B<{Q~@{~O22SKi<|jc*go zclhhxL+#KkgX}{G`4ieF_`}b7vNi;Hkv$P_JIU4V*LHfo2H+BdomplKPsqUAcTf6V zxma2GKWW(z<|I!fZ<_;0Qd zNT}f&!gUB&lr?0g@A!n+4&xIheZsmek z80+-8>qd5(`d}wBU!Zl_A#i>LIA8gz!F?0~I}SYCq$AW{@$;@{y?thNei`9CB!` z{EgGX{rWri^l*Plyh9(t_KZ`>K(gTZ|B6jb;oah4n&;;{O3@4(rI;W1u56gr>HZtA zZ{+X8{B2O47Cg8~c$rZ%uvuqs(zdbjq7Ua`Dz++G_`Eu#jXIg1!)Y<|b0$6toafW- zPr#qAnc&rm2RK&=ALhN^kKp_3_+Gf5#rs^F1-$lP= z2gfX-pVZMunbAC76)1B*Wn>4Bwq;gPMtmZj<cbwWF|DE{VE26#hvGk_s_7XVX$+gS2T|?QQ@m%q@-L(Ay+x9NnM*iY^0{wZ0 zHkFt6>SC|Idnof;%IvjebcV}|)U}U#=1^bU*0q;%tXVPq?!!`f#?t}7Sy_%955np9 zHz*4lLvMXyFqWzQNMEY&Cg&dCYYO|a%ovu#xAXR8(Rge=&yHZPPXE~!e@_<1WxK$) zgD%t9Oy^*{qcv|OYh*lBK-_SawCj3FIW!wl&{B;cKht`fOuk&y0 zGykgDYlktbq1%Bu@Ux+`G&EB{$)0KBRGf6FyVw zAm2{l+4Fo`*G?`3-{&cN-qM-@ov|_>e)%86Da>jqP@Gq<>zM$TyBOjGfJ zaHw^s^Xt3Z1+3580H3@wZgrD#0&7wo_3r?ec*~EKYj3!@tUWYmLZ=$anqScv@`+*7 zwSMJcV7@0*Yks3PB}-jR#MPRm^F_Z?6qjz#l*u1!_WIXVzBSOlQ|RAO$cXIj8uI&O zU;4Ml%=q~h<@?bGzu)jhT)wgD{l|;%4r~f_nX{F8;D;X3l;@HmpD+Fmy)%jL4}qS3 z+g}f~Ejz&Viqr1-mwun0rhUQlW!nEM?P&}@wu)yaQm^V)d$IO>Y0o&1=YGt$zv3J1 zXD)uZhQBuN)aZvRhAl1&mh*vQ1h)A+>rd*8$L;5O`Vs%69+*mIJ{wex?TGn?V zdp^iwo@0NX%Fzea^%2zt+|qH|@a;H3qyBcqDy|N9t9`p_M+xHE<`oCrCH$LIW)%a+g#y{Ii zJEH40cyB9L3vs0rXh(HLQ~6L!rZbkz+(X%}Ca&1lX&uIw+Uprs* zbc2)2KXrkXlSbU{j3!|#LPciUq6%@u-wQuKY@$fc%D=}NUJ zJ|6UoyUNdO8>IP%D8u#2Y`(*9FVAKjzVzh>;5*6f&y-E|dsv*@=Z<_G9g8llJB9Hl^lb$n zqDN>#gNcEKbF49wu44aH>BvYrzgW5B_2|k+C_ighZ~6F6)(IgunZ@kG@^RV3)mmFv z*4n5Yl0|%2a@eh2?ks->I;f27V>{)ypc70^(wxRkIvtPSl~9)iYJCkb}G*O*`>{m!DBoC3O%?-XmEnLnE;3kyt^bi}-?bm-- z@s8`2Y8z$XqaUFW)1_;H&$CssPuNe~FV0R!4(6QJ8Qa8Kr|P^kfN54-!S}D^qfgSl zwHasxtk|;t`HR=MnKo}v5b)eA`z!i+Hh5|I-YJZCvYGO)dAA8Wt=x2Q)WBKoi23x& z{j{-(Iu;Y7RGpjAI}s;cq+IC>#O`%o@jD~Ik?`ycuY@N=$}{;!GKdevx z4to&1)YxhEipdf`&9dg&x4AE)(8#4k6z9dGhi9_3ZYKTm?Z-5JkKio%Y3GxxV|3~|_s8dWc0_sGjhwG?A@|#4m-}Q# zrh73K*%jc?crTggMqaSb{FUA}@s?zFY%6+_E4GbTi*(<%aW`N`ZvYPR-)VClc6&VS zrhrX#`F2Hq`=DL9q5L7yJ(Vu247xJDhIQGB*|tFs*^Bk~J*xtKkMLpqE6Q~8{9%ia zZpwZWT1syn!?#xpr_lU3{sv)c2*C6W@FTqVFkPpz_$2fvl1z1DpSp?Xbelf17O4Mn z>SxT@KevPPX3$;3>6HAdiTrH}*}R+fY2{Pthff36sB1i18o}Nme>%^n!z%Zaq60qp z@x1r#-CL6nwCU3OzD@UN;rTQz_)h3DXc6$6Mh5*R&!_SFjctb(FVME^WRMo($w69l zm3RJpPzDp!&-F^kAwEou$FYBdbru43z6~x_pYW+VMF)L1!qTKbZlGV6;5Im}@&V9O z=G+k3ngsikc)Fpp{9phs&>ZL8HitQ$5Ou4~MEWPYH!|m}@(IR1S1^uV$v4uO!2LY! zKE*e?wU>(VgW)yN1lcAIqBDoJH)umedFVUPlhSLB)}0gEV?bg0by3mt@$hR=am*F+ z+=H*HypXmw;D>7eVac?yBm3VkEngpiexF2XAqf89qe*@xzyS ze)s|W)QxO+TiIS~_-Ue{J@e@S*_OQ;kKaTJUEJbGDsi%c#;(ohB zoiX)o_q5I?_3b{}pY;~LgYkr7Y(buwZ+Rkn5T5u1u}nX<*O-DwX#bfV2lB+@woRRt zvd-F4^hGl?R@(Jt zOt_qw^knR7;8T42CuH~^7MEcVcr2Yr0ed5TGCAse&xz#*r-}#pYcFb3y{^{qsgJU| ztgB@#8R1OSRqkt(=mYRO*b3eMj{8G_IZeN{pWwaR>$!MqC%-i|tKnPCb5;B3fYa>f z@_u$PXCI&kR;^)AC%aewWMGhOG5n5w5j=bY&ODp?g%dr!|2M1mueA5r(q?~-NUxn*(elPxl=43B7*;?{)vm+18JsJ$?6Hy}#7z{iR0lhtY>E zsimIY4+Z@QJ8uRrsLgf6NuHwJRLYA_$aV@(lE*>4-&uZg>w$WoK0htH_BeTI;(N)Z z&x@h7t$SjZyD3mNW5l@XRsE`4-|IWU3U5Y|$))K1rRe>o`}O`m@Fk`9$0qE#KlUt? zl)X>c`!;*uX7BU%K5y?A+WUp}Ui33#0Lch&NavOcnww{z8R39uZ*2AM=}$xJw54WW za>4B9ODpfv=XK4c9}BNbSO4_agYyFFUoeMDcE{Ku%59;X+KD~kolEc|b9^+51SY@_SLMVPlDGJF<%E= z1biD==jPkk9oHP{%%rdX+c*8Uy!RWYz}Snn%w8h4jYNSQBihhf7R3^jGobTp)OK`r zctCqz$OllHo3A2r`F~l*Uk*}73wl7Z$aqoq$>@A1sePm5d%_E&2hZlwb3NO5jQ4C& z(kr7q`V?OYPk5>!bVi5Smq~WPuN!(c>^{xd1FwGY>DRTv)Dw;Bg3XaWP`mEE9&Fg%*zb8JJQ4Hj|22Rtf?h|# z#J|&T@S3o8PJ3ju5-%I2zR(B7HS}F8dq5}P-_+kn98g{|H;?k-k#{vt3w$$=Z?g8g z1-8v#Tl#js{dP~)xAXaKf&KP+`>oL}X=sx1cws8vrz0!fDYRYW`<5g*9l#sI-%Zcx za3^sg>PAk5w<(lWo9g3E%KLqrLb<72Dl^@-brFAs6ZuTWHu6nN4d)>WPUs?>w4B~) zaMEqRX-N>%ORgxzXmdd$XI<2%@4*jI`srUeRI{`%n8Mk7X(oAsW=&<4O+Sw_D|axDr1md^?}|Uu?>Uvv z@;fySxY|8?_j&HyMy@b(F^Z+ie#qvx*zvF8<4s3jUDBM_UBme%!F&{T@?X3sqdI3* zdim|qWR;s6xsqqo6`OC?_)v3bnoE@KpK9TW@oo}h#t`#glM+kZNs48%@7APbhpCU4 zZ}S{tSjXyY_tfaJ>I3JIP%46}GNbYd-XnjN*~GD`{fs`|iTC~eoV3r0Vlm2DHFae2 zk?q70@t2T?S&HSF*j$hn_-OwlE!6i=!i!UB-t^(k-kb&Xy2Nw)qxK93=9Lb>!B4qY z4%-Iie}i!=**?j-WWJAg=V^Zw`lqs~aqGbedtn0iec~I+wvAkG;@&>36#JROcgn-_ z^@qy!Q)imzwd7Z}**YH*e7t*t{To7uBr2Pza}H-k`Lx_9eDJ>cuk@)sQI?Of&l=xg2?V%tOAhYvjqzq4d`9IG z`XL>vcGR9=5l+*#y}idf0~gVra!a+|Cx|B>_vlHtpK|jk_k-(e23DaX?}gaXl_#Mq z|AXJJaf$hV!lki`(VOt6YyxVaIg0(63vZ{0!`C|XMo#c^OiWYyTRK$!_rYS_(%U_0 z*}j=NGo@L&N4~TV>y`9PvR}vZ0&r>_;Ja4${D*uR+BWb|zu+0(5-x}0)4Vw#TklX{ z>_JaSh9#5ozwagw`yFr^N{%W=QpFN6?=rGhmfX@s_VhXse(Bw*0l3Bhm*TDyczzpj z{TaB>Pn8t+TF>Fb@0Syv`zR+G`8avl_T%^TVtYd0FW+wJcp zzvmyL{!BOL;mrG)e$UY!8gXN5kVTzq(@0!Cnh3GiA^l3NC~3?SO`$^-8zUYZAy1uV zk?ZGn2{-=*{`CwTHOtQo&L_*R-%fu;pG)Y6iLX`RXq4@b3{Z7n(5cODVISs#8}M8V zr&gBcV56Z;yc*YUv5&Ff*#~dDH3{G5+-NzRUS-bmsD?}UmH#OlH@*tLQ77tr6Jjct zRQx<0xHQmBVdIQ%nL*d4^QC7m@q7r1fgkC2?<^XMHp|CM!M|guUosSfem-rr=l50M zM6^B9;KYj$sXT->ZJrLY4S!mB5&s!~jCR$Ia2*;tP4VyM&CD5!?xIsQPBLfe-Hb|% zcRkoq{pK6wzmHsRZw!b1tZYIbN2oigIvWku704?1Q{wAu2O=0~U6 z@o7K&khARyH=RfKxkmruZ)vVCOdV=RZC*-U|Gv`my@0(zvD!sUatZJI=kE$D-92Tk z16XhT?OLa$;uP<28;khY#e4;SvRUhILgS~F8<^MCdXp!HaRyYX<6-qzHZnZ4-t2qf z<1mu(&JOi)qPX`4`l5L4@%(m@9*kjh>!e#`V>0EFcrIHy*V@wHzIH2VLo_z~+L^T~ zCKt-c)zrCt?(7EX;c1oQR5$V!9@=2y8;{KrO-$SuF}$e4{Ee~KQ;Fef%*oz|74Q|Q z$>c**+d5;fgIlhC$*|(MJNc~~t(U6o+2!C^I&drRa?t8Glv7T-!F!;rZ)?``?yHph zg{k`@&XFS)BD~U$=1&B><{yNkFgRlV0bjAf@SJ?ZsfthAe$iI^v00wK^DHo`U+g#C zM2=G2gWd3Ld_$A)U9bJjOgl6Zmt3|0OKku~!L0u5gC8#dM%jDqm8AX|{RwRH6E~pS zG@mH>_hGq3umH380DB#m9W7ALM)+F!@2Z<~h_v5Lc_A<_TD{7>>w3rR-=}Ys+ZM`c zA6xJIOXce{aDIpONnDCfd^mfHk(n63Wrq(*BA+>I_-8!bpnU-8A2Ej+@^x=Bel+mE zaArsO``M>TQ#(7|D}bZN>W`mNb^~^rn09}0QO&?Qp z)oY)=iRE_-A=#7)JzA+TUbWs4oux0^Y5SQm!YgMEKo8X|y;xljU@Q-_*L~eF*t5`d z*{w6wAAj5*f#%2DZ021QcWLmS-);5IiF}|lX5WEFWK(nbdK1HRa@auOS@sdXiT+hW zdFH)^ue$n5IG>M1+t#^zvn$=^?AkJu@y6GGq>p+med~C3By?g9YljU3{|e9`Xd}fqwCy5!L!baN-(C|!x`%% z8a>{Vp07pEtNu5QjCuZ?#sSg5dKJjO|2$mDwsf@QDh>awhwnB?7ZdA<7Lomr3@^_u z++lQaZJ|zk7x2%ldqfA{!I%s>YCNWKS*`gEIcDgrKHe*4JV$d}&5;8BOsd|*x%9p0 zohK)ZL@)6~jB>46(^wHPnBO`gjaq!n4E!3BlQ|i~FIWpzn`S-G6waNPOZvHB7Pixh}?fKFK_#u+in9rksbSC_q z&6je{;pIAqvyr0s?B=|eKDUi~1GmoEVveF+x**Y|{mz;D>2-fbKlbW8sSS6!&6_*Q zH##>KMaLBD-g2RQ=^ErqcIT(2|1&FP{%Rk|yU`<|)XT1ueA%rfpJo3V$JP$UfHlP= zb%!R@lv^!~VY}Zh>$==Ao7w*?_p%%2d+kkGt96K-hO3wfgNKm6Mf6La3y2c!-=in3ne&D5ue`o>(}v2e0&Ul z*D}8{#KF%17Wom9>#2;(oqVtR;&INvS0vXw(-}c2%4n`MM4k)nlLvG=_{4unFs|lV zBXM=gl*cA}-A^}oJU}QHPn(0^0$rW=U*3rRN%+*)0 ztMLz}&NBXlV3AKDeFJQOGSmK@QF)p=VySfTsd{|Eaf^$QQ&?}(#x=g9*pXUXJd(PI z^es;oZg3+VVlPti%`-00?_o;9hzE6VHOD;j2k}BR$kc+y1(_kJH}?_{}VZ(f1QF#NQ6md`b#5%S3 zodF)biuPWny^Yu&_2)#|gXaBXHgndb!JFsjb*5Rbe0yg(iGJ33e})Hh@_}Y+d;|~b ze4zRgv8#AZ(p%g0fbyrIFXPw!^U&iJQ{tIoEz0vAVcTfY-%JO3gT3=NcPK_)`5y0o z`}LZEJo;Jw!I>z{T)SiR^}{H>(7TTF37*}NP^0MnPp8qx;nuza?glBIm5l2sSx~Id>(R`oVz2Z*f{5E{q;gwWwh1)Y6 zd#15`uD0C6`h1udR+=q;f>=zw!vz~D% zzP|Mp@VTjCmhr`Euys*%WDM9-S$J6da_&!dw-~(5RvE3rD?9o_QM<|g*`q0h3=qVLwS&JK|cfTr5)OT7dDZ1!;`MhUX zJ{AvnzRM?#?~>#^LTH437JtpCkb@qtv%iVyG|M-t+uZ4*n{QLy@@X{hsygLg%Wi0_ zt#-`%Onx5%T_iJ%muQahgViCE_(pArCK=?jF>||nC~K+wc&&U#zTE3yi6N^$vK4JrVFv6nEV(4?I_Y@c)cYq_|D45H8DZu!lh0&2D>&X_+mJ8TV}JjizKX9({1qM*kMQ5g#!Khu zSsgg?@&;BTXUy9dkh6m1%=|{q=9u_|-#ATnT6Mr6jWY@9ZP2`X8c?HHRKi z`40WdrH&|z@8=7j@I)r*@e=-;nTymu+wmlGuberrZ?ELrw;1D3yM(hdQ$vc=?^s$6 zpD?7XGbmp=3xA06QFtK?Y=?2S?5Xlu(4SWe=g>Q}jXan_p4?myH^Rpf^A6d8-kMiP z6mNHvh2duWAsXsDYyLt{kM1qZx9hj&=Jh@HpID@xO{;YAyV2Sf*%|dmexve7YQT-; zQD+zUwnV%cqAr~^B6@2d0mfPtC;38CIJu<3N&c+Kmr?Qh*_4-D3~`3bw}YS5?x!nr z6P#fs{Z4F9dP}f){5;&uxj2;b`B`y}1bR^ZbC2zdr?-Y{e9^3R_4Lp5|L#$V;%UI8 zK98VX^;`W5=kg)tM~c4cSCVnM&K~;E#n360DWAhP+N)J#o_7+?z%rFhvu57<7P9lc zZ!uYAsbj3w4MX{@F;>Cy<8Ay^j#rdttN0zn$B%(GPWe~a-&XUNp>)21y(XJqCLXq( zF`^$I6O4X*{1Nr9l0N9}6m52GOn1=XTZFQe^M;=@7gPbZ)msw z=L>5FHlW9H)_0IE@i@dX@|WZMo;NNiZ)qdG4u47J#*Wip=9I?CC&`y2gLC*TxeT@E zOYIZkZJw<=6kji!DgTI^?|CYVF7AX5^S3aEk?$&-m}wHb7ex-?-zh2YJd8Yf^}_Rw z@X(>GZ`5zCw{a+|a_8t7xcNHyj(TS33SWGLwV!&vz~(_B6YS;JTb|#?ygTsd{41R? z;mf<~iUG6sztBD^b$z|=y~{nkf1CC;NXYMIy$f|pKlnJ?YGJsY z=X#a|t})12bG=u7EzidwN1W+WS_SRYp4x)W4aj)2>e4r@$nygeJpA)6f}US`r*jK)2)$+T`c=chaWYe8UF0h*;7n(Si5~b0 z#0I8U@Xc@285*I2caBDcy^rd~ci<~^l%kwLKNLC=>s}t&{PAK0oqoKDC3KXd#l_`F z;ih89VSkp?>u-h&ueweY9vYwHyN{Ra_+H<#o^g33xuiHWc~()lYqR__g&f?+&?_4P zdMeoOKHj}PdXPTr=%1ebCx3hRJO6#Yo6Wl&_PZM?JC}QOZ@*%Jf> zop99R^3m2`Ax6L)X5Q?zFTDD^5<=_c78k>v3OsQPKFInr?L#X3_0I z3rCP{C)j7A+ZEtE|2}m4%*jj2e;wuVmQObyAI-K7LpR&rXDqzLPvb40_h=Rg&`h{F z+0v_M>Ctfxrzxg+SC@{F}MQoe_O4m|#1Jk;*V;rYKN zj*{c-^)txB!rvH+Zp1HvZ=C)lb!fZ<4!+~Z&}Cm@*hbj^mv0hD=DH}?$y~lS=Y2~_ zb2fVaE8dHq{v6SRUvmb+;BqLq5U*yc@UCai*uG)cn(v`(_xs?z;iM(yTP@xpwK>n@ zUujQ#o8cS9$AWW=8qjsFXt zui?G;#>aEvIuFnC;nbhEZGU|J*0Zk!@T~I)9NiJKYL@pJ#qYikCk zSo%htu%WSZLn!OX$&VI!^=N#TByQs6f_vv;D(0lvL5{gc^-XJ*qVS*mFzKGn?a!B5 z7khb^we;aF+I(q(muIvi)aCA&rn0llxh$%~&>_Lx7JY7;z`8bamoyK&^HS|=$(Y=> z1K-Crcc3;E+i=<$%TxDg@IHjTF0^oTH?^bbp`NIN%lC({I%gF z_}K0#^0aipvGA7mxY09w`{$AUr$Tju`Hq_RlD@9RZx#ci3mjnUFmTNw(TWlGG=oD-?}<(d@ZEOpebHyh*Ut*fyoRbRQ1zw_>N#T_1qAr-IWk{+sqK(VqQ-dTd5{J>vos#|FoW zeSjzBlQmDc7W)ZqL*!&C-Y0x&O>cEB5mb|Cs$=wga2nFa0@{we27IFt&{{PL6Z? zzV3~y@%3Mk3`nQwThV{sIuEys8<|*UqPP42<%h7o0X zxsm$c_Hb^)@u5$GiMcFIT-%FP1&by+2xd-L0S1X2P?ahvX9%c-=eHw z{i5x!uTw9#_tL3fh37sgS$`imzd?Q9r9SzX^2^7(Pr2okyNhzt<5w=I8OXrDAF_P= z8UD`V+Ck1#w;fX==f*Exgx-)&P=2uVf^@L_QusOU=gY#!4e~jqE7j+@i96jBExp9& zdZu^cnd9tp^^GRuer}pzH#&~8)%^JxVE?kknO|PAqw&T90-j%|BFUfpXu;~x)+%yB zl;0AD)`B;~+5^U#@nAoUzPCBQ^w+?j07k+4j{r@4ee`wvY$#h3MS2eA2w^}@4Uk!eC-|F$a#vbygw69Qv@|jbYn6rA-U%&4wY=7l98Jn7> z&sp@^TIy)ekgt%B-~+^k^TX(mVEkoOfAs8}K!1|RLK3|$TUL$#57D3Dwm-gI5>8ad zX|@jenXjz%svnCt>H<^ z`eUCD;5Q03@lG{eV!*Zu*wiP#yyQSIIq4bY9gMS8r~DcIBC<0p@J55-8Q~uvLpCu8 ztM+*itRJ;7;U66U>xX<;sRx=jA1tTTx68z3%AFQ>ep>_|_sgpK4qOILl2PbUI)e6( zvTaCrsBbDK-7&&G7mg^qUmgwy!?oy4UzdN*!r;r#pDhe~z|+Pjh=I|zY_#;7@AK;% zpvD5WyFlB>)<>toYsC4n8|G|c`EKCyVdU&l!FK}iiAI02yd_=k>y7#LndZ>sd+pC5 zu>PEnuW{gOyoEJ^ELM-Xuy4&~t`C~MlVF`2d~0NbF}-5ys%JOPjeFHW8bH~H1+L0%9HU&sqgVG*9^>rzqKcY_&ma2oGB&H zI3u|X-$TPtT0WM?Hz(46@%vkISG(O+v=N*!`%F506R>Q0A6fetu>8it;`6d_t2*}D zK1l~k?--s<Xl`r}ciwp6u?7^NV$*+_wrID+44+p}d%p$@WirGX{*%%=BA(rT@a>n(=J&x6w~ifyu{dm~o!3uLS4mz$AP$TL0uM z>eK$CBkCDjIJdjQKddyF2S4O!6)s#`Xj#Uq#n^ElwHQ${frWGmCNtrnQXQ6LN$)nry@8G zTO2Q-?0m|~pAD7`_W!RR@ba|2NLhb8@z7n0^<>I-pffbLC^|%khX;Pd?;l-LGcX%{ zaEp}%#T&lM@9ViP=lTKHG_Dl-{t;}VY>jMUIFpaGs$cMvllEj~EI5;%`lh8LdSSmF z|62eTqN~b1fF8+7~Ts%(y#Anid zMquNz$c~kLRGUEAV6F^DLsw=frEw;YO2^ea0{O4cf_xAdAZsyFT zyqi|h{rH%d!vLz{SC3=QFxvVYzn?=M7Ld~sozAH zr2OwFFFv1Q%ePQQ_IrI`4(|!zZMOT>t^5AF1KTG76F3p>?}D!tvlCx#5|8U0&mVx^ zi=mtGf1KWO;zR7=GJ&(VGTuD0p66&=@Q;8_+Otcv3X$6(o?gftnfkhxdK8x!K^>dyd7<1V=~yfqUvmIKA#w+>358;6CyN@44`+ zIGlK+2OO#FT%J9_oWGtew$DDRZz(5!u0el&86Fnj;zw0PtB1H>HERufRg1o}ytOaj zLpf9HCVTie1Aj|+QT?hXl-jW?MD8&A{g$YI`Rnq$DHQP z2P{%z$nco_sycIudt#i^m^J)E8iteCiAt zjisu2>UH{>;G4(!MzCMYH)`*TYdoE+TzBc%O|hl!X09uFzXu($GoVX??a$y`giX|i zPuIVla`Ih#o#U6&8kRr7mv>W6F#_d|c2ceyHub6gq_fKFDCg7YcI5OIeDe%*nK|Uq zwSzi-0#r+3%}dwq{@sx=Z?N93vC?bpOev zpuiE_U&0mQ8pU-5mwdaoh)>A3Nf5J~0)F9}NN^tJIA|DZhkj{z5x!O*7fX+0r&-4n z8^e1O`$aC519KAh;?K~8bopIq2ktu#hlj!w+Qm3G5_Fn1(H`RXqQSh1kB#p%ug1?2rA8q+K z{3<-?^IQu2NgrumZl_(djo%V~#KvtH&&J!FmF~iaJURS1_v-UbV&cDza=r>WW*9m1 zG4>baWXPh%w12p|W}qE9+zXzcbE*D@^LOJlt`q*fUI1My-Vi@`7&mg)=nWtxeop;&(J$FK(dmQWT)siCrI9b!dKS0O z+W2M?wsDed5YK%)`*vDu9$x$x56_L15xvHOH$NBS-}$}`dMOV>YvV)Mm`HoR9)CCf z$TanPmU8`|!)o_%^`$RUzE1rB4~H=33S}mjn?8GWNoNdU>*&WUldl&8mfxP?%};EG zw&851crD+(#2iB?c`k9CX{C9r_ljlF>lUZv1~L30F9SM;ZQpmS_IOZp3(A#yfHDig zyYMA@EPfR}a;)=T1pFhdzPpikQE(`})%yt+UtK)k${Y!K>1EN`yt8dA%Ypzb@+mdOM9xfmW00TUX?-L1;~HDYSf$ z+pcVaV0mqoSBHEV-LK@maxK+QX+8jDUY9o3Ds2$|qU!<;#jgu33VNO|LAwhTIik zdA0sdcWr2Kab#qANip?Tky+&gMY79^dm`Zh;aJ}b&*F*DW?;(GetSM7yq^P{r%|_H z>1OYO1?odPdpKEHLykh1VBb`S_Ib==YuW?0OW(;)5uZ=x-3Kg>Pp0e??%PzBGS%{+ z*x+!=ia*bwtOHy_^ZC+nerxP8mcPu6?x$lbbo`>FV+ZgkPVrKePV;5$K5W9@n>|?@ zO+5?XNAc%Q_O=l1cCZ)6*DN2#z@Zsu!J~S&%JRaww4w3G`^97LpbY|&MsLPx<9k=( z`(*KjksIMqxtUroCA!PD9YSAflHh?hM04fjDcA0`zli4K^U~f`)H4@7`3V%vTrTO% zzhJwbzu>aOZ0`RK!LQ?QFV~e^`)tn3DEgprNGRjkDe0_n&_lS@xa708PqH79Aw7T9 z^0Q*5y8n#57f-1Vd)cSVA1f%9nR*{wE7vk_@!*%2?ob?k3oxn=U&01!pW;PX#sux` zaefNxcAi>mV*ho?l|{iQf6Pg-Co!=IEqihD+}Ut?dFd%{u6IO7016Srb6x4G@qweZu7(kUvRoKlP?DWAHb zDEVs}%{Qqo_a{d$E3eQu&=_B#SvnyCyyH(@<~|3#1-tUfHiKXJ0=}H6e@&bzzMzvPo_~;Uly{ir`A4e0(fDzyXb3<0<1p2)cGSknq9JvD515qKldLMMa;m$L z=dF~zhjPzb`m$I=$(7DDcvZo_eOw9nF`7c&psj2(`2x+V-zltcL&aBjMbnF2?QIxJ ze4?x~)FAruLemcHB01;SBx3#01|8UTi~CmnQ`FOI_RCPd-0T2s{(3C=j{kk6Cy#zv z^+Rz$zt4hycgo8T{xfC8FMinsWi_u|i$W03PKIZP@weL)8enDjp&w_m5<8K1b zAFOJ-jb}kV@augP-B*XMxtsFJ^_~EZgtK$O*;)KPjq7AC#SRUg3~t!d0bXd8JaVR$ z{4S^cIal%GqoI8$yQEx`Tvk*ZOXD|#)8t~_&niVZe-ixwOI%bL$@e>RoZW>CXnZ)2 zHQV!e;*`KQe%VPp`?STSU$%{B^JaB=wh$VrtnYs-hxtOvGtTQ5 z9xnxVGq^s*H4K@W%U_LEIwzw)!Mnz)p?1Mx_L*V4uwr*Nw!q(So-wA;>3>lS6J2HI zJcxIQ|Ij}X^iOEcXd^S`U#iMW_Qg+{OFq~)!ZF979neM>{T4pH#oy)n%^K~{A>LfE)`*@;KPMam zPEv}^Pp`mR^oPAvimc-(-hpmDit)JO1K!?SC-6Q*J5!oEG|n?J=B>F_youOGku^R= z?X|^xVeuwJ`I5>Z`o5^|FEO!WTkc`XdFz3SvQd|49SC-2j#&>Py(RgL7H{A6_(@K` za54wHO7?_L;dLgzpBn*vk|tKMAC^$neJX*z)ps5}(2vARsIQS{!r2qH4$Z;eWASw! za=4M-!qr6J*INHb4!=kKLR$O-A7mMK!as-c-r=2iyL|=x-@d|~gRPanl18q2IfE-b zYa=wfsI;Yho6*Z5hcT$+M(YHljN|Iq<30f%So0fh$G)>(WjOsfDJq#U`HJYvwXFMR zeGa@XpUBuC;ljb^qpZXG3sv6n*39_z8^4J%ibX5{mKbyIPF}Eex+6s!zSH~?bUH)+ zmBX6g9oXACXYKBqp;xKVrL?PWdUrRY@6BUbA`@tNicjuo%9!+Vse zjyIeMEYiLHTw>2i_Mb{11K>;eaEiU|Fnsva!N1d{nE_l8~=4|cfHdA`b%oi9v1#BAoWAAR$ z*_h$?>y+~B64Qm*72 zgOe!vjG7M`i)*q^G>I z%Y{qdhD$%Gto->olqcTazXQJU>lB`a&keTR49dudPB*M~Z#dZ-ACPl`k26#IHpHP} z<=ea$%!=FU`G4_VbCmK^Bs0S6NuQTLNPIhVgS*Sd?vVTVq9pT+)G=xFE$;4-9d0*u ziKll@d@tx*2ST=TiE;ktpVhs*eQ_;c`%vBC05 z4DV)ExZ%`UWvBRp8)|>SjTG?BcHLxrxs%}E!vg#pw&T7KbSF-+GF<3_cga6yd@z*0 z_<2M|uYz;g4#T(5OtEiA^l|V9tuGfTyx@j&FTfA@sqFiqx)}GdMsBgII{U$ItQ|d& zQacw_qS+VRDbC{E;hdtVOK4?PoYo;}>NJq_qo2n@9*$evF`AY2I3q}v+PZRdEl1h zN;i#tkZl=3ZmEq?H*5^-hpW8=%|3zbqpP{E@PrQZ$`Y3tZcJ^zGwzlcbc?*hxhAr& zDUJQo@I+BOG1KJsp`31W7&C>LS8)o@yP?eUhNr{CrAC1J80W-en3~6GJy(D?G!Lk; zV|XaGFqLakd(t~8{8jl-Gr`?q0es$yUA_}J6JEa#p2Qb^`LUD_&LgPo0?M9D*{dn* z>onEl+o@RfdwHTIXSH1h@G8+@ixF#iE@iO;tB3mJ$vGOyRjoSjc=@rAE1 z9NtYAd}+p{2g!5TLZ1bX$#syQ)yJ5LJyEugx^s0#xWp$7f1LHz+1Jsvue;&=P30l2 zOG={_5VKyetTbdHe{<)RkK?bCU+hM6i``>^N%NZ8zgc-dW{DDi?4+M5rv?lkVDV#ccIQ-F!EcSIpeQWY&rQX(%*t>%5B8(dB+?# zd*~6Lf)8eQbhzK3P5)kbD~;im{{RG`KT))Y$IF-NWbG2}t&2=o- zG_H%ePNAIqWD`$7?i5o}+z^Jo&2eOF&Mt@2JCKDPZd7tG3I3ndS&B|!{Wh0uJ^UNL z4j;F>3U;6N3xNGf_0#GM#crG|fQ~UyMZBMV8V7{ zKjnvrSHwT#Y=8ao#6z{8(`|~=MVaFzR!9A>y5aPz?qShfDPr!YSE9AKQnb)hjwTly zn|j#ToWbu=A7H+ss=WtkPdJ{-^QNlyz#ZeLQN@vsiuJ8@-)(uKa#`!hViBLkhe`40 zpx#zp>O&*XLsj*y1u4R(^7n4!x8WIZC|#`>fp~@-e`|~AUpsavd7v$-fq&4I&7
2qx5w#nH=owk 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

  • +}DUQ)iF@cGsggZZ?N(tpLfs`*fUp1Wd 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

    jmtaw^u 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%0D5Lg2~%!N8b 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 Nww-zXY$l10J$;?WyZeY+vl?V7)H= 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 >J*vuMk(i^bz?Zo?(sa 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%0AWbE-OY-%@p|d>ww^Dw7HN_p)yX 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 gRsH~MhepuX_r|iFBFW!GDbitmWpU=l; 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

    +ee*? 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

    rr2h6ORLZ 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໺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%0DE6M&G4~zjeGNcS>-RbwJaPx*1X@3NsHVK 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

    r;nLx&q)W2c< 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%0Al?h^ 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 oBnJ44*k#ijDe(qvVpdNsezxtID=q= z2!kktXoEz9B?c=DRvF|O6d05nR2Wnn+%jk}Xft?g@X_F>fuy0Xp}C=@p|hc@;Rr)N z!*Pa@hS7$xh6@a{4f71Q7#14tH9TNgX?V-9-SDm9XTxs8--ZH4qDHbtnntEZ)<*V5 z?nV=g0*xY#<``udWf|of?Jz1fI$>01RAW?Y)NIsh)MoVBsM83I_>7f}RgE2uJ&lJM zk2DT7jxdflUSV8dyvz82@d@Kn<7(rp#`lb$7&9gVP54ZNP2^2fO|(snO)O1pP3%ov zO(vL3HiYD1C zx|@2NjxZf*>Tf#1G}biPG}Sc2bcyL+(?g~wOsh<5P3ugXO4xOuJ1PGhs7L zGkr5#Ge@&=W`Smt&1RUzo6R#zHOn+xXSUI-(CmO&x!HNMt7bK3b!LrbPt0DJb(;M& z`)xMRT))1dW?p4})x6%k z*}TL2n>m^bSV&vQS}0rSTUc8JS_D~ySwvaHS|nS{u~=Y{ZL!5-heeS^vBe3CGK=dL zH5RoNbr!EJIxIe0bX)LQYFipwnp#?0x?2vloNO6vIm0r_GSPCLWt!y@%Uza*mc^Fk zmKQB+Ebm#qwft!L+mf*owUV@ww^FpSweq$aXEnhp%qr3<+A70pmDM_{JgWk$y;dbw z6;{`+?pd{3eY8R=0c%-nWou(=OKV4KcWZy^2w2|o7XnqY#7^twtTjVwyw6`w!>`wY=dk=ZIf-&Y_n|(Z4cNUvb}Cw zZ~MgdqwQzgZ??R4f_Cb5mUh;5?sh}%M%V?|O|T2Li?EBei?>U)%dy*HS7cXaS8aFQ zuGX&JuF&)FR@=`zs`Q6eZKuJ z`y%@i`xEvR_UG+y*|*rguzzdcY5&uHpo64?w1cXHu7jb2xx)wte}~BqVGc7Kq8;Wr zWI610IN(s`aLb|Iq1EAq!&`^X4!<1+I*L0gI;uNrIvP9LJ9;|?I0iZfJH|UMaLjOA z;h68Z!*Q=;kz=uAnPa(Qm1B)#onxb8t7DsEmm@kdPQp&&PO?s_PWn#PPM%JFP61An zog$o~oZ_7_omM#IITbmTI-PgA>Qv{{;`GGnqtiF1fzHCt^3ICRs?O@p#?F?`w$853 zp3bq(iO$K+^PCqrXF9KQ&T}qsKIB~DTQmZi?WNRi@uAg zi=~UZ%LJD&mk5_RE*UOaF1uXHT`FD9yHvSUyIgl^bZK^Jb!m6$bU_zES7BFMS4UT8 zS9jMy*I?HO*BP$!TvJ_Fxvq09c0KQU%k`dXi|cFGx2_*uf4eHWsk>>r8M>Lfxw?6} zdAkLTeI5}x3_NJ+`8Qa+y&jm-KE{t-7Vd%-5uRs z-2>et+@sv*xG!+ebwA`@=3eQ3-o3`X-M!QOvwOEYuLqxpyoaiXriZ?VsfVXWfX6tG z$sVB|i5{sQOFS|?R(P!Q$nz-hDD|lJsPVYx(c;nO@zI0NQ`A${Q`=M5)6&z{)85n1 zbAo52=PJ)^&s@*Fo(DWjJWD+*J+FG!dbWDDd%pGT@cii6?J3|T=q2l=>80=G=;i9= z?KQ&7-z&f?&?~|#)@zAZj@K@)yOM>h}8S#p^BZE$MCOZSL*v zO(HsZkMj=op5vYBo#vh6UFcoxUE*EgebxJ~bpaBdjV^X_*Ej#JiwL6&v47DL;}hur z-<(|2vo_9MgP>~?^tkzN=yZMV`M;sl|9|^M=$r+cULcA=*Dh#!a<5}^OZxSY_?Yta zSL0Q$J=rim<=JSn?FV1a89(&-#EnB^2K?G5EPvh5?tQ%pY+c?sTghjYr-0k~9a(R` z3|VVEb9b#uRn+Gni6h$=Rf^Rg+qI}8NZ#jAw{qqX{%WPq;TMCncW!x==WR3VP|{No z^C!mNymLo1PHI}s?0PDo5`kY@BopbZxSa-wYeD_CGPnw8j z-pZoqmfy5lH2;9+=T}$HrCo0i+^!_J*4%A>>0+VHLrmkQ)_-M_Vs1As{xVQGp-%dZ z#fNw6M_gfUED1b+ceO3^<#en^Nu!~^znbL;?VB%$N~JX`R@}dRX7+8b4ypXwx6Lk1 zaw{e+JF1%}YyLoYZAZYYqemDscT>CO7a{@MiwAAM@0GS^oKsYiuRk856LS2~{fjzr z3-6x%QDw7!=>V(i)?Y^ET-dkvQ5i0~*pidI`OV4P1Cx%{>#iGgN69BnJ*7qQbV=j0 z+j07#svYf<{g>@>)ZAUQcBkK_<6D9*M2#96xKMB3jdQ9}zt)&^uX)VVe5s=OmG6Cn z8?TpWHwj9gvYNR;!RgtTS#r8nTXZI$sTA89zr68fR*{5Lf&#;@en72m@rX5Izn}h^ z-0W$7=ta^_zi0f<`I^)EH=J;aOI>m3DRP`KQ_zh+?9SYYvY@R!#3K>$xht(wZ`!A z^)bG&AA+h&b9VE++r30Lf8a6^Iioq-+Z=D(m<*Y^)?%T$+ztNONgsJOpB+BRT4+Y} zrcH5t`t{o@#$>9E|2$1;Q*q%V&7g=S!L?ey_q)nOZoM~7$;PK?Gw=DZU8fhqCFjY{ z-}z718}?Fl#6oec9Y^-=STX5ml->J|vO!-?O+mq^4%>aNJ$%1hSu}N8N@?bE?@RvC z(blbgwo<{Lq6ZtADSA5GIw8NYvxUcM%{>0${u=p`j{D9D4oJE=Vp;(oFT;O`_L(u6nY+DVKa>n#=?ApsDYipyhV+f3J!Ey(a#jyC$?YkvN9rTA&9_ zeXofv=7ausp8S7sp0wL+3L#`H(1WJFW8%hLhyT5I{SVx`Zf-FJH_{jMpo#WLA`aiK zDqbY|X-&hggtmzM;-|IsXOETHTP)xhG7!ntvJ%{PFH?vhMt%sj2lxwMsR;$NJ3qzWk*{ z!DNLYvRQoPcRyx?&-R?JR+%D`{!`Q8WZn(OIZ{zxDtgLAE>-pJcLEcW@JsXHB;oyU zrsloNo!33?bgrQ3rUP>NuMYmG|H-Q`{e*+eR@sdqwMS=^bwt|pzZ(6Ur|E!C+AU%8 zfg=t{Xx2OLnlUH&X>LZxmYpYS^b-q5hm<;RSa1G|?|qhh#HoZ5(}^o2r#_zkF@NiD z3-{)z!%w%8c;dtl^q`6Qq@vrpj%`b+9jUo>Sgxp?^ye!cTB~=ruiid%-BeT^Fv&!} z^z>`fm1(EX9cUY_vvA3gvYX$ACwe?zoi;nw(_~J>vdd*!&h@6vx|^)*H!@FRx>j#9 zbosqXdRIY9zzEk-DZh?YH)kvvJJk8qnKr@gA^B1(=9OPNW|eX0!;E(eR}Ogc=#|FS zigBmXJ-^@C>9}^HwEp~%=OYeW@qb*S8#6B0FL>ll`4OQ9-k(eNJ-p?M^4{i(1$$(d z8GJl8U)R38#Hq93B>6gk8fgbTXrgUu8}#;qsq&Q_lRZ-OcCC4>#^i6mAmHXC7kvgIOOFfrY?~o!G75|OPt)u7O--}_< ziKgWEv&9fRM+O83ko~--W4JLy5_<3whmgRi z)K+eJEU~8#|DXDBlhE0-{St;mCL|_}C83k442_4#v5JI&rJE(G+@ILBiNPf9OXPI= zVg!dimh40J7&n%L|LD(04d&3et)fl|H|c4qS7=gbkFJQAl!)1}aS`DhQn*Pt=lzo2 zBH`~1wDYGvG&yM|^(cwc_lFinBf)Yu19EYxZJem6eW+Y6612vhZj~cJRyjT*8bagx z8p&y|8LU=!R8mrffjG+`xpv8Y&L+QOP z_`8Sx_+dl@=Y1UNs}bHK`oj|WC{7^o-ugaQQO~s)PKOPR58m4r0_Q#>AtItb&_8`l z`Y0-zUPC>7{HKG6BB@_IU>P5COm+&mqa{Gj-E!elWQP( z+APw4gsrcU;U@oRrU-xIlUZYSWEhwJ$L78^{l|9wF^%Y^#tjQ6tQ`D5IQ?wl=%#&5 z=zp$#A`{h9G54}46nAmR|hxN>Mz19Dr&wFLK_V)2NXO8U? zLz!MuWNx0#IaB-T1jN0V`dx<{9?ndZ&~xEZ{xK0Lz0p4@&2wgKWLN~nBv&s37 zPyS{cLL$tD(s_~-#g^1jX)duZjbi<=i=&tB+YRrX`+F|sWb&FDwVHcjQ-0zg5??Nv zL@xj54nZ3q(d!$|#YeEY<$ikp>HJ>(ePU7fG?I9OwDF&4)P#@ByK~8{h{V0_!_A?m zm{Z#*mFfvMNwMf#{^O%QVt@I9(t8OU-}C}exnckIY9Y@cJ@S z?{E8OA22Dxb5f>zlGo7!N%UFa9ih>^)09S^W9UB6@4YlG?jC|md1<10cnSzE&GaTt z{IGuS0I01t=Iq1g@=#ncB1d&`6SYyVm&Vm4w)gKgcu`$_Qhy9;*F?hOOXRpVQe86% z&5Xp{rEQ{VCaLG3a;TNuJt5Y1?`+NS3oMeVAbMO@~Q6Z3B02 z{X5YiRbt9{C#^4?e>>SH ze83ds`|-;W`kwu!oOf^f^6L@0FQMP+$8SgI3yDn<T#Euf(61l$VCMoxiuX~@+XdG}Z#&Uu|b<#w~*;9%^ozR=O zb9`Ul{vtemuOq5kYUkfH+K)zrM(2I5t}p#`Ig$E*r;Dqb+BKH&co9Ex(|=c22$AVK z?x#>)eNtQ>+bEgpTD#AT6C0P>OB2;)q-YA)ivM{h=rqBlV^Qg_Dd!!=^#9O?wG@CP zio1>QSP_1Ducg=&cYm*blI0}oFRl-{{Xx6oFyXsHWcw$x-g%ze|Dy>Hx4jhqGPSEW zQM~7*>~y?m>`^kM{pz)0ImuJIC{1dYDXb<~+&ytarZXmk2eo!Nfulm{h=Q*SogzDni z-E-Y@=Lf1wjnL@x1a}O*Be;G0$cog{dkZ)Dkn&t&FZX^!aVHYme)8Aii)DQjjQ}=T9bMfeXXDPumBll%4?J}{6o2TtwOKs{+ zRR3X8wv+n%zCfR2-Vr&jZ}|J*QH+y)Feuc0Qtm%SUJ+W~G2%-w==0qJayBC8?-b*| z7$f|JWKQZgM!5IqzP=G6eB5VSY7d2daLME^zjB^grv39QLfc0BNUonOA#svX?|qEh zw?f1Yt{-WC=n=WT$%~Y!57to!kwkqvmeA-JV?s=RYpS27H(KAZFtHzo7^&}@MoXK6knBG+YDdU=W9Sp>n7f8c79o3H zqvY-r>U-|D-WwVF&z>Q!d=yzY;{f!PqxpWavm>YdtDb&5bkXfEtbX;0efKl{Cw;Lo z(@n|x%Jkq~jcPHW(e&#%GZJEx2$B05qW0opEeV|4Sjg~)}Q$|`o`-2*ZR2a z=zk{P_#;D;pN`J~12}oknUw#~NHvFt)DtESxo0?2o?h9W6Z!C14+cMnmqKvHJ%^17 z5}aNPPQJHc92pKTspQ(z3(b`wbgqpY<&f?2aqQ&SMitOH+9py*u&F&< zOrjUW(#6~;1EkX#P|S_|brVacWpLxrNS=I_jnX+ZlBc|Gy}X1-D1?{t5E+U`XhfDI z%FC&vG$KR(QaU*}bjnL;y?7KOozi<~y}X3I*B&a^$OBN>JP9`cVck~7UPB+nsG8V{+XJmgGyX`ax?sfXns z3=R(mmf}zz@`uO~PMYV4P_Z5wSB_GsN)C3fK8|ie=J0S}`q=l!9%>6mfZE2%a`g4J zzsJ^IyLU6 zuHHXbz4r99si(b!y~l%UJPf}YF#N=G{3K6gNS@TGksLV)o#bg9hlkdY#Np%6XdQKb zuWXNu8X<9Hday}}gWt4K;`iRaydVBQs*hOuj_&xT}JWZtTk8K2#B+>?I z^Pe_R84e$4ZoQBB%DJj$%??4vp6Jh zJhYDC|k$G%>>dhBSk5GK5akV){po@KISJL;2GQi5khp?kSVMq@L1f9hISp>Y{cG zP$M$roK9)vOi}1xN?WW(OXMJVD#x*pP^b)tM(U^x#}<;OdZ-;ecK3ZA2%i}o7n%?n zO+MpAK4(K-F%O;{5kmwBJz;v7wYj+!C(q%bK)ugI;WJICWOPK*%%11HzBmLcB7y#w zehz|6kK+ zf~T}V34YD}&p6zg|4AGE@;B)bTYGbR>TxbTG1N3XF_iliHqz1LnVcRoNGH&WKMtnf zFd|O+ixwZuq5egS4)2fsr?ynTo;gha z%|AyAlwjsIuJ`{{h}*{h+qvUj*A#^?iHQx{zU_Y8{aET>Q231|Qukp@`am$N`wVmDxuHedHiVdJW`^Qg z$aGxIRDRUL@7h&N$Rk@Q^L4>04`;CO-NUr*@kL+fLQHm11^;z!nBp!1yAvC5&`J|n z`0@)5UYP?{3YXyY7hlN8(Pz$mk;DZD=i{^tFPK-K3*#eHaMz4{SRLqzoiENYo`R)t z<--d0z4ux4%zF=#2D9 z^PnG!m~`Ukk)2T4FapK1yFq8PFPbp;7amsi?O(TXE;n*GnbvY@EnvLbHN|_<6!e*1199xSMvFCSGF_L z1=Q@efpJkKuE{*XEE#_fDo$)-e;gFSyM?1b+bR#jMk>JjZS`1xp^h15G8UxV^%7zeFYYqQ70FO~;xq#Z z&0sb)7rONAAXWG#`=xje7`3ReW8X+Y_s%QKyG3u%G;BY6@Yxoee&PW<%bt((J+`o? zx|TuPb9tu0{w+Qzw!_l)yD%rc05gJ@W6UB;7;vBr`4&%Oy^l`CB%U_r;iq+Yqga)R zWOUJ_#2cQQI$+~dZ?@LX8^zdFC|i3UZ%8e|;QA00II0fUcx&;aK{~6cegVI~xXfgT z&xM~e@{rFe4p-ZGpx(1Cd^kj#J=`FGKAy{%^%ok@NGA@wPLIIblYYX+x7kp7&;gRZ zbi$N^0WiII8oXW+!laqk0B`;Vkli4F_vQVUe)CClo)xlIW`$Ea*3N|vZ z7{vSNeDOZY{G5t zweiH8TC9c>xOGo9v|gSGgEi&Zy8E9n^!H=-bi@mIERn|SS)PR|wX50np`Rh+f&zPe ztUAUH9)-F7$B~Ce4tBk7#6j8WVBIK!`lWZUeN_RRsA)kgkB7=_EN-{Ae)}$JJEhy{sQ7Zx)Uf z^(R^JiIEUcx1HfloCZ8coY+IQG5D}l9Hq`4g!S8|vlAMQV8Z--=C#p5NaOEh8s5Eu z65eJopXH2$JnrCtSuyDUMiLvNF8q(pE5`+XvEecIL4>ymUUwFvQeFWQv3@YJ+lR12 zyPv~E6$|ik*oo)mW-=Kb8F;~B9P*!7i8?>7L*nS2u;gVtq)yC*NnTgsx9@gP!W4-A z!GgyK6L{HV2ruTIVK#Uf!t#ahnTn`t9Bcg*EtA;)vH8p^UK$^taYPTkkBs*q9~i%F zHfviH2+>x}tng7;ylgZJJ2wu+J*!i3M==AI`t7jJMIBbg1~KIU-mo^&1VZz~Q0}<` zm_K|5@gv@_7qSht%=NJ)k7zkWc()XR7!`x$F#a0;@71lZ`qcd`22CFZ01 zRxsOUid#Hwv1zXcJN)DcX!01!Oq?GE_e+~`ia|Se!dB=SS%y>n4>A(<58zPHP_UZ% z9VGI0vDI}Rc;t&HyW6Y`%$+~5r-G{B>hnR&HC}OCVcdbUH}JqDzYf%O9f{UsYMC`M zDH!oef|;V=3B1=PqWb=oxUtm-2Gl8{QP+OvQHMCH+>2zh-?u>e=q@&v6@kaW=a?q~ zA7Q=keVl!3Cb}kXfwkUdp!qx&E~sC`xQ26V;^sV%ojwsPhku7>S992#yCd*UXeHA% zQvzOoRYBPe-Vigumtc1s2#W30a6Z`0H8eZW0%I0ZSK-Igw5F2zG?tjZ z8>IvDyTch3$xw8e+|7K?90}E~``M(yW8n0=c=mqHC3Ft|#cJ{1z&Vq*V1}PEdA2>o zb~MJ~18Z;S{2&XLHnyNn>tlF@C)t!SnP^{kj9K+66Sf~UVK0#}J@MNMMrp=*Xn9=1 zZhUJ5dC%q9rpOtvX53xam~js4-KVn2%bwzxE6GsM@(2new4gdc8)hEf#|oYT@b@{3 zp=ZU=d(dDKIAI;~3nVh`4JG)nxDH0A?SpSGc-W${g*Zv+CR^h80R{EHGqd$9aqY1x zcGHhVuyV3HGuP=cc3tcQ<%UX3A0Q8-x9*0KkD{12w}zw5z8RS0BLL5*nxe`zdDLtO zMCYTcG2mGtj#zvc(sjfkc*SOHT)2br3nKdw#uTtsi+`ft4PX4Z=qVJ0xv;f-tr+4} z1*^{#;1bDpB)597YIbI)*Z4p-pCF#uQxB^1=RoGCb#Uj`E1X<^3UhdVu-%QrVXsOo zb4cI`yjY;YOj)deBlC@!s#Qwp_;eI37ykyc=c$3;k4g+_`^D;fB*7Doq+)(-5DtEM zn+dJfLol~z-G2y!#LrFmDEcn)9@)nlWmLjj&0N&}mW@8yJUAl?;oBr0ur@M)0V*GW z$I%rgj?#koqLXlL=taD`eGfYDABK_YLg4N?5Vnj|$HVM&=6MSbPEcW)_4?y+<;_lZ zcD6WHe9D5mchbPiScDxG;sX9oa(Hl%77pxI0L}Vnkjbz?Y0XxA<7|fx4+lZc!in&1 zkq6Z2l%dA^L3m`{bO@HY2bV>+uqI<)VY0@0rv1loR9qI$OsS~CgID5Uu95-N4e0*=i2g#}OjhSPeDq5K3LiP(iWO%uV0tu!4Dy9HkMCmnkz0(@ z_Iecl*Z_w!RzuLtPjF$|PcTeYfmZ+RkoKwxo+;J9YsEZFHsr-mBBrP=H3(MxG-4H1 zyRfVwmDQWK5zY{dK>jxJZE9d^vRdK#ks8PydKx6=>9bRLN5RvE59GQy2|u&inZlL# z;cj;lJ29gIB>Bx*7m>B(_s2bGup9%?$wFG?#*9w5^4b)VBzf@kECDRb2mr04FBy#)KG3{-8FU$J z2epkM>|Ud_aHG?QZQR5Q1|C|>(#8@Pe`Gu=RBuD`S6S?gQ)A$F`cY=f@%hm8V=%mv zI}R&mEd@OimCr(DGcJtOftTk;K#t)-Fj^voM#8e#f%(ji=x~fHmBX2jW`pg$B@iZ5 zkDK$>;d|a45Sq^q>a+cU88`!6qBZbG{z*_9T7^18)-gMRyTJQJ1hZV}1Nc3ahfy)} z@caISP?7!(2IRhF{REf75CgHR2E)H zf};#)Ca%AYMdu%}yCo*#sc>0PO|}AmlUa<=06y>@eVwWMdKiSvvYDs%CPLD)9WZ~| zVsL-=hG~5!fVIySFo6w@5SKNPne?Rw%>{LsjM--(Fiw<-Fu93oH;q|8Y(dLm5}0NX zfgh!Bz|J;4h_rYIepb~u^Tr+Kq^KA~RFA@GBWpmv{3D}zaUp2t%VMqd1rSUvWV*MP zBhL~ukPeDP=Xvdn_cbjnH!H{3_tL0qA&+5=g*f593hv3}#q>d%%z^`Ai0x*4hoV>=I2MC8X2Ox3@$e?>0B%m22y6EQV6gHP)G!sru(`{S z_uWP4{gm zgHEF0izC?9a)A*ySAxRE%d9{O4_ba03h^1y==-4^&K^sH)S*UCdO)64e5nkg ztL8BK51zrp)xP*^#93Ie@G|(wgrIR=H}hy+IJjNdfpa^bLB{d*02fl>?aDV$R4<`?TP{0HK^P`Hw`XoHOb0``C(s;r6=X(8kx!^Cf&!ODh*5qCCyJ1<`E?Fj zZk}RKY3rcDIWO+himR%YMr9E>^MfG3yihMeqHM!0DdCTvk>rp>$w zB?-w)(d`j%<8lDw;N}S{O=FqM-_mi#)2HnAxLVj6j?6OcD7cdDhiP^BSjd*MP9mQ{ zwKPM7hi<7xI&;AL1KHiF$Kb{o7|Gp0T13D)g&XReK&2HKZSvm0DB zVAThAe7JTg+UXdxSLfb^*~j+b&c{6PXwe*YZ`4j4^XNPCv1B={&6dRjE62jl6{GN3 z%4oDwT#BwCt8nuVT{xRB3a>0Tv3jDf@WTrMTv4KkBZh@CP4@*Mi+48@RbCGRx}#9< z(-3IBMgm?H2!rRC(RjIA7S~B_1Ph<_Fx7VhBlpuCR4>TF>HF7l!Ry`3w_+dIJ)xOh zv@8&I2nw0~^7c0_yv9kmVKzEQ>7$B*O23nV3g{4Un$2tO2SzsBwEhhV;UBTgDU0GG@PVcQb2;FkFu_Na>+j>WZ=E1mKDX2rf(z?y`JqYaE z$BdX(iWbA=!9$ent!mu?z5~~w$otbESZj@C7tSz;)Q;eJ-xlWE!Df&@Y{5Phcnvj+ zys&JF8Kf1JG4AFph`FXQtn@+hT$jemn7N|jsKu;al`{NT8pmqZtc95e_CxJ&6`ZN3 z!%iiUes7DV<9*xt_(bLnJgH8D-=(F@y6GwKZi^P)f9Qi!I&$nv5=?9JY94s`C=40t z`?%qHJA7Fnz`~)sVCkTZ42s~FvUMzc+6OYjm%_XU`Vd@|z-G$j;kIY(_>FfYe%+AB zwodWK$D_Zp2Nwk5@T=LNEX9v2mk+_95mTTg*POLl^bB4slm!!kQn=-2#Vlc!AaDD9 zSmHJcZp$A6c)1GB|Bhj2d@BMsJw3)???-eT@tj@wxe_l=IgX20kH_plJ0|xEFV=kD z&aT~^4T6WC!D0hxWQuZdt(F#=P29uoKlliy4Q+tQcl=<7?{#LMK?8b|*l2^&Q}G}c<;;I{cY`)>ISEQs8~ZY+@k8BIxCIPW!_`Ei9^`eGHV7<~lyrh38J z8yncSo!=qrbPD-BDvtAghOpj?*F)Ol?~Hd^3aX50WX}$l#1}=E*kpMRbbn*V*2`>z zJjWo`SV;mr#c%WE|wVgH@o)}DLS1{9|V3Is^&UeFKgI)uljTDYaIs#eRHYj=~724uT zF#KdI8gzWYFU8N;?-J^8C~OlBe`|rsW7ODL`#YdE`VRA4;0$Cr9bivP$$>8iXX0Dq zg*YVa3?#28gQu#EpeGOx3Sz;G*TV_GpC^S1;SP9oZw+IWG6eY4SoRCsg+*&GVQRcA z9-UVT%g5Hi%0Vg^Xr=_}`64L)VJl?cie`o+x}cO^6uWZkRh;_d85SJUfx=_*tZ~Xf z6nQMm)SdIklm)LC;ra+%V7q`-Bh2 zb8m*A!XR~=W*NY2sV8e&r)^NaNf69Ezp@e=eNb552Mqigz<@`GQCzhaH&)1k#Ga+l zHTE<+_sUFM)D!}C$!}0txq^v?Vn~70PNfQ@a4hhNhJe<%1u%4zG~O9@7A^=DG4)*|Udbjgu5%T4*3l^}7d?3O+#a zqeaa0qt8G~UU4 z)}3KJt!_bcZ3YvaC=NC`4vh5oxp)Fq;Nm+EGAHuk?+a!q>HUxy*Z}Ajv7UL7s)=uh zoxtv*XV6+Qm}OxU6dpgicDuGd1P-WTY%!m@*4QuO#Bb&EMhB z@wxbXnKc}>xybzZX$|#*!x@dMvmj6P3w!wK1Qh9z#oyx;FikfJ56=vTpCUu>{+*Th z``!;YYQ7gleHWm1(@va{CB_V1lz>BcpW?UfZ19qDVm{uj#HxoCOy0nF$eVHm+Fg!g zb6G11fvb+UN=ZoG)8EnaB!iO{1feeM#*pt;IM!n|Xrw*IODp-9eKBW2T0EcGdhQA~ zjCMo`z8vsTe#TsV*iH5%4`nu1VvbNgjJp1J7+gHy-h zs}Om_z;9U3mN2g_`h$|;Hde@+A9Cf$n%Wg}SmvY&DPJYfd?L#}mp+51+~b&L83tt* zSz)EMImXH7fKHk%K8q-1?_@gT3hyJ#xs-M2G_4sQ3U}d;<%3}?`wXtDrZOKaf1>J= z#W-N41vWMwW1a}T$6p)maN%Sx^jUO}orB@9IO`RP_#KBIOR8bzl{@5~wu+r2p@qs9 z=Ytp-L-iltGB3{^z$=>1*%neFM@|`UjsAe!1@g0~v zbb^%=EAZKvcj)h(hilG>F~ZCEA#J`H`nzp|L!Vbchvrw9pL3DDKYu+0>mxH^=}59y zRTaclM}e+!F)O#`AqEQ!!nS}xFwJo>>!P9#{E7FN-J$8ocUqQBQreH-SLWfgFCXAc z%3?_P{uU#PuQ59p4#lZjdzcdU_4xkdLH5R#YIr_$C2RaO8ZTLGhs=tj5b$d&8(7(b z2Z#NF4GyWGklcpt<4zT;6R{3hyHYeI=+D73!+jsE^*O-B*gx5J`|jKrn29Vj|b6xH{|z_#FVs9he*Y?`Hs`|^AtVL}$}xa0;x^HuQ` zUj$n`XBv>T4)(mgHST}46Q8PuVbiv~khi4}9tv+@s^bG;qtY(6R#pWfm$sqJ%c+=I zd=saX72w3Rzu4*OlVC^aKqzg>#}5f}U{-@Q?md^tY@XbT6K5IW9cOYqSS^I}irX;8 z<{cxVvJZ9BYMB>TmEi32vut?5Tlm^k#ze_n#M?WA!M8IPYIh}r<-P%El{}aoX4i(B zFSf$csmn3qd>yDoy}&DmCzU*oLfa zu(je7dsb=*YDFJ`9dRFlH)bQFwYLfODN8cPO@={`p&I+WvIC~)XT$ZND*U+WH;Tqi z!`beIY`)()9CqX)`&G{jqb3TnH$unZ@0$`B|H%Vlc3xudNSpzGX(u>4vj`XN3uW(S zt^vDGD_H&5#Sok4z{J*PW7*-4s59s?mh&w@6Tz?06*-3y9k2`eZyTe;jo}!uFp;^R zT>t_6b?hqgJLs@YF>CQ{DKu2p!`jo4@Pz#inEL@`&-wtLr45{wKgm8i2^g?b3JNPf zqeI;#oG{D@X33dDSN9{3DK3H(!77wo)B!O&w9#=4iM>-X9?ovK!-Q*RB46A^$T+(V z$Ii;Y%+?zq@-7zjq#{TtV{_KhW;p&VKaD~8Pw`~;Q|2Z4?d@Z4!yb1z4Rdb!KzZkH zbQW!b%bs@lM(q$|()=9m%zlGXuCH*f^;IVGIWJn>ih|+qSL3E_&1~o47TWyVSh zU%)RKHtcG#eE3kx%jREnf_>>csI|@xH+^V^xt8l-%oYP?^}F>DHRU@~Id~wrF8>7g zbmc(u#xAB<@eJN2>#q8ByYUpe0}m%zLDh`M>@9Ccvi_&fG?`t3(RV+=-Lth&v1=Fm zfc$=0-Wm@-PP@Vrm1*qA{ky@@x&$Pz55`qbFG23bt$4puh-I!FL5s|IX6lJaP<$#2 zrXGt2!@x#d{%aO4SQfzYc6s0!b6w`qfTs|eaSTQ}27a-yct&UdHG?-h(ZXKbg+BRB+`B z1=pEvxWPdPCOJLDvG;$0U*mrG-g1>moX3FH;ko3!mkP9xGRIs4X_$4zkg*>=0T$Kx zV@4KPV^=)}EvqiUz{icS#H$^SjX%yV%sWY9vgj~F3dN!OXDMS~+Xl~e8G-D(7_i*9 zh6&<*2Tf(OSWmf;px0H0kLPWHz4j^)km>|ObjC0*2AzfI#|3Dc;)=KO&On>`Mr4nE zW!jFlfyS&t_NbvB%nBaGlz*I$HplX!?!ZobNFvT0bsdVsyGAlUj!2+}c^iH;`H5RK z&6v~zXPl)q3Pay*f#nr*F@D)0l&pWqKA2jEzj&Qt>cAT?P@xRn&KshNtTbd~kHqP7 z`It+-tKn>k6^i?BfLG&fnO3vIu*|>!-&>f%0SOkQa>;W@RVR9XlZE#$((#yi9PFR= z6Xy;64xjngv0vM^VDo`v?9WwuQK+yS_vjtMEjtw1&(V|dv0NM@(a;W21*L3NF5soG znHaeG93Jyn#Lg=B0P`kQ_;qAEob`Ljyw`sU_uud{%gMf$eaQjnRW%h%mR^Ssn@jO|csy|#ri(g3?S%t)A*l{$jk?ENt0((4 zgyyr4Yn)I$<|_MhRx&(qT&3o8c1(_Q_=D-aZfWt2^;ng&(pe1DGF0=U{AxB-F(3!*10|)~DbG z-WfU!Yvp`ku$TmM*WVW>-noE_K1bpE?74V#-WyyY#<*!k!Os`%h_nZC5y`mv3P1RUG7le>!+lL()JZLY%Fw%z@ZJdZ z&mLfn&uj(%DKfBh=S7%zXBrCo8)411F)-AD{ANiw&syl@!qx{>5FsxCPCpv)_0qRE zqht*uCNc%GRb$xqAB}O#!%il2zbST)6JwN0T+p7ifyeEOV4ra^D^VGO&wVZ6+Lx(t zW%FFdOT!z5+;_4Ol9QmQdMnq|EM4`i>PPJ0VX(4C-Rt*_vg#IB~W)E>ReY zEsBlo%*Y^AeW%K1!9C1Li(&2$BQb+Ki`XjW4lWfZ|Htrf5_pm|fG2lz;Dq&J=Jl*A z@UZw1#=VfklCA%TqVsUX@_nQDb*B`Sl0r+vNJ&K$8AZ~Rky2!~R6@#1Dk>UUWTZ)E zL?|N~d?QIwMrlZiNKq6??(=(oe}c#RzRz`?b3W&?!R z_}KHl_X9{Z@Cx5XgV>7X4^iY~H z;~@*ZdL20}Ze-Fl21_;1(D+qTsr%S$yq%VfjSWwj)M*JU$^MD!UcX6f*A8~$P7hYk zZinT|Td3K2lBOvQrDbCxXj$MAdS-HwpFTQM@H+@@r%ch(pW6GqX_ zzlKz7piV4n6yVIDazP$uZb{^towO8hp(kTj;+sVd?2vxTbDMzH=&RVe$*m z%Tj8{pUIZTT9DYSGmu(Uh>1FhOjaeDCfvVIrwRh7rR^!c(k{$1xJtU~Tj1Lt!T+@$ zMv3cmw#H;BN~Lx9j{Z)J8CHSshWE(2q>Oz`Jt)j8Wu(=7gxIhbs43xU7w?= zG-Dr=zm|iHIcs74CK-RCR#O>wB~c9(I_+eDh3BNnc!w>uoY=`+v-D6E@P>81*huo$ zbu9bL4(#0`cu#-d<7T-i=|)_q<*75#;cABOt1j@EkX{OJX`-W(l#v$aO}ppTQo!c{ ze9_b{+S&LEX*)_`dBK>e%a5eLD_-+&_Y85NcQ`d?4#fNE?c~+y3p=Y2&b>F%@{Vrq zX?2LCs?H%})<0^p>1Im~^`OjT9vd=L3>O>{sIK-Vf*uZFR6%qvZ6^x}+AQenT`YTR z3bjSgrPG7_pqsRT)kz4tQSBgBmB?wPXc_kzCAed|bCLVuBq?Wj^K3tBL4UhNJtjpo z{;Lmtp<3unlOz94=MZ6J#7@=!p$mR5;d(F%O;c)F@cUxn|2=?)ohgU;^a9#r8VEa) zBNUaMkNu~_ao}MVhHfjNa8XryyEdOSkIKZd>?jf`$;Bb}2Id&kOnj3P7F;c+NW-_J zv*Zl&+ZIUL2~o2u(6pt=%QNzvpWz%uO_uKlOH3grgJP) zTAD=9?%Hy-st^cD7J|Iu=~`G2T<^-Gq)Yg$gnCm@+jTbZXD|w974mJjP4RJ{;PVJO zacJ-@_SH>}mKfIX=?;G6Yc~U#5B|ffz!~IeIRve0wY+`bE)re3fqkp;qhG`4aPRXH zCgb4??8z-CPZMfmWf%jzVv%oz=85(GbKMCL`}hFLBP${tPAH*aAVri`Rj z(Qa(r^RIY#EsngV=Qa*7?xp=((5Y!th+M({`%^zyz9u22_W&*!SVCa2C4 z_B(Pnr3m?_;z^IuWUj=f>x`y;=Vpqsl|XlAD6dWafgf94__f4u6fL~3B3jEZUg|F! zu=FU>hb?61a!SbAXAc7VdPuT55&C{d(6jj-UHlM5XNsrLMV*<5u>HXfideyZX$4CZ z=AeS8y%3j?q2vGAvUyI9^n;RczThAQ?Tn;V{V8O9n;rS2K-*{)KWyO>2d**$u&myVHh;JK2!R@pPwd1ipl~P{_9f zbXM#!hMC^sVcBJn+LaBp>W{SI`cq18Jx}A@=Tc#z7)Av5Qbc1QmD5`$+xd*zD?K6o z%bmtGO(jLM0w}3I=Rd4JVxq`w%xG9ece@g4@{ti3G}oU_2FsG@&$pD?bQImS>hxu3 z1s)t&!){-{f!|uPEHkbOA|uO~leQO59p1pF%$23Ca2xb%NRWK;Vy-5)9$DiR5Fe65 z3+_eI`bk79lMTsm%VWsCe$0FyjT5xHr~Jn!bJ$G~$C|<)C@(w=yAkW?jq+uhTlj*g zGlRC~_0W}Fdr2u+@IlhU>760NI^7l;>!65_`(oLv{3KktJd3naVyWfF7Pe1XjOL1s zf#%qD)XBAQ|K#&Dyk#q$7gMBo$5ZU{;ptRAq6>VKB#G*NXFCKvRp-b(+UPFmPn9(^ z$1)4~zF+wG*Siq=ekWhv@gM$9(nfgj2IR@?VItQrW0d<}8mpa;7>78TJ+h02o$BL@ zzvg24s2EBYb-=Y$4K8~t2PK7T*?!;Sh*bB$J7NE*=orLEX(#5l+i~M4JF0nS!h9r` zU~SxeJpF1;N@|M2oUxyduU6wpJ#)xD?jLPW4yOLkL9{4gC7CZDjf$7z^mRuB?50|S zU)ARCj&7opVYj)gOdd_wmcu>ARb-I=0S&2&n5u8jzMTC*COZ!BMNu|1(di<6>eIy6 zszEsWv>tJ{-t$3UWGQRkGhvSng1>Pjcl`WM$V$oZIo2-_(O|(WgXHMvqgk|V_gBo? z;>(ry|3$EBCl~8YLWs*@oVlJt>Ng)_ef?>a+Fzm553ggeXE3?#mlkw-18$^bfW|aV zzkVyx5A{mKEc{ElFFI(Syc9`HY32j2?xr21590GP2Ri;Tjo+?5iw#cEZ0h=xlo;#I z3|x!pr(!Z0Y8{67lQsNke?BtYRr#Ynp^xQnB-&eQ5%J;~P59wOOINL7-!|FMjK7DO z!zh8tsF$bRwNJ6nI~Rsh3RJ$RmqIt3q#*rZ=G?l43M_?uZEpZo3d}@Bpb7S*w^7P~ z<48Yum(BkjjOcZD*yaV@*!5T!7Ue;BrPjlB1tHtkiTO(8FGMn>OgPf+mq6w1uNKclfjixd9R$9cu&U~e& zkAqopk_5HQ)nxrXX;dtlgfh<*x<2MPd91a@i0R@elG;QD^I!AW(7mMoyc&x_C*sPL z!)$YWAW~%l;IAos-wQ{vacVQ}k4vKr%aOZGSw7DMR z7KdiSV7dZdUnNfYzWL-7^q5i#viQrP?J)EUNrXR?9{coIn;RfUS*(Ba=ijula zYWz5qtv-+ieU$^W?Yuk%42kEzf1D@1xu?mzGKfYT--9aeZ@BvV4+aDsL-WZ6On4;= z&+Zh|60&jD*pjWy9!#?|Z3PcM2J?k|MK!m8LMP1R$<}J*llhZL_#MRHpO4u+Lv@s# z*~0I21>=;gEMMtpMP7Z;?E5@H#}BQ*;YZy#wrDqtY|*A4Z}te;;qh1$u$=u%9uMUs z;>`LD=ZVDt~RpQzHzhx9Jgg_FE1UX9pg5dk8uEY16y1CT#7k zqID82$X@+|IzGnHj^UHxvs@BEi(6?8ze73S+}WH(hw<}u7YqtN(et01`R1Smd@n1e z`NPd=^8T$*{+vNxcP6nf*Mi`kUq-_6h(k*EknkjeDtyMVdAUMft+SjTHEgD-N|RWw zyBSTM8_yqf&8G#+L;1zTXV~l9Xf#>AMNEJh zRa%#`A8*reW$QVnnYjuYE=g=n{Z6V<*hO9ov}njgY5IQcG2M7^nT{`=O=s3krjpJ9 zR6XYy+n9Qnnj^O}hX+k`!t4S6@j4JrDxy5;ks9@nvSDYJ`;uPhG`7%L7P;~6{6L!% znbkPKPuB_-A-~xNpPLv_62zYCcF>ov8!@F_3h}#7vs>OubWJ6Jci3#Foq9!V>_8(S zmo=B-j_knHy|Z|dy)YM7%h0k*3+TA}5+1QV8sDB=CYkDJ9J6TTpLE{CKKvn>dud>b z$}1)jwh|jI`ErR-rW96rl10AJ$EEc{*vniej86B%)-_G^&R{Q#_&X3APrt*|9z&FW z%;J&ek+f9#8%`|LCsETM$jQ4yUh3m%VdF#c+q8hGH(Z3|#}E8ng9#*N`ms}o(&>+& zBSq-sAk1+hMU>y6e#ND9Zml;(m)@lThkCI_c0Wm2ouQ<;zuErCFR1)c%=X{Uqd5z@ zX>@A~`3oM_a6SpYGXmjqTAot;J9)^ksfdq>rRUGKP|w(@Z1Xv7nr5s`Ugb~GNwF0F zOO8tRexgHe7Z5Tpo9XTwfr|^Y**x_UN~xNNohK4;bLV61iYcTG%R2FV&j$SEr+G%1 z9n3eV)8Orf7|X$*E|P(1y$h!GuB4y))u|)uD82u=ox&oWs3yjjcd8wyR>fXEBWFD2 zdN-qP@^w`9eP+k?55shk7`L0Vnz%< zOL@m)e;U_NPalrkLaw0wuDV@tD&_DwM=c}E|kj3@uYA6(Ya~+*|-0~$yy;7 zi`U)|X7X|T@O~q7T$IPWCvo&h+7oIco{?GnHm-;zOTeQ^7)b7xr@tD2qHvHDaQ)sLPqK6JdWTQ1g zk2`X`*6FaDF&{2*-zdt6lX!?Qzw9vOU006N;!H!H;a7qY`ctWR{S1WLXCR775YBhw zqxE(8*Y(gS$p$)P=))h56@&WwXQWnbOs$9$coQ*tFK|Su4ZmQg^_+EP4ZtLuIMzJt z1nxDzBkkFGa2tA=GHjw~LbDS&S{Ac?@4VZW4wsvgH%BN+?7B56d3%lM=R^$7=JV2&jL>3X%f^AK8)A+;vgc z)JNVfCuo|KA3v?1>%{46mtHxN8NAxG`McNSKJ49CljsXR<(Db+Rf^F1!Nac;pJ z{x(Avm!Qj{!#b%y$ci*qHqo5_>M8EDne^$iZxqyeq-`k9Q0H~IOQs(nm>wf6Kryq;u~Qh2dz4XNx2;jc2h$U(!9d0zQW5{t4i zYoRa)*x$#;XBki#bQ-Cfs_`p7j3&;#fX{nnx!jftlIo5?(3e5vAM}Zt7&y_lz$qBy zs!vN?gqdr%G@Tp0h8M+r!Qnf)RQDnSP3Nn*$l+Y_%*baGBqrh3Rx?t!jD-IrfhW0q z6jE6ySwqV>n(BE2iT_ft{M2(E@K>IenSNvMnnq)K*-dO()s7PB2Dp^`2Zd7(?AsL` z?AUBYuAc@_qMz{SnTkc|3lA2brv{Ce`Q+$UgGr7MHWhdgOgJEUcL9JEAbOZ7Hn_ z^+sw?E$JS9L@^%&Xi}gLw=bPb+rPZT0RK_G!Y@@&@uL{_TeE{k*mm=iKh*GOy#ivD{OC~WWtO&T8*U~~<*!)^JmyN$ zvCl>18llB^bYCT@TvJ4t{J=%CSR&12OpIJdMs_1<<6u|rg2as2mHDSdw>28YL992`rF4*v3?#VOzFeoS`GHHaxmh&rWkCaxq3@n?^fBoJqCNKFdQ>NqoqU7*op$pisZ}I-`5nKgF^HtxVzAWuA8xw- zAn_7k^y7!HQ@y13MX$K;bxC|2yov6sWz!z9qpW4z3Dg)Jp_$(MkmWR&!mW4EQuStt zU+_YP@mPwtdPegFUZ7phk#=9KAg2olY3k0m+|wf!t8RmLYG>j7)Ksn&tA;fq!0z|= zP%!p0AGv-5mQE<)(vsom^5xiBwh3a-CD^;!7ij14Y0Ocr2;p;!`P~IWu~Vgmm5NH> z&QSyY{&Nca^uMsiuUVLSubThL@1^_0%~;?DMjwveB(eGu7#>_fiLY&OF{y+Z3I(i2 zTW7IU>u7p?XeF*G&!sDptXwW__>&%EXiLvtfqD6 z-tb8ZWmqRRh}@=^;=79@Y3t7<&)gAA_2*uSV()M{zJUIYILvfs`orK|A6Ba8lBV?` zd@(D+v4DeY%&2^*E)bq~*i=gE9m?fTO{5N^4D4}TK<)Q4nAPtD+*j*C=$c&Il$eIl zSI%_$gAaw5UPN`pIX3c69o?L41<2na?+-Do^n)FYMepL_;U{Gip9#YY<* zqiG=pyuWe~O7{damDDC&a?Yp7zC_XpmJ#wy%P6dPCqI8>5Zcc?rvn#`V|`RHA8eFJ z|E|WPWA!}9E}RdgdOP}_GYrqmUy{_cZZ5at3kADOWLbNJ8xUT5*%8ryI2RDZwl6+K z7K)$H{^>KyYXf+!-)7|bekE0xFJw4G3rCI}qSOXMo_@K2nm>Hvoo|;=u7o$Uh}9ww zztI%CZ7tL~Ht|crugDFFeA=U0I;&*LdXxO=qT?mVXuL&)^jVr29uMV%IrPY+6l}qGPn%%%4RK zJVh5HH1TNfZ|d+^&ZR6QvETnIlrOnNIz6Z?Gt<6I)JqEk8!_yVtC?t5O)>I>C4#HWVU)cNd*Pq{8J-3W$w@a#FwJ>Y%oR6 zPk>UJ4UL%xG&P^hB4@+y_!lTV(80$Scd+7B4Hxyw!UZ80D=5jrJ%ME`q%j)VpGIP-hx=Oi?N zq;^o!lR%s)Oh$WTA$#RKojUa5`2dkll75=OGs>j}2D*k%8af?x)t6rz>w#FaQo0;D zl%j)Hv)A+f(VT5ZY5Tik>Q6G^nprX=E9gv^<$#^K!QAOtFBbNC!$+qI9=GRno3-C5 zyxN3mEmxy;B@tx%;unp5`V_V_(=p3@;8Mkrz`DtW!pbn^)89 z5349oSMX>O{MeCUG0;m>q5qbgrGv8{u&FawllE5)A=ImkZaaZt`+SIWS2uthUgARf zH@Z4zIo;m#h#&sAgOC_RSBJR6$EXOm9+kjrP7-XB8M&8kWh-PkNu3(VPwOwF!&&(- zxpWcU>*DA}Whg3-M&ta&1&H-&;s0tb($C>D$WHw*W!-S6kTsE*?`_FK))t}Rho)2U=9PjL(}r_tI^^>w9Bb!)B#)Px{BgNA zN%X8>3;P0Sv2!E~4m2av4fEmId>LaM&QQ&{LA2zj4-4eSiq;&B<@&qm z(bg!MKCB%3l!mgu;^(Ns|2%d7s>k%nYngk^0gCNi$Cj2Hgt^!l<}_^}%9pCLm2SuB ztIijiJjWj8lRVhON5UTbGm+cwI!(@JRjF;*9cZ}6(JEesG>KT!YYT(QqCDQ}Uq@Z* z6Zs0YA#|zSkoMR5kHY?Dt4#5@EDru5Kn)yMx)^EYp$$6oVre* zqNc{@NG+3x=dF*ha8+V6eoJ8V8etDh5vNXX9~#@DN7X;VFmR6+&PjIgGRZ#lj{1#F zo*k4sFbmz^=R&dLI1=0wU|uiD)q77?iwbga&k}8Lcyl-SbU<7{1+Tz zm!i^;Ijjf&EU%D7u>?;oT?55wv)GP`M3TKXl@4c~rROyRDdy8lS~hn(998qNI`;!^ zP3$AnYwNIAF_SDzYM6!PDIrH+&C=ID#&5eGmg=<&33>PF@Esqr;IA2zWacg@a z@jHmE+K`M+)n?LhN`=SrBYgEmHC#DhNowgT7@2K}%iHA1S>W>)zmKLTsf-VaT~G0B zBK$8lK`#0o+t#s>-mzUMD`8|e;51X1HiR^dV4(_Kjgje!DBst z_*jH?D9YkVj29d?Y+?-ywqeWTFkY{_iN222VH&~XX{(40PkP-(O)baBSrkDJWkmcDVF#pky6%pCx3#GX$ z@nmfvpK0)yw8Of1sEQ6YOwgn$ma@p2JBr^kUPD7KWih89Z@S{slV4=`Kp4ufo~5Th3%O!HRuTzksYmfBEym2T0g>oNFp~&`Va%lWxk> zsV-HfpuP(uI*ZVFbsuh}mvLk5Wu*K;iz;ImAjip;Mz{?lxgo1?ds5xWTs@h>?87 z7p8~M{DT9@)V-B*ZD!Z1o+L!@seM zyA*JH^BcN-eH7hy6=RYM{e;=`HsbyKaJImlFa6_okv#7r3(4 z8bQCDMKd&4;mU((vJvt`H;0d8gO+_lIS(hZ+zQ$(wvT&lNx{FT#IIG%Bdukd-j3PV@;edUn(3Eyd<4 z;LO(JxGe0U{;E#YX8VzAxnG0v-Y#~bcRm89NwS}2zsPFI7-si*IaV7Qps4YS;HOyO zrqCVWzV|JEtuz#e?;a()>U`Qf+lGXu6x5G;#cvw9pz*UQl-}3S^~MN3>Ha9XmNk@# zTifAX+IqTP)r7~#G$_#iJwgh;@RPd_!87F>S9>=aI-^tYc~=3A{y3TcH!_VH`7ste zZ97GnJjcuSPc*;!2=CC|PdAEe(L1sSvXS}_j}#}zcmhKJJd>` ztF=?;Ol+rj<#ud&KBEoMQ)zWwypVV9g;;Yxo(2D=asLLx^4WM6G{Bt{uS}*dHsA5! zMmeGe*9&u=8WkplqDATswx8C(wvppme`!4ZS2qwE_s+ua;x%p+I1j6R^dO-%oyJc0 zhgH&Vs*N|M>SR&8tt#TnY~xToWgAq4cj)1dsq}061Tr%EC~%U)5vZ-qPnu|vWrQZp zv%gGdhi7p6Jpy|vHi)ioeJ@~V22z~J%g=-UvNiJ8OeOTTL zztOXJu$Cfj4sT-KF;nqdZ#g~lcc3^mU|K=VF$JUz#}ZyRFS ziQCi=zJt6ioKYE~LQZ1Yc(x@7qqZoKeQ^Sw{tP4i%5yl{-6!<%Nzm|~Tsl3NlR~Ks z)<63|HUSzKb61Yee16G#zWzb;l1cp5-C(po(_kk}RY>wy9iQB_m^$5BX{Njw8a>R} zz@@{WwEY1M_Ed+t=}1~=WPr;Gt}yv2f={Y_?DW{@R%yt!~t!qne&-HuT%BgmvE20NEKVWC~27%9u3lF&s)|Ar2uU50JUf42_lDaTQ|^A8#@ zJ0I%9PEpaxI|%;kOpY7tQ5XJ1c%EJ`ja*FoPQO9;?+!XKqm-K|I%29Bm_nJFm4w|y^ zba7H1bAmhX{Y;PTkK^e5B!tF)WjULsQO>)09Q8*j_N^~p*daRiqsX>gZIlXgKZXZrp!)9^a)I9mB|eD*VGsb zf0?oETe?Z_*aFsWQ$rFuPDr#gA;}}NxORFm^7M0Q)uIYYO|RtXD-`L(_$q$hzlg*) zm{ZczEl{a>!PkXX~oVRTyx+&SZ78s5g$MN8nl6V{M7@$V8KjANRoEDHM9TFOy4wS^KIwj;9H@< zMvctF%F!z*f9MvPH75Yl9WP<>EdXvN<7$R5;}T+4(+ep1@H8=5PRXv=A;O`>e3)~?Co4+ z+nnNRSC^5z*KfGrZG_J8NpyVXb@JGz%ZJoNP^|cF6ge-WcZc^P({v*}{aeFr3-2Ki zQ+ahkq|kje8l$%epSR};)YQHlkt;-yWc7+J792%Fz;gOwdK8&e=6Jg7IxkF$CyBVn zTn^=Au*`-ftk{au83L=ayAg&mmDKclGh{o)k$9^<{KPZaIE6HLzkSS9uivMUNi!%x zy95))jiUqcU#QPzGxVB#vB2wu;BQLO@Tu;6!^k93tlSRyC$FHqV+$AU@F3-FpLq8{ zS1e3iKu3O@ra@QMBVhRz*lh@<=6RtsMD-?_3VZLKyFFyN=rApA=tsr9MHD^3oT&;7 zyH)l7_vhsZn9{~H49(D&b`b-!6zOZ6Ew@eYr;;UBXxK4}Hcfm<`UM`C`E>{-r}sc+ z*KssuPoszNcKr92I(o3)fgagy!jAT#T=Rg?Ps6rgR@eY~vVT8L4SPew6NDU6pU}?q zcRzNV4@LIyGMb>5NOe&|_`5(=ls1FSH?V^314r)BCqa|9Z)D>tPLXWIa6U$T4(^`c ziz=0mq&PK}$Gw~ZBN+!|*ABsN&*L!sPn}i{Tf@zSe7jh@0{iURNIxa5*;tKg68$g? zC%d$1nBXUN=R82ogC%GlahlkFk8mPoHWn@1!A2(6q9RR;tzUi=*+)YtLt-q#ay22| z7z3Zzzp&h-l`glRWI6_|WZd_fP0zi6$xq!WG_0Sjw(Mdvg}%98f{thx)dC$`fsqJ% zCwPd%+2q;(a81eswmYZ6Yh)G6^L~NGw+H$9?cWgVDg%WCSJ-@e55uo}$xZ4P7jGR$ zlXFD*fCruQ=8`6#u4{~>Z*Jt9cL43DD=`0n2E7ZY_&TZZV zN`y|F7W`X!m)&yppwl9rY`4j2lDbsPHqQP>nk~|7-l#U3C4Ud!ssm_%LnSY5e+(VL zw+~hMLPd2N5cx2SPRz^XYuhTQrD7_nX{aM%_XdcozJ~tI3FH>vO<&f1jb{GuLIBQvR3YOpgRpP=0lu#LJX{r{`3n&nGCHSEpGU@H{`+2@ z`O=2ggnr^nLhq98OJ_cE>`nS|SBdWJ3qjv-cWigHrM_i1=%LI9$chMgf7{P=A?z{V zbwir|2=B1W{lk#SxAOS|4amRtHsv^kk*cQ*Kk}fL&fI#+kLAom=+_Ji-Leid{m!r{ zFQVw7^>n^wggvym_9 z9SZr>6->&@i0b#pvkmWV%hQlQgRyn?M*MiT z6}y{L*rdECDC#!GKFNFvGJcG3kqCG$+(rh@eyE-&#Y9i7r!_%cIHtLclE>es3^iGD zo0mxc>Ak`v=E8Jm7*n1|EQ-Pfo$R0zzwfOCJ?|mRA?7V+JblkHI^*zL&@=WvA{u1- zj2}9fMgHHr5guCyE5*?~r2Qd@i4_W@)+d^%BrY6PU5KV-FS%0CMy!5Q$($7|F>FvF zI@9&=AbA$c3Jb&T`zN`7>Le0b`H#O+7(s>OWf_))!!^K*p4#@(iQ|j7lCdaV*jrCA zEBvTX$b@+5*gD94pK$W*cPcm@ z!OXNmur4_fMXSf+o#bsu4lfkCPO5RLA(GU7r3=p>9a5X384QGc*US0n{3U|F65(`Z zeH|`W1o6I>2{h|cA5ye((J@!ZMw~b-&@9=(v(zcEr-d(n-v-wu@w!*7JGF zEm)P~#?MMvq1N;mUO%d)BjZE(;X(bh-$e=&Uah26_49da_CnzX;{&eYRuA#*CNR6v zMrUN#L-mUw4+Ivt9Z=}ISl;V!~fkH zF7!Q2;y-^u=q(ZF{q?<6?{S1MTU78TvY4e^BsRRT;7uCIsQE^$R_il@y(8iNq>$EJ z)8wL&hBPWx*jpWK=GBW0F7}H z<>w;o;WJP0RGpmZjGG+KJ>N@huZ7!NW#^%7FHM~vuTyJJ3znuxVcRb?SZ=e0k?${N z(J-8*o2sDqc_LnEjNuO_3-hF#E^S$%1Zf*fK5@culze%`e?^xHS+DO@bwq;f7d?lh zeh*p?`!ZV@6M9yz!Oia-quXy!urs6Vs9Yt47o@)>H>Wd*To{Wg^`%@YRFgtg*YHe> zc8ok~iBBcMXVGyqe7xl0q5cK2O_xwLZWwt?+k@xTK~!9K4SNIZ_~Tb^vGPMN>)(3^ zEw7yMIj|dfp6i6};vv*AQICDMItu^L)>q^#eC5T=axw5*1Ix_y4 z!14>vVC3NS5Pudzo)0fENi8KBzu$$WyqXXD{%X1yoP_So3q0Cr1-0lo@a;!*Xv!)f z?|Lf`V$Ngv%95>UW$xr6?DHPY#uQQ{^tWD#=gzml`en!j_ z8EMD)@}4vFO?ZdvkL`i#A}z%H5~ZoyT5NmS8afnKNut}tvEqaQ9L+YPHf;*jgI2&b zGLXAjrjq63mHdy6JBGZ@WMVn?)INR)zwzuH{nr#sPOHA-lg&70@pc+M-ha&MN_}CT zH3T6B&ndIQivRsL3(gx{S^vE&I9q!K*MyvsX3j=7rnCs5Q+Bf#4Aizm1&JChbh%0J zWaP%u-}mF0fxu~-`aL3pM<1|irX*YY(}>D)dSOsq4Y4WFY^jbJr5EYol+ahZ`PwgP zuGAu(u`9V*QIT-_xs+eKx`&RO>0xfR+F0;?C=03&#=h$=%unUM&|~nNn`JLUWp@LU z)D@$c3MD$V%Z6T$sKT+;uHa?a1M9XrIEaoNva#0Da8G zOX#2a#xKtoa+cG6(Zhnj0za!sPL}4l`BaaGsn17w+XK=l{zdCms`&T^-c;}E{I`x1Z`ZX5GU-t2Jv+vzr1g4d%3J^XL5&;xvs zGa>&Su3*gOJ$eGGy~Nv6B53^euT&O%n=0*z`(3i79Q~Daye*r`KLWKUUt++XA(%MK zjWjMX>L1ew#rR2lSYQ?H7^TT)Y>Fm{Iz9e+=th(lyYn!m$E5Jjhwn@_5&o8|s93p` zuBShund}Go+`YwzJFUX^{XfwXT7XiA1}dL4ohnO*)0mGANWb)mdMXc)e(o4 z?zuwq7O6t&ga-vLeMXJ5!`PcIhSdK;;C)Bjgy;w_J~E;bdD7}w=U#!8yI-+|p(+^o zQHnRp=nKtqwOn<`GguWz@|PB`@cT~>4*fBvk3Cjo?PE+ezca6;gHl?NH zpm&8kC0vrD`uC3LvR%&mwrs}hI$Q7)`9klG26Ucgpwv!-_IO-De3Uagu;~-LF8^XX zOGi?nbrboDuBS_rZMpx?Dxr_*GUB7hAh$spe`TYv+hh{;qzL`B8RgJ8ehx+19@OwP zoW$L>u_plosr~e7(hyaKYfU`Yt>`EHS4+sjk)WnpMn1mMXgfKFm8ecdw)%K>_@xbI z%{xTte%poq^3{CtuMYg4w~en>>coJJ0@s&jg_8@L{|_(u{zK-ejaOl(po{CmA>(W_lqOo~)-4SzUz9BVeH!Ovkmu z*`^;iAl>|#tKGJMo`njz{;s3P{(3a4UxQ8+zon|Hg*4xHJI@&%K*`=W@HF!zf|aw8 zI=l=9ndgPh9~IiCd62D$nL~}WhxodoUD&*CF#By31U;28EXvXj_jUjB4zCs=pQXrl zui6P)=gsWwa~ZfsM6=J^^5~74IuABEi9EKNDCRsIC$^&Ed^oNp5!oC{f#?J&KGdy; zrsYTAL`yh%>KkF<>jJcWoy;d{U&Gj8KUuQw1DbsJ6uw{egI%#5-^)d?G0TzrI&Q=b zcL^F3{)hfFijbMZE?W6;1si7l2{Aj2Sf$57!FL5;F>VEVvLd)|h%SX03z-Pz7{n9^ zSp|b&bnf{_`m@XEwovU6IR87vOWuWeauHqH^#<-CesDhYfoGg{fv@6Q95NXNHy0UZ z^Kd1l{g%eSZ~B72dVw|Gt5q5CHU7WT!#Q#~Qk#$xE>#DWFHr-fM21;OP;7NKO z@D_G;m(kJOjJ>Of1bxl)ai8Xs>~ zLtg$KWNf?`BTg^J;eC1N8m-O)zbn(rt0Am7(m>#q4e7rF)-zfyzt0WPL?iaNvMnR9js5|0dHentoBqt!Il=Q4y!3ePZKp;t6j+L+Xh_F_xA zGX89DrG%%0g_ApP=oKHwlRov+q%#gQblY^w33$pk_pCt8fg|)XY$iSaI-Z@MeTOdE zTw(LJr(?kCb9`&GJsqkz$TjwVL!jkSdf!z=Q8y~6e#c|Vv9#kGOSNz!dk;J95K2dn zeJ00I5j4NgkV3W&q_S<1Bq#L;a|Ms5tYibtFaF4r?R#NpV1$CNLNCOJ&CI>y7oC+U zq6O2k>DNqIo^F(dD6eRCD>jhoJj(ga1FJEmUJeQaY%t(V7m2mKB9W9xCj06)l4i&8 zpP?1BB;Ym~b?v6Jn#*{fsszcnCJCN^DO`>1d78~xOnGjPnv=EBr1!$5)GP%GsvGcIlUs_>TsG-}S`l zXdhZqE%;@dyqGUUuuQawJSB_aKSGA0O)pTbouGlv4}(5m%@0~!AlI!6|3}-KN7eMk z@89>m=Xom?Wmb|QDWObFs!!%j5m6#T3Jofarizf1icBezD2hmfObHbk%A7QcL}Up2 ze$MmHv!1_xzu#Kl^*jHbz0X-^?RECO@Aq|GuM4f8n~K&JK81634+WEu3;IvE1|I(z z0829VqsEavl?aMI&GDKN(>(z6w=9EEDJ#K= zs$NRr$tS2skp)m58G{A$uY<3po#;?l9Beyz5;eO$hn7)cpd_IVnt~Ci@6cjs8T}dL z+%5ns-akX($G^k(Ig`MN5BuOHm2cfPc`+QYN)znYPFG@7Y_BESL117!35H$^Mi#!! z$R(o;#XftD@{aUG+SXe@&50KXGn|6f%|4)v+2xL$R<@|JfU2IQs}N+hlpTKnxrU7fy>58HAt#rCyGMU3y(0=yrE#v}l0F=b2>1vW zU1>)zA4BA+3-vD6d~E|8x=YalRrYSx1QWFV{1GL z7m(?*F6B(M8@O&i9t>8ohFkYffCbZv!L@w{6-(Q2l=>hZT}ZkPqFWv)Y5BWAYSU#@+C(Xf%2aFI^sS&-vZEI3~=x+r}I}R&L+`~cYhC%4_i%zt?;FfB} zd<+dsd9!|Akq05h(4~0|lB~LLoC2z&|SAsJnFsI^3R*-h}N`rd7BjtM~xq zZkB;&tNdPmDUGOogrwN+;*nPOSGZ(LEUNtd4LsGEghuCIfTMd|M-Nnbp5e4-s&!Ib z=}K!x1?&9KJl*3!Q0e<~22TM!oU+mRRSUpg@fb!?ZL`D z%fYNf5&ZGo4D%<1BB;L}?JcfGOiC!+l(qx~sThHg9qZ8yqhBDcu>+`W;J~7T(^2im z4v=xYH!@0Ek36f3z=sxhrLStvldZcOdH0@*Fx$(((_=31Xs5way>|5G%I8KvvjW0bM}o`O<0fJ#OI(V`z%d0__{Q5%LX?%als%}!A1B1521rHQ5t z_J-|ia?qR|8_>S&|G@mFOUl~3J;3spj6Uq{0lI90m6t(Jk;U?t@Y&8?C^mmC8r_!% z-+lJN>YN$q=;cIotqDizM>oKh;usKczXZKpXNjhMv`}1i&Y?mh9@eU>GTieQt9qv* zz_LxMeaY5G$W5N7uzia_2b&HiRjTIBX)DlGbyX%MKL&VB3`9ifACUR@3mS56sgm%d z3*}jvf`6hfD9EmYK1ByrywLMtgo^3EX#FN&syhQ%YbT&L1dWou`k<2PRs~4aQ|F^4*Cs1Av3rsD{WNm- zDFb)C)6fkSr!l1C2lSq*1+b5!;L}N-VD0d=P-;#FG`St@U2_;c!zr-6@g&My*%!71 zFF;jN9sK9o4D^!^!WFwz>s+Nu(@xGq)XrVtnC%|4>EvN_>DxKfr`Q+8j(UxrMb@LR zezu@!#4gxr#{%aHgj&wVgI;Dm6|>NzXms97G&}zv(tmngmG=t)u1S4CR6+@;{5@1L zb&W<(M@A!?>h0+7wqEE}ga#^8&7aq=;#EHG18@qx5?%hZOzEqm@+@kpyrCYm!Tr)E zSbm`v472=>s;lC7}T<~8``M+fSL(k!CBk6C`i2pE%m{{)hW%O{+^RcvpfuQ@&CG;R|By<|62T~7dpy0nU&~BKc;ympGYFhW;;mVn+ZY(3f zY}pGUdgUt>Lwh1(V?WeOZx4Fh=BJD`u|PptYtV^T%Yf5dNog5Qf>SZ!%0gAo)V4|1 z%7gxfXw>a3@b}o0C^~kvQv28kw9qG%%;e!{gW(UbZ+jHlZeM})-tz$T?L_svpP`?l zo-1AW6|nyAG+3oG8dZ+_fu5A04jP$z_7P33YemR+x6F!;JvDj zf(66S`wdsXvz8=PPZEtj?@j>L@q^HSAA3>tUO%*E;{dQI^&FU2+pHLENCJlXrf`R0 z1=t3`AqBetqJ zJwmMxhESvDQ{;MQqT>2z5YWHt04>k`ME-tes8LNFOxe8}{%A@^-#6b=77jd)yaw-r z3!Yp9+>IN`mYb^I_t^uTe3=E-zet70&JG3_j8fp`MjkOoR7K^}T|m_e1ScHU1;V$h zijBWDYHkV!_lA3e$i`gd+WO6CLeIl!Zsru^6YC2*ZkwR*iY(7eij8~SoIsmT* zQ|08{n3k^zgZk;Bul;Fd!OI#%&rehw`}m_1$CDN7-fvI? zHwo^I@&J#D6QO_JQm{iS8U?EOyqa5QEBUMyc$t<7e#Dm{PyPLHR!$|VA-ff$Mg35^ zQ3V2Tfa{ovNXzVMtQiSFi^q9OAifU_I30Z%Lew%_|e|Lse` zpyV91=a47*6E#9{+D)Lcws<8ddA`a+lmd^k+Tg!+YRdXU02Mb~12>opDEnYF_`Izj z_)rrDC%^Xq=4k{h+b{+h&YlH*A9Ls>tBsDul%Xec3za!L=YgYJo8h;ek;ovr2bk$O z8(mqj6ke>j57O-8QL=3bI5(yUc0WFco^)=4ix=x4OY04aU-EE}Ipkf~DP~VcO*zXo%51Wqxu0#F8Bj0zifAa9k2c-hDbc+&I^m{s&uG1u4&z8^4x zRV&AUP|pOV&#jpt`JXeSWA~#mLk57sDqWJkvl$#JdIFL({FE*$Q*`N{H#E9f4N~3J zR1B5-AT;kU3?3JT;>@pu@z;U?_iZ<*RQUlzk9<`UjufDVo<%5R*g!O3aFwEFJ`YrA z4MD?QSAYPIs}L{g3%uvPMCBEw=w94r;9qe7>=?KLmfj2k>r#Kg_C+Bo27?Z$%yLG* zMn8vphcu%QmCy3nnf|EemnPU)NTcaHJJ7U-Z>T%o4%7sm1Q~1|(mJLNUe2tBZeEV) z`=C5zZfdT|DL+QP?W@tg%+KIh@gbD0tX5VGlEB^>&1h4MDUv5V1!rpSp8-{>5)#=iVvc%eE5eor3_-H~@z{4np+MZD3#b ze6+XxAz+uULHze@5ZM|AGGMUMQlEkUu3~IWemoMeR8YK3;7EIb(M#b0*A0$@eg5 zaeFWz`(FiF7Y>7UzKJ5>d;7^zhHfsIl5<{(jJ@oprIYT zU{cT+bSUu`;M%g$<{yMo-lY$0Q#)ag+(fX+Y#YcLuvXRivK|=^UkCoEI8e4O2Z4sU z0@AfN0OulSR6*PU2G3M;Ue_IH(e6u1Rc1UnqrnC(((*W-#TKq+&>_hQUA6Q2oRu$kToT z`f4-?n)rVLuP$0B-<|V-?#)_MY-56YMQsIZiie;A^P50-N(*}ZYdsKJazX5zC2+gT zDztwn22pn|Ak{u8F#|_|iXwfb%hwcL-{hcNUvG=FY`b8u2f5&^`&nT1YXcav{t&WM z>BC^r6lHP3esq26JNR|zSTO8CJBkatiQWwVhqT?3fZM-1IL+4>Q91vii5DJ#kSo7o zW1~CRDm+xql-@!W7kVhkZCPOE5EY9uFbeIv*#HOBOaRXcLs9FfNvOncxRR9H6OEbD zu2iVHxo);j0_O%FMa4a?Dy#A3XzvF-WtcXPG;f^-o4X8w&9j5(xS);-(;MIkZ4wBx zZov_E>cQxJ!<5@8lTh7Vbr=_Y1pM{SRN~%$1|7XTf!F0C)V$GHaX8zKTCOypIj=Rq zP0w%`uHu-CGQ9&IXX&9uxHB?K+6z?CUNn4GIZ*8E;P=oopknH77*cBoJgmzVHPc4m z|2kHA@GBUYsb`~WN$F@z>mzugQKdci(}q(^EdIZa_WxCX`TzgD|F>iOfBJfOA$Z!e z8sGBsT!wD#^D!U(B_2^!=!iwI7T>Nrn*Ydbf<_6T2C57{)OOh{bV&6}S&A~{ap%N0Z(Bri=`K^`0ROsEgZmY&!4Bcpmb1Ebq( zg{fv0m^oQ5FH;_H&ZmtD8~G-im*Iyey4WyJf}^N~PM=vP`*zYN&W^|}doSmz`hJKl z*QJ@StH8O91elYKFiq`&%Z)>W>>{lBJ8e2z^2g3g&e&0S!AMtbH zwO=59V6&z;{I?r+Fffx2Ht$W}E-jRrZ8QXj6Yrq#;+#}+T!SAQl*GJ_?+dRL%m6cY zY$WoY{b3&t{>$I%T||5{@6BcgZ6-&tm*mY$zDibe26MiS)9B!U+fwcCEpy&|baj)&Khqk-+gsL9?O9sFDm7AE z#xE2S=G2g{ofBY>-#zG6y$4Gl_oPVoM%)m_&Wd9kGrI{dqo?e1Rh~SiZ#NU-9?M@{ z$*@C1_b|;VW$k_OQR#W7iz+802>G?~Sn#(7;#HZBHq?4=Am z=eHuB`0);}U$PRPIjb+DyIGyz?AjujTPHEU-+9ZkRXr{_y9|lTb~cQ1#g0ie-^-N^ zI7z+e96$^yD(6gw`qCNipHfB^6~x+Z+sc;_`H^-r_iKVth_|e6S2Yyig#EMvmmLpwYy; zMZKtGu#O1yjo_>eKI7eu$yoKh8TjWsWAV}~KlYKZin>?T&1Jidhk0@3-0qFunAglm zDejUkS6;h=3(sA{oYmgPeAv^1KaE@r47^-{5j2qV955Kx9tu-(bom{Ys(Z)Og&=`T z;lE$}EUYJAaLfD^dTgHp@yJ+Be(EV5&ToM>(24)fb?DT~dTwjzu#N(H()s?P<{p{3 zvpk3UR3Apv2m45os*HdCzGe8sfhJ7m-zV(t$vcGyI@LnI@W-s>et(D=FwEM`gT!(( z1Kv^ngk0vBBA!TkEOIIi`N(^l#WDNW6Cp*Wq?zvpw&;b#%++@x0?t**Yb!d*<+K+@E8m$1+2 z48F;$o1Axgp!_h(Su!@%B#rN{k;-pe!?yOE!A~}k_#xTPXwSv{Ik6}hKm9aY&=Q<$018^U8fRrvvic~CfwvNpEI1~Ld2EFco+83ApE$Yl zxeqaPFi&0@@Dw|+d%Zj$*b{rWl!jx7UihHGd_L&q3haDbf;7X-Q2cLp2Yd932fcCV zAqJ{>@`*N!V25&#TK(%A*E>!h+{W#&kh$8paqt^9)Au=(aIOVTSp8eFn|?}eHo8FW z{o_q#XB)6jF3zVtHw>rGt*{3A7rZ%#&=eYj^Kt)m>bSl6T3OHAgI)e~Ev9C(N$$H- z5N~wLFv)ZreJjG7y5K6nN7Dw#KV^HyGHNMI_XrR^JaeSpYHbp=qkA$Fhd2pp)8ldP z?}Oxa=9`r4mP#M_Fkf9se-8p*9~hvqSoOaj4j^w1pXZ zI2S+hausKLaTYVK{D|n+ep85OuV+j#@4lVq>FTGIi((F@UWgjw7Dh-Fvsx+HC?>1dPN76}`iBqb#MJd%gLo zzMJKf!`IU(d<+I_z%nela<8a|!#7D;P za6ED7hBbR)x*qm$1tza<8HDfqai0nZZNkPAv*CaDI(efNm0V)n7-8ek{&dxhSMdGk z)BKxfZ{c2*)|16V(o4o|<~e0G*lFG$?(=8mC*3Q>R~>6%%{ede%C2aM-F8M=^kymU z5bnkJr&sdP`=hW2Zz}QW2g4Yc;RP$t9*|CYFJO~?4G=vq-e)ZQ>ja-eW_;;CFQR|@ z8R`43JH+oWh4}V~WKy!PVyFBJ*yqerY{rbI%m*`b?8uKS!8Fcao;ZCUZFlA-6&qPC zoJ~lj-R!Mp=fRJpt1Bn5ou^NTy|=6r?hL2k_s_dIet0EhZOr|1hMDXB|bLB7@v_k4Y(%wi+!(K^O2gavWKG1_Iv0joF6@% zUYl3MU448H_ym5Wch)`SuT1M=_04`V34aU35Bu6Fzq~VYZb=Te>VXNoIwVN4K;s1E z@jSf!<#^_MhzBTfE0YN91J-`Egk0^gP+I#YKy>UC$*);4iqI0~uy&93f`4gdc*tc( z-V-flLLF`k>82s1=j5*#sWw_}n>&s<6JJ3Ln|e#w_`U~&&6KGa$4Y$M{9Rn|gCatG zQ#A*&UvlYo%PG*5$mO282zQ$3GPB=X5Vtz(x#x*%so!g@C=+>};I!@`{pf%!*u2nW z$`-7{^ClmX-&U71vBp2;*7|oCcfpXIJ|SA9%p16^EnS#b=~(R5@CX`rc6CODp>p&L)lDw2Yy*>k_Oduf+TN&itAkm z!YiG)!Z{RqiqeyJl>L+TTT{GNP&J`(p$%rm-^3%AR}11#Uu?mrBbcT8Qu_TYf_|?# zn%&|q6CciA76S{-aQi_$so{MbU_)`Uyxv8fTN`-|E>e0cT`-q!XE8kaPX?jPoZ z5+4J}*rE|wC6AHrT_nZie_KWVPB+CCW=nGeUkiN>xq%c%MC_aq3br0&S+{BH@EPxY zF}sl+aO$OvfK7!AwxnCCo7ODdy84Ar9%YO3VW%0tE#24v&p3Fi@`oI#6DVrmYoeP* zu3^%|LE_OKHw5=cGdX8>ws1G~4Vkw61NnXYK5=x9ELt&nM9K;ONyd4jxw)%zaxrZwLdWI_8yMmiHY&<>Z!U_CEsVzT2 zZ4j{~YX#0MpD!hP&E%ur?ZG}CIxdHNUd^pRo#fDoo5;zIR?ND2{p3-b^gzmGUFOrC zC*Y{(ZT4yHN$#NLE8*AS$(ZSq@yyS_7nCEP1!Ue)$a`%-%qrC5!d!QfTh`#zS5II3 zZo_P0O_RMqM()52KqYRjU4V!DH-Vs>Svac{5xonZ;)j!Ga9fUBOOFDhxHZl_SaL)u zfzpnG{COU5s9`EBrX9tsz5(2C#-3kmfny#M^Lb4li5P5RL=Qet#$L8ffX$0ev(%68 z!s&4dq`|34WUu-Ldgh_&lxY{u6|B7^*dIN{ep~ZLXeqnF?R_B1r}E6m@ciMjf5C40 z>(mA0o_Q{e{+1NBHwfXAdK*a%FaMMFoI8&T!X46U=q}J}^?CZlUmw`C){->JxG3b= zj>W%Pe? z@aJ7OxZb`4d6%W(oVY^(8qrHR-*5Wli@Ive@5)^aPFlfSEV+-_O(mp;t_9%Q{0?HG ze3M$9S0-6OS0T+rM;`xuKK^^)SWeIG93Mwz622Dy347xP6QRBn$RUybOuzf#@{9}T z#c}vJ;cDt4_@co~F598c{VQZ_&$@QPew3-;XE$1@!*Cm=>AK;2*_ZlbE z4qnSnc|DL{x6uy60(H2lm>%go=d`dbDNbDBsfXodZV|CK8#vOsneF*?w?vLGBKz!( z7G7BWllO1VCx2^oi3YQWkp+L%37-Q|+}^%k+_3y);2b#zlt0Om?*y4~7n*7XT~iru z)13#ckE=Rc?>pgFW=|z-gX5S!Q^VL0y~VPjrY3V5tl;K9hLnNzVc_>9g(Sz7!f_AG z!HO{p=@AWn;(tqO`PM_Gg0o{dbne?IhYz0zuh%TXtJ*J0!Mj)Uch9{N)2zyI`AP;e z!y**BuB$Ek2F8k0Hst~=h+yBZ&f&b0@<2v{12OXHHh{Ix7uQ#`2;$iVoZVMnkQi)F zC5*i!%}_=$wreo%!H5IgHpeSmwRSkY*n0=#`n^Cph|6gCq?)NJLdqiu;_jSQBw zpX0;sh~zw1bxc<+3ajiDg$2D(<+iq8kn1ccX+7yoSgm_QOm}tR#=TGHnWC4f{;yg_ zJL*4STA(c-`+F(|T~f(4 zRB}*fUxEsM$?a-wXU5jQ7vuW7!GcZcjP2o9a&?dKVAg-`Zr5jpE9^H$%fh5nr~z44yBIBt!1TNxw~XM2-Ee z;5=hWE!nUf^wD(_cmL~R7piz1HhpE7y807WyEh&L>GZ=_oOus-v{zDp@;RBSNrrP; zSmqTQ3*A>hYW2Bh;=x)L)2hsoLgP%i8G-k(7Ox$tdmw+;4LE+&e% z%lwM|PO7r07NIuk0Qu#XE!D?8PfpnJlTO+PIrZS1BsH`@`)<`H*n9n2dcrkZp@qNA z?8pzn+)ZRo1y`qkJh}_3)i25e%5N~`Z)VY25wY^o;d=-duLIIyrHnY}RZQaJ8;I$- zWkdxT2bO*$#fP2exW2w_;vIMlY!>RU5&dJp;9e9SnV%~+T3GRePGYR<6Mg1q%W7%i zqhI*05B~7NkU7-HRe`Yj{90VC`=;c)D~Fr=u_s=1;1}S@^J2o?i=@V<8PtEDe&J2~ zd2vyXUtD35Ia6;_B55{%V`aCa+>_{0!sqAb=rnaRm}Qhg7!x&u$tyc%{oXzFsqkLF zvFIuH{*gV1ZmMR|Vl?@04ME~rmvkyPI!lNTKBUSuo|LWI?1lRmv+0fvBVa~;0$elH zijB|Gl^vgak^B72fiqHD=_2(zpjYV)swsCkXtP-Xr&x^USFI_ezc0SX=BoM;nXS#( zqrQpkIHn)>Wb8nxpUyIV?SN-wW&1d8mg<>qP3LDWqdA4jc-AVum}x? zOHrqXLeGLxV&Nu#rmpt6^zc4|Pq7Q24SUXE;~(r6M#iKI-(M9=oO2MkU%L)lIcF31 zBJGe|QTLR6$kzaBiw)=N+)S1)e5G3Fj>56ki^w;%2Ve%$#n04)U@bQcVft5dZ0TP= zY2tKGqH0M8f6`vSMnu}k|AnP;%SV|~_w>W$Omi8(qZR?aeo3M3Ogqn62IPW!=T~z& z{-@Y+jys8Uqtl2*bJg*`%^T@D%~=e&Xgb~ZTCk|zBL^Sc5y6>G*uhurJi-u`r-%|; zTVZ|JSnxyb7<*dtAoPm=2EBDmiC>e0=?V@3~xKJs7fo8Etandmzp*gXO)$-Mq#Um9rH*1uR+%JGv)FCmInig>AhCbP0$#nngYRv7kF0wf@Ip32#f5OrChaAJ3M`E9;Juee7T0>h1xA z(T^$QQfehPSu=u|(HO`kd|ic|$h{1l6HVj-y>-NwnK&KTag49rKSr8)lgA1VW%I6s zFklz-fr|ES=3)v*f|BWbiKk|>@Zii5v~w#imxpCbBV!`uPY14%{}x%(C4Y_x8Eu(T zP^JyDzvLktf9U}*IQ@l=J(og`?lNM2)#VXm=oduY+TQTy^=a~^vj@rMoBLTaLx~>K z>jV(sdojuSJ?3`UR|x5+fv;5e;nYI%so7JbeV%x!>5Me0Dw})U zVuV{2w%~fllEs*mec)7(0xsUU&U#wEBfA@qVf~iq5OFpEbceVE!W>8W>&hE^LDEoy zoj6}S!Y1SS!*1Zc>zt)Bjf+_DZb+zxMEt-V%h|u2gIMt52I%r+d5`4P^u~XO=(a!8 z@c5Z`>Gtn3Q*x$TO3=E>+c+$x#|_Zp{@xrUe7=5waKQs4H;*?!d-p2pG#iO$rASiy z_`#t3U^Euhl|URBe1f{7bx25j`x@)LqFx*vttoEUNpZaje4)PYJ1%H_q^5k30T{a>~bVDd3CEPWA|6Zn#eiqn@r zmIsl`TRxNfZ)$PJ}bPF&Fm<>bDrK#D5-mH*pdFeex{sSGgtk^VJgh%h_Lh&A#yq_W z!<-uNQpr(1wNE4$cVvp4_l$^v8X9m0U5w8PSi@hr>PDvZ>>)NanP3(zwfKY1E7XZ* zEB?!)VnWZwQg9j_0F#O}*+a)M%1G(OZM=4hV#4a^BsDkUO8#+XhWc|tZ)hPlF*$-% zzSV#+*J&&!-G_~T-9dj|zL%Doy0E73zEr;(BC|w~rjt)OQzcdu(7l$$PME)tii#=& zy|~v{hpfmGW*DF-Ha+ z0SoA6++pPcs`Tw1F5z4}oAc@s;T-)GySAp3;PaEoe>&k3zh%CVqyCUvIcO1US@MTC zckVldr+GPa+e1C^Ag#jmro6Ezx3@Qq_%%fE)$;$tq^;Bch{+vXVr z*UoLl((mjC?Q_++5mr9b+ZHe0zTZHYw6a;QP-%y5H`3`Bvls9WZ(S3uE&N$-Xdpgi zO0wjWyo34Laf{o(@QXaLO_E*ayn#1;ytuVi*4RputFX!PG7WpK;VO6L!P@D5Trk&@ zWkQEzk)}Pld!O5h%+^FWY_%c(y~-HmrtD@`YrdufTY|{_aU`!e$arjMxUjY#&uxe} zDwe(GiGz>YY5ewPvDU?k8n1VqPuk=xFSoPA9u3VAHis4P=3Z*d_4Z4|*#`{0VbOCq zXWBkF_VX_=xWUF=mL-*{=tCh2Rz2+5vtIR8{g98^T!ikc(B zh4Z9v2N^^~ucgl?`;eE@GsMkxr=(p&j;gMgAjLF%lMcJ86 zcJ&*{=z^vADb|2+3i!ueF4Dw$TI+BN>I$$D{b|&tTMxx&Q&s=dW3vS;{{YvE+9$m0 zzAsF;*TA^m&m{|rzVhEDx^en?Rm32+k-2l<1N+jtnRoHBW!&pW^7k`G;t#Xp^b*AU1pwW%zTj?5r6npCC)A;V}i`?Fnl+t;RA=-=vH48JkHDeyj3ht`1->A6J=d zRt{hfIjjT&WD-s~A3&T;`a%@jAL4oj{F{9ZF@S3X+1BBo>pBzX>y}Hi9QdjhaHpVb+9l)&?%wnI&XTTTH^DPu%^H7nxfl7|4En zi)r|0VaXVQAc7Ld)7krt|_4-}|e?NXL#McfW#^1Qgy>n=So}Y)% z-2q7yJx!gq&ZfnevH75Gu7h}F{}SdqrNvAdWyqd5RLZS4>SWIx8Y(-zTr3Ct91QoD zQgV^WSng5DJHhj-A-0=11;56e=V!b!mZUENHfY!`$rM~*b>39d5kG#(R{MubEs0Is z`0{irZ({`2Bc~@l{gH<>qj|Pao5xCXU08nK1RefU;Uc}P~B;3a`pRc4XruQdL5FeZAD_w zqIrzrS5?**+X2QNh$8H5wo#A#8st9<&7j`O)r_M4lF#)%K)Tx$^4rWaLGVeI?qc?@(}6)#GsPNShQf z{~QsrBNa}#umm4w)rZgRoX9LT@RPqjx=hCO)T6GOO$NNMjq%ak1G%OIJ~qgTFjn)>FZ9=V5ltZ@js1Ux@-U!#;7_G=R5>Hh9kJFfO6TQs~zhq z(WTz6O@vo}tdnM+{Y%`MX)N`hsU^Ny=1rMxdoPz|^d^RkOq9kOjRMrXB+|1B%1fhg zvfDbEu-Qs8iBd3WTK$c{w*QbD)z1sD?}szil0JM~*AE_8lffEaAjQ~}eUwexc9{4# z2lLQm_~?)-df7TV{&O=$(i00rsP_Z=wbKmOzI0F8zkdVcZ1X_AQ+-hU9XW@u>F=fD zEH%;m*#or8fv@DIRl$^JuQF*t(jYGOraG_xe%zEj9r^&vZ^*D>$ObYq0iWN?~O!|V;gNg$(x&bp@ehoVIbacxdX}{=iQq3^jbeuUmnc-}y7J{4cM(1IO_Q*+(ae=718Rij zR&h_?hkQxb8g6T$7dcn&EB?G{7Oa~C;i-Cam{z@wvsAmvXXxZ`H;NRnc&jdRaHv05 zGvf?B@7@$RWXM9XMX6Qw1INMBs(s1s2R!{MsYpEdB%S`7vy~_`7U(IHe^PGiUPyZ1 zwnNu7f9a~)qj>7%RiyQgm152#C;9I9cX(&fd+J1hDb>9C99{FP}3!Z~GVJi{3iRX zlzTHEgGzXQ85qT?OO>6Isp#G*)WOx|l%cN+=J5A8xgo!k{GC`O1)uE6%nhoNj{P@^ zU3F^%<{`hubV4=hIE{vd?wi>|1gvZ?Wiao-nkHgsNlo9ZY%S&)lvl|#! z+Hn`(IN|$z6(*!QfY>VjWw}|XQ7U3O$enI~xY2JnNR4~8%9m#Ha@Wv7qV4QE)ZO`u@Hy(1pl6r?zI&Aqo|Rhy z|7_eSdhUwnY|CTm(|VoQ^l7`Ox33B??dQehu?f@Z)0XKV#w}hBD|;;ae`>&| zISdo7H+S);hF{}n4c3-tuH8pI*)^L!KXwzl>c2Lr{_X-YJxG%|%Ee<*DLgFwG@6SV z1?2Y&-%_461?)#6Lb9DbiHl||*_V5l5m#JFXNf^#JeLPXqP{o6S$0-pyLidr~6~u z^8-bxNMD>y4dRxK{Y5k->f<{5+{B255_z%qIrBI$m)Ke9$DNom5Zk!o4U9Z+3R^m6 zmu%(ujNHFe=C;LurndjF;%)AarX5{$rNgI7$>6-DobCFa67ncutEFFjkG5Q4>}yMY zV_vR&t#y{D6}m=5M=7y*peF4y)9I3IRLYcGo>X<&}Z-u6gI{8>lZz*op zLAdx)CeieH4*%RMP5!y+4C@!&g0;D=fyS>Jspic-_#W%8tiF1GK^_$<{jgonmwn8} z?}0AfH$sON=6NzNhUXGbgG9mon2o&gyBe4`xrl1rK7wsl^&<0?NraKlVo;HE8*G@B z0!o`J=;;x=NtfagU`)R&Sk>~)RN6Kp3BRjH9%_HXtPJ(T4=#E{Y&aVv$qA6Y?s^yA z$#PI7))ECP=gy$|6=r+2GXBL*S_hJ@< z*LK}pTf$eY=jK+~DYk*howgjyZYmdxoBc^PFcqvDcMU&qcZ%5He;$l#$-p^p8|JDW zfR2{=#MC=aB)`}w(bW}*%jft#u= zppIVs!koIZLYOgg2$7I7otb*P7D#s*IFr?mJiFjFY47_7I-A;X%SMe5tAlB5$E`fU zJ7FMme*baoY#`0(_PIe5y+%@1vzpjj@IJilT14QyGZ(aQE|C}2&cFGyQaC%nSH)hU zh}B0o@cw!?SR^2-Q4(~W7m^vP0OXxaSx8xdJdJ2b03Ady_ z>tD+Aw>wdvHD`<3L%)zNt6q>PM@Nvi+%CaucV~&b!ED;0?x5`WQ3u{{dXDS!8RW;U z4&t!mtEkzBbAZjqZfeJ##l*(V>3HwMM~MLz4@6zV3^248Bz}z_uexT}d0B{(@87#j zJUYLH^LZ3ZE!}h%%&Ps%jZ4)8ril(*_EM3#qTw&>o9c=}Ffgzd=1%|BEvYzKs8iaAR)T_rUUBm4OSfuX&5vS^W3RM){|j8=UYr zmMQ052@yz{+g9Vq44dgF)t_@B2lsfvjtS|9w^g-a*^eMxmp`7d$g;ymcMV{k zXw4O~y}prYVPWK`_b%{!t-Y-2*n>|G^B2R8I*Cpi#>~g3?QqEz2Yy105%Dv;FY{xv z4c$BKjp%V?IT`BXPps?tni+I(1*cy60p#SllYL&j-Xl8ke_I(#i`TIzI+Z`?9VA)9iRA>)k<)>_F!Q)AMs#6%X z&59RB6$g>=2ZA6yQ(|qOdK3LQcRaQw;4_RZ-}n(( z)%OD1vHW^r#PZ$r#*+)!^wmd&T?e;m%XYr2np1WHThL>XGCicbI%?#8a(`hyvGnpI zu5o@flzLFfAJl|U6^V)DZ!=23H>eLPx6brtR9(h1gI;H;;x*TmqmOZ5hx(|v;<=6d zt8ksdr}9U|v3AcDz2@#`UhY4yj_ZN6XBENR{-%Lsq~^I|+L7JdXSjoOamPS~O;^B= zu2`8{b@C^+#`!i>-SIKpoq`W!!lLcyYkDtjDT9O62mXl~?JrLnHc-mXaSgN=9)D85 zRHxIm$1mXPGDpbdpGd{QlmNxS&=P#T&<<>NVrk`0>jJ`Sik>JL-AL0Q@;1@@&>zaE zHfF_3@0*Nb<|9phn4Kq&X_{#ib1*dzM!h$@;jbr$oRw_G7AT#qCE zdL2wZpPnp4J`LxS*DBR(;BVEAsneJ(fA1+Dii}i(u9q^_cZ#-8n|10IudcIRhwf9i z%iSi@?%m{fgm8?4@>^F|H*0@^@7=$WqFcXrWLBq2LIZ28#$47x z?)39S)hdLe?aR9|R*(DYUbX$18Oj#Q=>=0YlT=?+fs<-bKjuCpKHfVe{201e^TFV??Hhfnv<(l@RgahR&avv^)a?Pi_WZK`| zL=E0`Md&iExu*K)Le^aN7tIeN{IxHyWU8jEXSfH0bV{$c?fJEd%@l2$hoBqRD{x)7 z=h}5uMyp1D$)lntUgf*>9#7s*b_nSWXKFfCt4SXGC7DXxdrEN-{%%`~&^)#0o6&^# z<$iQvw>LDirn9!z@mZ9i#1(Q~3zfRw`nU8Xt{gZ0IY-4!8mA&RB@5@dH1!o}BwzT;T}_!LHB@ioE-Qw9{*lg~en!QFoK^mrdqZn` zk)rBmO;i3D^ho<~Y)3Yw;dSNXPRZI8(*u;AhhOtg=C>!`7;0<&+Fys&KOKjDi#nri zShtKIyn95SNcYmNIi0UWH+&T#3l1ta_ghC+TMu_SPa4_h8L3Q{p3TVSwUZRr-VW6s zXG7U_oi&QN972^me3+s0Qt6Ua$}5Y(9A#Dxh(L+2W)l$;S~4k_Jr&Duu2vqN+FwJwcnAJ6>74?|c5>3KHqjeI?V=gAGPggfp*Fn0BdewC|VfK#i{t zP#N;psWV!3(0J)eYgYC?qZoEl$M$>IgCq}kWv4Y<&-@-A!EX0hMs9l8MOF3>AEH}o zFjei?8HVH^v6rX!RI9Vi0(JG2GQOXMX*ofsvf0Pb>eWlMflXh~KVPgS+^T+E9ekv< zX70;&#D*rZ6#Su3>e{6x?Dzq@xtak>$e@os_{y(*nR>5U5Lce8Bm@51!#`ypFr)M>71v_u15SDPEoCcDrojFRDJyx zl}F1b!pylRx$|oVXa`4Df-}#0s*+=^COf8qkXr1B$t z|GYweK~p8StDBMKnXlZF265<*?a9>dmN>2;X1bzMo6#yw&KJ5oTb(IGcHxPWrIpin z^hV_)SZ&?NsqBHIzACQ%BITRuG{Y->g<*~Na-H}a^p4k4RrM4Vw3EwirAwzPggw7L zS2eD+mb=vKsmgoh@0uzPjg)e9lqRIaG3|w>4b&fJ-qZZ*-&ouBY%gZ(vDVt@%W|0T zbwjAlS2mEtXQyjEB(!(`Df`!qRFn-+|dq`sDJ7-C5Ci5z+UP*UxoT@7aF9`S8N!)N--^FBjvdw zm#D#BX1!iA#9`mN=-GrC+BZ*BYJV?3I(~+L;;a882IJ@<)EIX6ed{!k^bEMZ-ZaS>4Ch z+EY{a^A!^F=t06C{NR|=+QPmDa+xZLEE%?ooOL;sR$RECDf42qqG{vps=SDcJ zivG{$(>)r!6ed>~plud?UVD4wU}ojT4(u#5uim$G88g$P2WKpk#~;g%P^G+mP43yz zgV(Cf+L(gk2A(J)ZIiI^+Qmoquv>NA)EU_hZdH@9 zbj#k`*aKfStB+{6^8-2!CHww*6CItoi1=AySDcOu)qK%C5=OpXMedm&PVO8qoL%_y z9P+E72eXH(Om{0k550NXSTR-6iCnsO0kPmodFA;YV-+86oDz(h!J6&wb~7Pm=b}ED znW~Z%3y9?9RhZ_#)loIdDyf}+_D{O~*}H0=p*6MBKei?R9`S_9`FXEm+@^ZW)7(@+ zJ1L93)qjFw-6$W$=vFti!81;yhK75bt^Fy&@^z;0TcZTw!;oWC)#aH)Tibs1zS^hw zs?8fSBPw53T#4<(z!#X{eB)elSOc@hes-AFvN>A2r^ZRuvVDPU{rkPS{o5*1jVClj z^;a&Yx4)R9N~%qext(rN-KO_cct8KFXfUa(TDYfV{F5VyH~Y#ePu$!rm_ifPfA^n5 z?t8L~{5o&~y?*pV)X1NNbByJck!LRnTYuUlM6F-JuWmU+QFnP+zV+cNLazs1v=0uS zCf**}qP|@3s&KAeBjvqP<5aV+uS69x53no4Zm52HUIP8pxCH-mr4)6UXQPyJhfi0} zjNh!8{(cB|^voxICR>v`{wXK!erv8-P&!*TLV1qkn^%caN z(b^V=^N49a$I03~Tcc?ib*QIn#%mfrnxmO8Ku360A4j!)QbU#d;}))SCq2FXhdNB! zp!@39y+;en&GqQ}lYUftCjY43{XUzHx>H86=xYOF?DZk^#n0EsLw-G(=GAFsEi zpGS6PPSos5=XI>hY+O^HEw#}>=KCyA3=M0@S8uyhyEd&M-F)+HbTn=&qx&#Lwfg;j z)$YwBiNY7RkZ|U?R`F#zHEejK=0w_R_KqV?wWLQC^5;Y^Ci&!S?a8&Xs8Ndx2;;=x zh?Fmzl;t~AtsjcrF$Zf?>Hrt_Zj^ytjpbmeo$ zg#t8+`7k72l~!%B>TqfJ&hBHK=5@?N#Z$v6vh&AIDTIl_{LO>azdZ?LSE={ zg@M1%23&5W*l=|&T6$(IS>~3JyjJ5JIck!>hAK0W)*dN|Qp+TvJ*#PUR=Z7_TNPDk zS{sMDQ~hmP>`X$vQgAus>Y{g^JQ=L)%@MLjplrbdgKKE zO-%2BCT9MG>HN9{zQVSIjogVp2ciadrYLIkViX;3%;ysVE^~&ks>1D#9aYOaT+ z!|&>Cr?i^%>aBSH+F5*KIDgUZz%cc`8S99@uTLT(X4;rGffdLtWe2M(g;v&HyzWE3 z{_vZc^n9=7H_c&(w_Z!{=hrjU>p!4onP+faHnbt9S2>~5jI6@!PP$8(2j;Qeqigd% zaTYGO#Rlql>!aEd0l$$8$q;RP{~hR>%2Tba(MQ!~&wOfc*`=D!9ZqmV?e|qTQe%|w zt=0H$=O!x$G0B3bt+%?5Nvl2f_YG~-o4@&~?f&8Sb!|YEt#Lwl_xUvPN-aluzPP|- z_%|nC9L&?szk6EqWKTVEX-;pt<|IyAw#V-(YQ+@p=ZI?Bh0nUuDW%&mwKqRtdJS#G z@jVUNuj^k>iS3u8^qT^4=0bVl!o=R(U)4S7g%w&WM_$z{`cFJ1YkFm>y1xwN*Z1@x`V3mEu%3ITDLbMRzvb{cCA;bpk=vS9wXY#) zRzFTAKW|N7n_cQe>hD}uK*?2oh&=B2mSCnyX+6<#@*Aq_`<7Z_;gi+Jx@<5-zW;D29xZA7-Z@r{Rk*L$6~X6059e?Kauw!a&#*!nJp>DVZPXxw#|vU}Ca%Bx*x zYeO=clF>UV($A{(fIlwNN?qcQ4{FqAFV}unMQ+wJGjDCXO+9SS0D9Q%id^|o3+bfO z@Hf0aY)}jvazZ`yavEuB^b1uYpftT}<1+<+xgUT0n~<9Fa+WT|Y!9we=|ds>fc%rbd;OC;LaKU*En@&DuDLUtDz) zU#{T~8tNL$&)?}MT)+J@y^Z$Po`%1_b58jxebo5&&oYFiZCY>%J+#vSdgwRL~NEDUL{h~2xENqks^&g?yo z&wKL+z3y^FGIwPa&9#3<3O)lq5r^I_CvLVn#_akKNtT@!tYj-MW@`;gP@M{{Np5TG z$Jl2T@;Px6gc;k_>b!-QIgjO8#4`18v~5ClO1CSY-*R+1^!xnZUgrTD-f3;4v zu9OcOwke;9o7O;cqRJPNn>-BdOqk3yYCVtQyZ8t(-apZAul>W$3-K3*r)=VHC1~mK z9~Nt;JsC`^D!k+N(Tmxo^ftl!rO@ZvJwolc+ z42|R~j!>%FuUxD?MjN>UQC1>9tg2>WdJwyOf4KUIeIYSA)S;a-?+7|GqM7DpU?H=1 zy*03r!{2Mp(?0g#YLi);~w4h`B7%VuxecG zkt4Jfhc@L38vVoUEdN@VY}~?nW@mE)Lnm-e*($2rksQD0Z8zoGD*c!qHjX*n--q<3 z7LzxvHxw)XTtK(G+)O>&Kb)u$hg8A#9m=ttX(l|!U%B6}u5w50J7Ha=gUUgtj7<2{ zbd)};5q(4dkoXjTid!)FJ>PoxOHG>v8Op#{6Evy`sL^?HA36z(n=FU8S{tE$1Si^MQ0^&<)~ir(N95s4H~V zypO7yC8IRm@-EOvBTw)Lr|e}d&vMASFaM!x`F~PvT>nnx*RzoM;i{4tH?KUMyC8`y zjG4^!I~A?zzI>M|u}4kitPf|ng|)^CmHM1jY-LU|1Ag5=Zun`V`hIP1)?i*n^ZPQH zp)2YTHTV6>Hvck|ebhmrzG8i+tdd`m-B5KIN?k*uRjZTK>yLk=&NOVQic2`ISXAy5 z7qZ_|cn;sS-152*J(@I%nKE-Y8!%u2Yy0VUveB`5e2+T`#GSd-wAIV1si&n5(WjR_ zre0P_)wbyI5Y6~JUsUu5k|>k6+L29XOpWC$bb$8g#=<@oT8FV$!Nu1;TS zcaHYhoG9o5?(m8YL8yyQFQNCEeS~K276m_Og7!___Ui5zT51>Ge67B*i6!TZTfnz3 z-%q*EyEAfxO;gQp)?0O*8O?bSeT9FX4buKqI7wUU^BU4ad0(;m<8ErupVJic9yipE zzEX>OqdTlv|8}3cR_joqfd8FbGV>sn*=2>g6V;o4w0*kP^Uv%2ac-Y>@{!%trIY)a z4ILLMUvC@CdDnVEg~cW)?u=T=JZbZo^EdKpHew0KDL<;Omxu(@!Jy_zl&;3 zUcFp&YIA%3TuqJv<<7s+~ON(y~{OXE~Y+JJWJHDiz0ZgPGFAm$m6C;drW8b^bJ2~ zrl)wJQVZ{+vgmiV_JFSFMT4HoAK>r4jJkb~nzn11B4g_$MM$6hl;Y7az8SZVjLFYK z5hLoTb-O+Z^_!KY&mCMSwD0*+Q?KC-dd8%Ebl$7m=)*aqF!#|m<(>PL$=oiRS^E=> za_EO(2EAU5mWEDY7DxQWEa8TzJ@+gW`fcq^Pix*reWdng`c&wB)j!)BkhWglEW4?L z`YzjFIr{58&DDP6RO1@YQoTKp!CIHBReEmygRQuMRy;He;?wT0=4sDV{%lZPbr}48 z*Dqas_!+v3%AZW#RIigf$=f^U3d>c$2!1d3D+}f=rax}ntEk_uKsD&-6mG++r^+7} zjuHC$9O7FXnX4W*<`Sx4n!=Y-`mwA1k#@wMgItT8OWJaq134S7CN|f*jJnOArg*q; zKmGFp8^7SiMNLr8Og6II8aij|Wxjsbt;Ch5KQc#et|i|se9zU59l_ThjF2PmN7bkE z{>b;yadOAZ(?VXKUntKG?^I-dIX-#ruj(Oif3XPyVL?->ZjYxj*hG|~aUvaF7jhPl$UKJnUsoj&` z3eJ>zp-_*Z!s!zKGSED?=PQVkED2Vbvv&ms?95>sBP}U zUS6_OS?@*!Iq{E`Os`*t5<@nbRF0ipsEuJcsux{K2ua(9YF>SP!DPK1OrhiH)a>ZV z%$tI~sy7WbvX0Sf`9=AAh=@p=5O+M1Z+84CU*cg1x4PF}rlm(DZB;(wSoIO=!XLlE zo#zDMs3U_?=KjeWBW9`l2h`KN&1s#2R{{1WC*X;n=@ahLD z|Lu8YD}Rf2-IkHsshjt3D>vTI))(fX6O^xlP?_jYt1k=3_I_e2wd|s~I^`{WXZ&Jq z==gm8?={U(lk3-*uLB#hd;3jf)cJbi(KtWl;k-YErPbPzuR8V8T$||79-3F6%DlTu zdu&@*#a-JtMT?cS*@Mk{aLnpJ?Toy=Tu7~Enx_r})p*GmqBD^#RBZ3B{8E^!2HNH;=3{VQZI>^x^iQ6@kbUaj)W$TQ zrJ_gdQ^JRfH0iwt@I)IE8#UmxV*0>z{_vXKn#9|c$O#t{6!{(|c1+dE9J6#ZimqEq z{dr-S##;Z8wpxl=6?MG_zhG`U_iD&yb^1_&+y#GI?RdNPXj}YJ<@$uN?5pN#rbFLW zicoTlFm2QlWrI1Ss^iZUm3c!au$D`m=v4u~YOX)J$nRO$Th%%b5pxtZH7(n}&>9;M zDo6Ncln3WXOI-<7cX7l~FFp*{4xb#xmDzb;o&V2v%Cn%1;zE5J_pI?=hA$CBS}XM? zuIT@vCsZw9CzkgTYAjzt-a&0N!?)kl{7F6Mee0%ZC;a5A3|bwg9rbHBve}w3+TC?h z(2=Q|gi0mF@r3* zNy|Cz4$_SHc{_b&MX}j#Xsi+gwmC z{#=o|vUwQ$>`l6g&OD+t?8)F_kJJ3Yf}YfhPK9i(ikIoov9GxrGiNDYygJRLy?KJT zFr+@SGm0GaU;*`MnL&AfYreKc?HZ`MPf7LCiyc(WZ4p9tqY0X4!K-<*Vw3iL&JE?B z7gZG%m$cU|HWq3gPTir|c1_PsQJ!O8hvjowjpmXCuROUa^h@p2S>^aIk0MCc(;NNt z>ZbOy=L|(?!G6_n?yAC5c}_THnxPo5w+Weevawb>^(51C)g&~dPG!ONX)jZKQ6GBB z+eEH@Kza7`pX=3U7uRFP&)Lpe7tCOyv~x6j@6O`4-5bO`KKc`1@fds;BlZ(FuhVuu ze&9=L#=gHa2Xg(m&m|VHVc~BSlgjO+gzMdi2j&3w^1CZ^PvZ#k_~h|yhnWvl&^qI zo1fRBM32|RiBT{4DO8{;seV1p$Zox;e%p=-!Ka&0XD-&|j!X{JQYnYRK^Gkh{e~c_aJQ{VB^8CS~`8w!|;2&C^?y#Z1W`s}zJ(=$#Ak{F{ z7UN8yDfe|akMK2oZ(ho*4@mXB9A-&{xN8c~_&o9dLgtEZ4bU&m0Y zT3`7?x{8|45v7O+0Xwz3Ji9WNm;XYIP|qg1CXgCssWVjG`tJM#M>}fnJNTAF(+}$G z%`=rh+_lr5QL*%vimkbYR~jh8uk_Yrw!SEI?){ZnfeNWAznxHp)>ROj(r+qXP5Be` zyLv$r+Kgc~!M%OIkGU$J{cXsHwcaW&2X|L*8s3Pwz2u!{!N|i3G!NJb?#2I4z0?*Z6uIaM|NWP+lhQisVsK> z*>xoS;WAZz**}`-fJWMb4Wp@>5p^_d-MgAYezlbCKR?w@EPOzA-Q*zW=58ckHVIHw zc-j|fo19Sfm>RFnE?Zae`o}EZkUpHAp#P1@+#91=lIbm!8PJ0g#ywQzdcohGt9)K~ zOIeiat7U~N`*O+o1{*#6xDsi$f3b0^J_<)umQE6JKtAwTgy?O4Ev_1&UcWS)u+NJl+%DAXL`mE z$yMH|mTk|Wa(jLx)4Sx+^M4znO`esjJd+IPIjW5%eJ&m5MmM}KXm3717e?8&&Bi4V zvwW73yDmqlVz=jL_16|K3x~Ae0yYhxF6CC^-u-GtTYfmAaBO`~1Si!+!Q@va|H3gv zrJfZDJ9}UCu4=NP?58ID$g|PJ@D2;f3unVv?;95Gx#c4F*XwOc^Rp*hrBB)FrkVaq zk19*pwH_H{#K}F{ddsS6OOEcO91*<@C9L46OGn=mKjgNdckehsIkpT}-#=y|6n##p z?VWx?OAl`sl>QwxT4exNrCkGhL{$Mr--mtf3qv(e-szN%-M>&3$A94#QVJ?~+*{$y z0GO<-wUL)D+_bRBKr* zyXjH{+OqpP^>muA^6MWVs_pAj)tBphKvh4o#KLVAHJ7~0sG7Zg%>3}Ym*!}ze;9V* z0u=L07j`S0HMsWjA$7R=Qnh8^T4qGoGn!8WDiF`tv)V6<&(bkL%atqlH4{!0oTQ{oK z*d9@N5wD1PKPiP0mA6w#0}pFT@8D6;;pf_(n?9oSL8A!7o4A~P_0;s_!$j`1o?ORW zo=*y0*pBTj>1cb42b_KjF}w zPm1~T`)W#{R;Wgm(sXpf52~|o-)kpanayx#T4~dl&qW853e~l*E@De4r_&X>)m2no zf19;m)v>!jC-UX)pU_k@?NQCy*Pecv6hsW$<4s<3j78ndGtq)y<|{gG8_o>d+lXlT zn^jpYYYCaQrXFfG_Zs{7@+)Fz^kn+*>^$P1C_&|&_`5LomY&FK|A@D~drB>PGDa2k za2@H}b{|5c9ol;hXRE5bj3E2`vW%}#?;QEaW2t)n%5bW7%Pipm_exPM<)P+IibLDD zbds>K`V^vV_$KDpYbL>?e;hjVdnux`B_Sd%C@2_zN7Vh>uK4|Rc=t6^4-WL{GWp1F zsRxtvS#__jZ*{Z%;U_*P)4%@r)AW0BIpc<4!vFex`9JvozkV+j=OcRVT(aBL&UrUx zY&_7$@AcrHz5dShxf9O^Uw`mR>bW1*ho>K2+UCH#avN;tA8g;#Nmp&VPeJ`v%Ao(( zv~j)s-#oFYgKQ3KO>->#3p83|9W`Q!;xv1*EeVM5;JnR(|EhX<6BFSVT-KYoT)~@I z>FrItDGvzl0!0bpFkm+LmjXqTIL3{#gcoXv=Us2V)iI;^S2WNVzc zs6Wq^8*W}BZ-Q(Lc?**A`=+6U0S)B*%kF#ii^}87&;LS?Cf-Cq9dF_^)X{%E?(Jr@ zrCL&OW5VMc7fy8Yr6gEV%r(s^3C6fVDZtv_7@KI0?MuX1QsRt2245n4P>Lzp604J( zx+JS9&XSU#v!~f?)>H>UbhepeE%6q!UFS$N>ue@RqRwFz-&4#3bP?@av}zxrvnQHT z&2hRUOH8UMbr8|MgRyH^%ZRWxkTC zbmL8yB)hI^jMbWCHlyV(JinqZgu!Ep#zes?wE*^B@}3GXN1r<)l-_`wf%;gj&A zXZjOK;Ku%^;J3E3KQUeQKMn5L;C>*x&wzUwxPxX%{Aa;E58R31CgJ_tr)pG0=O`oO z*4QC3qJ8JiZHc!)$jLEh!d< z5jd+>gQ`hNGRFbG)n-ny+mndS)_BJN=ylGH>+G=q?)wf?Op;j~D9-VLv2s#cgUWXC zUmW}oF&B*^XB_=)HDfGR7%8zuL%s7|e(1wM7pp4(wN3^pxDS{RgC)Z18T0Gn;Uno!i0Rc1;c< zQey-0&%ah+u!wbo2oZw<2%=eYf{2NSUy^k|yv3e~!-a)*j=~sgvcpUvx&32f#5oDm zobM*H9io&{mEH*gWBovh78=nR-kmfN1MAdv@xwdNQY|K&uh34dLNT-GmJu_=!i12N zB=LlWwu@-nR^oHff!Fzt`BN=6GfeqJYI0nyx==p1Hjl;9!3dKXZgpp$=?Ue--;&3Y z1|#k;!Goc#21)JM5GB5Dq`z3-b%m-NSI;#_1#t z`R_2jfXA6PcqJG)%(C?V4&y9Wl3Q43xdMiI6ODeA!j1y}Z_AYeH1|B>a^Wy>@Wapd z!dQXs9tM|73^VM%!z2UGx8=fN=4JeM7-zXKroaS+>)!cO!b{L_&_hN`;WNPR+ovCd zapn_;Q^{eXARK-&#Q%%`XZum<6UW^5JYqmh#hJwsMBsNk zxhH`_;Yft}A}u~%6w6kfJsBo(9FKDxelM*IW^Uq3Sq3tSU~Gi ztPZDgB4#SqY8&L@aik`R3>Hvn&By+s4ID)=4iNh$k(!*A?(OlUDDNGPzmYtf3&JOAUB&;fvDtN^ zl4%|YQXR{19Vh^a$);GG2IhCCr`k<2*`2P7OO&W?yt+7<)tzRRBXy_QtVx4v)eflh zy?E`=4ko)4xhtpN)P925p-VLlz`=@;D)|sNdR>K^GR-3e#AH>nx%hHTRHh~ExNtC7@Ra$mwodSbH0p)(JRHG>evohjLDx0@2oa-MV+yDlXS_i8LNtpDzw1nz9z zJ2cmUs_IPEIW)jeCwF(~6A(AJ?yT$axI#YQq88gLAq3P z0_f>5?BWPm?zj|3m}_8d<`$QmA1G_Z{nBC}39*afg2N~xh_sZxDb@k7>JaCeBDd8h z4OFMU4U}PNlT7_*%2nHRBKvFoH*~e``c3Ei{;n7{{AcPb`$hGxf5U&QJkH0xZ0p$ ztpmjVKOohLmuVKfi27!V1UtK37ndeADO3>@5B{#K*`8u?Y4W0O2X5djPBSLNCL8fQ z4b_apxcN$MYix|sS-05V5mdw?yNgANX}Ao|K-gW30jHCcfLHlxNoFxFQN9^tAtTO( z2j&62(>-%8_qRN5?wGnkMpzxYhb@yTg z!E~$9Zb^V)CS{v|J};&h(KXT-Cidx8c;#fqiwBX`DzarnCnFwVMu*iX3M=q(_X~^a zZp5PWUo_k#ZgF5fn0xT5%;@UVZvJB2I1!wfGmUUbH)xJK4bBzjmuX#WAbfG>7HQ%{ zC$hnm=}s#ukGa3i7?C0hmv5sGv2@aa`WMY;cYsP&6c6Twf$J)(GdwJiTw!6-#iqn! zJTgu0hX3Lf6b{_Ruy&zga;9AAV*3Be zv&;WGc@}32oNKpqoisV;u5_fCMIHg}{8GG54;Mdlo?1>Lr+fUkQ-M}#0uh4Mog#iq zLa}_n44d+89$?C~#7lD|9=%4%{qH)K>0lVd%1}`n#p%Vu!5&JAIBCgw?J6cEQNU^m zQevPu$6Nb~K;Y@3jyT&uLtFZbl_=5r2Yy4Ac}04g@aBQI1?3P#k)Jd{74yS7nmF6b z6CBuvjLD`1ODvw?ai4*_rpDHB$?a5Q?LcEK_*Yjfn%Gn9wd)5AG-B!NCgCGlXBY_$ zD#VzjK_1HiqdBC*n9rc9qFaL+VGPiqD2&-GO2p{Fq6~~S4rPgS3eCot!=bep16Xui zbW`XS#zhp$$9SGY9)AEvBIJiLnnfWP@3ANfBSE7?jM+R&$CwZCVzjYnEyjBYE-ZG3GGnIK~VX-4YR@XBZdJh*$||V~`idECvN&T*ROdjM)t8F4E!5q3EVjCdLc~ zEy8G{&<@c}q0<-xXmn4cYfynm*C1{c(6cCHz?j3LV2q2P{V`^9$c9nJpotg*7&K3G zb7+g`=FoABix9en(F58WW4;EFs{siP88C)GelbQeC<^0w4NAgzPlHBb%+{cJq8sAH zm_wt}7|+w_mPn^jKE`~gk2Qb<)CWcns1JIV2b>N#32-IgGQd568vw5Zt^mvj z+y+Q53Lw@1mIoXI7z_wDLKF!&8!!=YCE!57gMbqOmjW&V909l%a5`WPAn3X1GT;`# z2T(6-F@k#`U?E@@V5!9cL;@h4<_pSa46tuz}0{c z0AcNl3IVqRdWrKRAwEu9si;uF9x?29VD%bieQCeLWVf4PRgagZq7ATtE(QE_jT-B) z)NB{p9Vl}~DP8E>VxHa02K_*!xt9&vP%LiHz_%8DS#JC^@EBzNG(fB~my+Fv>2NjxevjSw zL%=Ui_HPOK?*+f|;KuQE2i`?9ya_M(IUks-hzwk4cv=B(Z}{op{lEA#!OzLx8hC$! zU%>z1PjusN1H4A~h5QfxmTvrQffqlxesF#7_)h*;0v+ck1pL~`{JQ_a@612uH^}`U z1o-je1^vBXCY-f^pYsWU7ntA0$88R=ffkx-b2|_5Z@)lsg8BCx1ydSWGVnBo7ys7y zsz9jb+V{hAk$YU&@`BG&{EIH>_F@{}nO9+clT84?k!-Qsv31k}i+0KQ84ET%hl>sw zaJ?6|H-nv74l6E)@TwnbqKIa<t;)65TY9|>KifE!$(~RRTqG1D>?3ULWMIpaKPlHttY(PtE5U~Y} z&RE@PQmnAyzyO5H1bTH4xdTR7Gz#*< zn1h1+FlL~jMi{eDP!z`VC@2ZzA{3N?F&hO<#~6Zw)?$o=BZnC8p`cqB^HESfM)`rp z3Br01$nT&KI6nYmH>f+H1uzZ}DmW+|5Z0|hS%9EF1uX&uy&)(Y5cG|p96-o)(0M@6 z8-gAKLbU|F0dzjNzgl6R#XJzK?a+gq{UOB?M|5b`8r!^#)|fu9M@6{YFbu#~azn2Y zjd++Bn~^ZK4{aBLSE{fQjKhXVOoR9WlOVIscZk#VZkOqffsQ~-hdQL6?SwpLBf1b{ z2%@=NfRTvy!ng?0I*ieX4#H?dbO^=_M7PD5gXr!U5I#SbMmnV(@Z4;Wn zRWMgWd`ri*>71A3jJxGaj4~c?ir})^9VSPb9lEv+&S?QfcHvXT}9u;FP7^W=yfB#6sJ22`K zA3hdn6zjs`7$otD?QH~U1AKTMz~vAt-Y9lr(JfbiC=;D|bJFA-%Y0H-HG<)^mQ)+K z&ZX!Q9S$3uwn;II`vowbear8K@o7W8ei$>5Z@B2De4{XCA>Txdk;pe4<09mng)tlX zuEdywe0N|BpnOkbJdb?uVboE+Z!q3NzT`f@5X#pJV?LyVF`DviiBW!_>3mPa`~mZZ z?_)q%OZ&b7gteHj$8K@0=IaLtbE|I%Ags-NdjY~6?VAn=bF^<3Ak4YGYXM;n_sszu z0eBt|2B+^mzzjfok2rVxmIt(fI~)+E9N+GM&}_aoK+rXPcc7YhjpsWN+_2{JT?;rA za1Y=xz{`N3kNQ3Ugelh-&vU~83&HJtWL*Y#g_>f2NR*VO$PUt3t}xg=Z4AtQoy;b? zH3h#G(}l3C2!o*wCn5Z!z<}DoeG^xV(O>QXJnQ6ZE1m^upsO6mvpg)|D%;`gpRQ$8 zRAkLsH3BdNXw^X}Na~WB)IcY{w@*uUy+^?`1rB)J^WVR=IMhU)3&OV&`zo;M{B?v~ zfw>9d+0h!(%m4V_kXxi*_LIZ;9rgQeh{CHyyj$GfQ{-?s&>Nr^z%S?qoOO2NaYlIS zdQlwf<#5Z6eLp>C7>t>2;U>u*dyf2{!v(vAOO@06zYS-V!=3;CQJ=)MqVnPMKrsE8 z>jvQ?LgJBX@r;le&hp?vkBfnMz)%1(OWMQ2Zqd#RXDje7x0A;P%KHFoY8*%i6Q0~L zA51gi31TNF9N5$ifDL<)&d#G8gtTv5bXG%>*C3!Euz2joP2l0Qiq6QmdEnjdm|}iK zCkrGmA`!9$@(at5B-kZ~vnP;-9iL!;V?&ZB0TLE-%T9bg#wE&JemDX+zk!cmyL9z9 zb6=<ShhRhY=*P4!4HnZCfju|6-#B8D;46h z_3ta{2x1B33}BjjesI;xY62m$I12{h(?EH_Cz(L6aAp^1Mdu*oe2Rym-04s!a5Ov_ zv>B)+aWn8imW0H+R-RCD|TA~p??6{`Uc|_iu=0}M}z&u zEL-CSIp3YZ31|*EE+ZUsGm2^wreW0rmjfclft@I30v|^=LZ^s~XlD%V+`g7k9v8*j zQg(}Y#K8gL(-}r|OH7ys2at^Tuyu?HE(*XS(yXpxif)`QYyk|D&K0z3-@JoJmy>tB z%Sjh=!?r8*c~depb8$K>5^!2L4jj%H>0FH3zoEO@tcd=-IE&g=|8S)6Aj$uk+yhkzR zF`lQGsu*oF6O1tfzLkS9pJt*k5)6}wF^gs#7#Gn@I>t!EWMYg)Ocq8PVisY{K+G15 zS%^7|F$6K!F)l*PGmP1YDa4qAm{Lap&m%@BBFzL~^kA5l7;|W*JH~8^v0=PNGnpct zV&-8aC?*@D2b3G5j$%$@3}BdB7_*_g$FLj9i7|v?0x(8WOiPUN1G0nhJ1DLN8N7c2 zIvx`OZqVhJNI;l(nP@=JS_K+w6ELck0_ zuS24a$W#Rc-H~YoI0Ude;BdesK$udPbU;|`G7|w|z%laxp@T7N0YPVE_5gxz$y^5n zosW422opb32xtSOp`AgeWV`_T0pk4v5SWY~xQ7CU1A?x}L<2e>S%-oH@HOFw=POZ# za_M-FOxFZ7s z4kjlMYpH3m4t!V>q^u}nv49X)fAS(zmN%|-q$KyjIwT4{m(-MHo^<%pc}NqV>eQK1 z6VmW8VyL)cbg6VYn^n9|M1bys&yI@G<2uIj%$7u;hqhye-bbLb&*EzI#M6=Kqa(%(c!eC1ZOlht>{L3H4rdapi4G+@+cz;`8V%L;v z-xV*=inT{tidZsJnj;ZcD#&fA9c8++7F^+_ZY)QNd5cn&c!Kfa6DUs%u9Ymx$LloA zVL6mfRgC$RPcTLg+NUkXEaVf7F&p{VFrG&~85kEKpNSZAkk2xVk(AFKjQ5bwb&UDQ z=NZNj%7-`uNYFl|FzP5D1I7SI2V*ql6N%AA`9x#PpnMz{3CbrEqX*@)5@RIoa~$I$ z%I6uzY>4+PppN$Oz!*ULRK<9Y@(ICsp7M#p7()BRVU!<`Q9kJ>MH%9g1qfB(gZJj4 zVSVN;5oMLnN}z+x@!0_gvdZTcAaqZkH-I2hd^}ExGQ~#+2r|Vd01#w~Pa{B(2|iJP zAWMAW06}*6qyvKN@W}vs0d!%XEO5iz=aUTxGSKHVAjm+U2Y?{+dcRi@j3$QzPy6CrF5T&X`vlk+C|QzqaQO@_gMtY))ww>yOBXz*#VZ1MG2@)q@x2c` zRA6CamS$1#gIx#bTqVy@t_7bw*73%*$maBLqvN!S78&>=sq+xLyl@gHNPLwP&%khy z%VM*L^S4BYeksZjX-dUaP+UI9g29b0+9~B?NR~p;HY*oVd>1WlI61jIqBwIJGDRz@ zoD0boYlaJ>MOI&&2fWq;H5UwwP)~3Pz-jQ6>Ea2||GEbN++qzl^CmW=c$L-_rL($W zPX-#<CiB+5Yc;Om_DnlA{l zxZ*YNjUQ|Q>F~1d+c4jnbirS`58zhsE}E;pAm8q5R;lHs&Qgr-ri2WtXMKz7MyOWNmTHa@hmQr;lXzZ)!35`kWs=AMwQ3Yi_eK6LZ(M1yCL5&f3TrIh zQQYX_engSm)zM+wMzSvy`MLUmTfCSi*=Hm^yl{iO8l{@V4~@nd%@aWApR-Bmi6=_<3V3AoaCY6hTBL9wJf!E6BLD5FG@ z(~@ThS3IJ!B>Un1=E}NEgOzZA)MD6jCFQ461gwjtNC99V%tyJM?ej5gX6dsLuHDZ91bk7-QY~ zl_b7#`C$F1kGcf1z((tnFh*1Qi5NqWekI08q|XuQNPiw<0Ih$9(T4QIWx(^4z7)nq zwB8S62GY00NKpDH5ovuQ#w?^Ch%p=KGcoEY{XC43w0Ae79eXGZN6QE1z@t#8lAl`GB23QsRrvrun z!a7!;2nf1{J{=I&ulm`5Fr4+-fS_yW&jW%e&_4i#saRhCXan?s_6MCq?*|Avhdu=N z2l>G|gY!oylqynzdwG3T;Q2bbBz8&swgaql(El!8SPO!;u)4KBUn?8K$Uz_mqHz}Sx*p!I1{=Q#wtL0sU1}u}*{OXCi6q?~O$9|3z8xYqu-ny1!krG= z)~-91@VGUpx_;p1_(g*xAK8!|eqHj>jL(D6$H`c{jWfVR3*t9CCrPCr5~D z4*Mmi!H)jFe2VKiV&%psneg{T-1QuhE-NosB7=yBo4>L6;0?YAD~=mu%pk~;G*0l= zFDxp>fr0aj!{g;092X(ny*h=q4|j&c^QFHt`y^wWNlIWSjNlOdZ8|g=wM1HnwKQH zXwa9&hnNQLDMnLlzce_z;8uBVesCL2&X2?kx>pQbnoW`N=%T@HTX8;z1Fj(g$&F8J zEI3jiU34x=BOw)E@GWw?)r-w;P6NeNZf2=%x(e z7#AT!B*qYA=!MZn84@vOBf}_+8I)nR=%x(W7;})}Fvj!9a0}x-WO#-#8X1V&fEmb8 z3S$;!Fkp}6BSRF%MU){9qYW7{FnUmiEQ~tJunc1kW!Ql+fHIuMc%Cvmz!*Xq z-e9~(8OS?;1ZD6N5!WDr*W`wY*TprtVI?5QO+yYK$ZNxOK#-G$XMj-Q2Kt65FAX|C zkiUjtK#;eFNI;l)3^qWJpN338ke`NSfFM5&#{ofp8Xf?GUDr?u2wmP#Dp!>6h5$et zxWfTKt{O5yp8&aPhypk02ZlI6=zfNQfEj=j0l{u;SPM83@Him!W5WZ$(SYPl@qU4! zDj?XM4Z(n803!iGuQ4P7f*xZS1qj{4Fdc9#;7Y(uz{7x}0Pg{U{$eNqbUrR)q7F_% ziK|{|FBeW=;S-1AzHYo_AWU!aj%txQFZ$VF3ljG^*fhk)Ch<3Ez#fbzBXN%xrucwb zIIZu{12G-XSGoky4dD1Bta{<23t+y)Uk7mdi4!NDaAjVXTf8n0_BU8(!6`4;k-z6EVEn}uw@!fHO2zM6a=g5%MfwNwpyaRf#qgG zY8sY%Ag5t2PVV=8x=xZ<#n_?d;w`BlNZ?y>V0f188iez^4v?O^7=We_EhM7-*J%Th z^9U6xegXt!yLhz7wNvbLCz)c*(AQo5&V{)%pp!2-A-a5W9;mXYyOO^zjY1^lf&#d+;KDpyRW&xQ96NAl{XiGwP(l79nVj@b?4d z@(!$DyO#4y4win&HnDBM6I2WF6C*HA#k~TlByfU3Cx?{jxRZ&(U+zOm@J*#}nuQSS z<~tq5dBzapc78X3kUOUsC1_Qm&I`GUwVLDM1SGa^eVfBn0{mf9U)-7hUf06@siKEi z2+;;5Z`nJ80S)h^$fp^lFrcT6NYe_5I!mZ2NdF9UkB^uVw5nJ{>`JqRY!>J z4ReE4?1GXi+D5*P3;iM~PITkGk2i(zsUz{s zI1F&-rCZUB14-s5$=~Ug@5j4%aHb$#ms>V{eB*Xr_a$&NV$sEWvT>q2Cd~qqRtny{ z0fiOxz|Nuakxe{I$c-#E}=e51Zf;1QaG)$}OzrH=6k-8@ng7N0Zc6&@7=a_-&8a zkRMYiC4cZDHs#rUqfkhV>(b4>$K=0=ooNWo%pbo-Tl8k~!^=f4bYJmF(a1K9 zm(#eEt-q&}tDes{b3Z0Kf2tZ;nt!&}dwUCc{!2UF>%aJ=*TA2ZyI;qP*|T;=aeM5B zIKr;^&vEv{cLLEVazDP@^EqH14lg&Q^4I=M_CivA5jO8eOwGUDLrl%j_F`&&6>mO8 z^qkpiF200f8foiN^WVIB6e}<6o#kI}-i%k4dUGrs_+eo}h85_fBF&rQf{b^dc(QJ# zKlc5Jqz?lhKj9T-`9QyUg(=TYKCV9g-acMkJ-YDj#CMCr;eY?irMX+CN@nYiA|>WE zfB#sv{scNL(ugN$`*KQY646R2O(WVUrRhYyg>(loUm-n4lqjWFhQ)aJ}77}w6 zQpMk3j#A1ItrSulVwPO$LX=oYeTex=X&5n2DNP_cDy1nzD+}o&B4;7ZB-&U=_YiZH zQnuPLz(RVK%;_>|9x+GG%N-Rw^#TI~8brBFnosTnWKzqgpg|_JCMLIgP)Q^}Z zml}xaN@*%FS1#Q|Oj1fu5p!hHr%W!BDxSfdhj57ba;YOD!Xc(39AX;sktmT%cMz@Q z(knzxE-hekh1BXf%#IdPYod)@+K!p!Qa56NQkp^eny!%gk=cNJBW5Y3qZt*_RAQ1s zx{RooOS6apa%ncvAeUZe_HyYXVxC+oeL->yDMu78e6XaBd91G{^#RdWlm>t(meSE6 z`h?PyAT5odO4DFQA5fYJqFpS_0nrDP-Uji>kiGh5Pdjl7KpK6=_wF>JZT=71{Q$JL0W5sv1MtM2R4$apbeM~I)dmUO7-9} zFbrG=CV;EJG;kW23C;lbfEdG;=7Mv;ry$0%rC-76pw&Y*7A@sK^kt>?;P0S2h*w$~ z0-~=eO#l~xso-`n14Q3ix(Cbz&w}g0m*57_@{x@s6|4ac2W`MjpgV{@w$uRPTPsZg z=Yh1A8+~NyGMHDA8O#7rfk|K+4GGK{QXLdJy%QGz>)F zSh@^c3)0%|h2RdD(N~t90#}21;2Q8Nh_QER6_i7a*-P!grJx?13(^`b^sS{?W3*y% z67{c84eF>WL|ek7TP4iFi+1$!V3y)oy2xVgs2N?vT?ymeBvcOAh3A$;Ka!I8<)$!8 zm^(;`DS{mN1PONFpnq^#;E(JlB;g-irIL8_bb)Y}MD{2@jN=9WA{Bxe<&RzP&)m`d zNPy?T%)E)+CrL$F*JL>%RUI^V`0OecDxh zGRZSDZ0PuH!$WRPFMLt9yP?D+te<%VAFEld8L ze(cnW=ZB_Uay;p4x! zJ&$)}O$}ez&2mBf*wDRimB%AbBv;8F^RmtD9$eyU{|Yr|;g~In>Xuvd7JvJ0kV^iY_YE;WO#!)+uk^6#kZ#rCnCB zV(D_5HZ_^DeEFa+LxwDRcjHF9oyu211d-38^`KwoBS9RzxWBb>y9gi+q zlF^}N&CdO5)R0$SvEui(|NQgA^1_Auj_1xrAL`%#x9-oM@9`>wQ?o)t{o3c}w>ujW zQgzJIrH{u}t~_OS`}Q6&t5d>F8A-=@lOas3<3 znX}eDGIH_9++6!dVPVyxeSLjO?Ao=Zs)xtyd#6s>ea^|T$^YxG4|VM9W@eu_u|00q zth}h$*qY(DZoO|defs?&d-gP2U}2FoZSms4-hT8;Zm!U+ zTiVUnulM$jkH5SA-MfSC-@c8V=;Bh&cktkw2Zj$Hpe2m_us?L4IDWC&qj^92ie$Iw(Hw>-uXLsMr{1_ zY24)b^F!V~d9r`N$&>F|)T^g#`rB_OF7DkMb**~!<9ExKpFA%hpi08gqyN~ve?NNa z_U&)_KYiNfQcTRfO)XluCnhCv>5m^LEZ@KXRj)B)2G%Vs>~O;0|H^co?$qCp9<{zx zr%u-}@mql%{6lp#|AJi=Y4U=;7o^F_8N#Bme2M9BIM4tRZ9a!lLVhI@nuScqk@geD zdL1)4hNJ@{!lGhg@rkH!;}C&%4XrJpKjTPsL&!+~zmu0cPcwBc*55(ng2H!j<&{@y z-cJ067iX0QEhJL>?Wo^El8(Pq_`8k2eEbCt!%%Tt6qdmj)kESZT=`xOjf$}W6+38` zA??t185|mo-WUc2**K(en2uivEDRwT$2w!sF{PC%v>`5ySJOMmXD0?VX>m^kHY*Th zbT2kF$2oB%ry?=u_1Nwm^snO`FwX^JA77=3`~XaYG8vY)zC92kK@^;-bSj(w?OaXA?OySMWn+QXH#d zzeycQl=B^Aw)q3Iql_2r=rzxZPO+cWldb@J-uhFN5OU&bQ$Fxl}d(J{7z4S6H} z#SN+nRNlslt5_bI!V(tMnZ?oc`WA^L^dyXL4nG7%^?{j;ul|3QnOE89P$;yqpU{6u zS7?)n0dj3B(ID3@Bj(7pnZ!J~Hiwub*Ips!%e8q#PNDrulqj@TpFtai)}H7n)4CA# zGHn1cK&Bl{G|04z7!}$b#3Y&aHZe`6EhMJPv=zUASu(8+qg?Ao%#~@whFSa&m3Oub_<_9UT0xmuu^h*-@c&A?g*{0Ai9tn@mhoXg4u? zx%Lz@%e60w>G1yz%td%a;TnoSvp%vuwwBgmp--8?yw)0KeABg#U=--bo(~`KB5ex39u-a#L0e#CoP__N;!6qVTF$J%npqV8 zzSCM~rnf50i;$UpG!O>9Li9PLDzwO#)Lc&Es+jL)^QD+J$L8(i1#dspq1ZuC6iyL2 zuU{MzN*@4x?S!TSoJr_Ii1B&ER?zQ8yG7JQ`la0n)5h;)Z|+ardqwDBGc9$YeElT%A7RJb(>K+>s|)*9l18NHo(c+W ziGp2j=`+c!D16d_#^65t7MpBX88&LtGr#5@5hxlW{@A46%N5(62=f4ZL4h4r`mLz# z!F55~`OoK*A+c?_m1X)Ax+m!IYl3OM`b zh%#27&D;pj%jidVxmaexqe;#-o?(-G6jzd?RgQ+Rzi<~O>*VRt8E*J(aS(52W=%-S zBtDHrWqdkJGQO!!;R~{;p>YO(QX8dwU^2=ZK_d=YZG7zm_tc8TD~auK{Q2=YxbNZJ z#lLG0J?3Y8SeDYXDuv_a+LO=Xn8Bv_o5@)&Q98|Jd`_W|80C1jycR1KY73hwAs+0R z3v#?Ze3r3r;GVWhr@2XCO_4D_i`&yob#a;SsEWv`^?rT7>tE#B4zWtmyvYE5;XqqIpxqZkSnNDDF=z5XI%@ zg`&8f*w!pAr~2zxaYNlpX%mvczcBFI%hjuEXMRI|zO9V*l}=j{Q@;5!T|1&gu5%;W zD0KluE4eO#n4{FC5jnXolbEa29V6go|WrOttvCe!&4 z1LV3eqCu`pA|}aoi#T|Sa-AblqR{Dy zRtjANkyGfBi8cydI?+*~%O>g-y6eOMh3+NMpwL;#$gI>^6O$A=M`F56rzfT%JZ4tt zQixd!T?R1+;SqBY9x+d$%O~b5bP74yV-WtUF;7wr>08= zF=wJn12Lze%LGvs=x7}X=Ad*rFysBzT?aA8rF#jYUPbt}G&iQJ0itl}+JR`V>S&z@ z+OxX;Fr(e7O9Ihu)hz?jF4b)U(GJ$p`VX|1bvZDjeX65%9cahuuE31B6kR@u_N~sc zge|pOb+o<%6^yP1%xLH8Xq^XMWt~0Dm{Zj0LCodoLO{&D=n_D*b9E`80bB-RE>X7$ z#2lmU7>GGWT`q_@J>4U4IGA?Tmh?h(5|mfW)#$81w6}G%?nAujY%i=oj2epbuh4>E zV=7Rff+8PO5V5cd?TXL@Gp#j~nOBTMdk*zC9h=0TH$>qI12#0&BsMKcXPz7xH8#ne znM}~KgC196Og#)Ip&ByzC0PiB#bv|8qvAzZqK*|cm7&drwh%kB3~ec1Pb)SSx<9O? zj2QE(u97%ZGOQ(LJUNG!tri{o364Os7oY1$j9gL06B--_?FXX~`tzg#4^45L(i4nE zzQ1sMDy8oyJ7ml-9ODrgRWuapw3~&Tzw zHK|V_<3$-8+Ym%18JZsE@f7^CB{RkRQx@?X;vhYOJMmM&--wqZZ*Ay9j%Uo=(PxY| znvSX=|I|JdRw*!dLQ!GA=~E>JL2gZEK_?4!t+hdgI>1qGokYx$S*Hvlwg%-V;^<A?A9am&6%ciawGD{6z}lVCC0x{R4IGNiM9umn z)K`dM3v%crKVH{60ps52`eIa=-*=R8VO z{SYh(7nf>bBSf~@CCT{0VpHIrl!h?r3W{md=X_r+nAbp5*n)FYb@GP4Cc^y z>J}qa)Td=8>d#UzVpm#RGG1Ix2%wM|3$99Dt}yO)~WP_;=(#B_{tKQJ0c z=j&B5&ne!bOc*S{HUlOZdqzwmuFH;yqTY!(kixIa<_jdX@#&6O@ynN4=x;*8wpGPQ zB^&1!R7WLzXN?W0Q>{#D;A|f=UM{xEX-z;RdRumg5$X0vi^KVB{S&(v0*;B}H`=8= zOW58}PQHHRo{uTt{P&L;D)Dgj@$TfLclGzyckk*?Cyw!tf!zLVCn(gxjw(M&5``Uz zt_JN%O68vXk!(bB*1ci+5&ZpqpdIJz>*Ffc{fMMTR~ON}ztb=5vBB?uX^%~Qe__w+ zZyJ>Ng&pc)TjMu?#Y@OseprhgHN)cXkI6J7a1h!~CUXy0A2&}nW?+)Bp(9@LkcH>! z=Y#XAyLx*3OFDmLZ=O#2+MsZvEb;@z!iiigY-0x+VMnmC!^guUr}AVj6P@ugcTdmm zzItA_7Z1>wKZ2Y@>^^MMWh%L}&@NGufal57e6gb&`afoFTs?feaC{j5F*iO?Qy9hV z`3F|qo<5GeYPyiu?EV-CIV`Erm;gF0y{bDkqs)KusG17>bnZ3!qkOmq# zF{Z=E%NN5}NQdBuH&gcUVHD}f3NoQL%jTN+=%6hmQ$4am8z5b#Dj@1*DoHt_Qe{Q7 zQmU+pSu&LaF+iqrAsS>VJ)=?;LQGPsVu@A?RWgxNsM3jPN>w(|pimtnCdpLS85OFh z%wC~Vl!rV=p|U1sDO7I6bcHH}C{d`Ah-os_A|_X=GKn?_mzX0{%A$+1lsmdUx$yGVTbh+vZF-xv`O3aa~z7lig zDyvFFrK%p0Q>xk#^A##TVxB@3K@32?FtbvX&L~%95%tJtVy;4Ug_ti_Jz`X<3W>sn zwxNnEV@tZEDjN{RNaYBk|Ecl;@ljEQfoM~zMuX`8suqFhPpUS7Nnj3$ezGbT91cDL zQNgJSLG&+GmStK0Rb_*r4m5~VHDE^ZRM~)N52;*0v~g8_Ao`&yI_C%dYE=Zx$>3-Z z{ZCaIi2kQ46GYorbqt&eJ_6CtRTY5fzpA7tzv#cJYJh0#s_a3ukyS1rUTakti2k@L z1wS1xoI4Z7m;WK9arn@y>Z z8GCtCj~NpcPd;h0`}nu z2{EOOf<>CqRG?`YCttM8yt?}Ifr$D#=5gtY`lPrFkNPJW6%FINQv!ah@RwQBR#FN$}??Te;)k%b)7&9T;gD_`{jzG~J$;dysKMQwP;7;^Q@wyG!vSNOVyCe5s$sP7N z7xRhyTEZXgMJ~pV@}~x5HrQuelu`cLkUQu#i!z8Le#QLKJt80rGxN*x4KliKU_^W% zj)+FT9XfSUtSUr(LOl?)qEXrPg?|botF{jR{`$%)s4eOL)|9X0>gVtx*e3U4h3M=Mq0)J_;QAirJpoKr{$Dqf`7%XqXo$2wESaN88Uqj-;E;v)AeZpYHuMnY-C zzZlo@>dGj@iTyUkrA_^iX5#-6Nt^n9MdJq7RPXyzK)7t0{`<2?E6GXhzZZQLy?Af` zt-l>#iux-hyrBQx{e<9+`03dPQJ0*)ocudOW%mkK^gT}1@$a}8h$2xdu{V1Ms0@y_ z)k$(t-g^s<_8^RZyG~W+B$mH%MXZ00S2(7`_;|VCES*>^eWnkzIPnGjN|Kq2uqRF= z=M`#*3&BoCH1UQ$ow-rc9pg+;6=l0E3ftDwcvKOQ3+;VSL_*^dv4O=zEG#GNkpQJm zwpI_}m>VUX%m$n&l9X7uAu%(e8_v>0@?bA_CKK<$c}7OiAW*0fSHUQ8!Hl8-ub^m; z{vR`o_GaxEd?)ZO1`Ua!TjPzQ)=CK7i?xZIFoqu!(FqXSLhLttFYv2qI2^M>SiE}* z1XrQinhjoJ`Zu)-o^MsoBxu+|(nT=+C;k%P@27GRiXk=>3*X2XXjjtyn50{3`t21; zH51nvBk~;S4M#IG8ObD}^;hh={fqdgRO1BOqImSncqGIQjpNHFz5jI4xq4RhikAB< zygT%Mh!>gZ`(Y413A~DjI4iSP8&u z;l(84%rVRqV>@qgt_HbmJVVAL!){jC{X{ei)1|bdJo~PQa^szhHm3O=VX%$ns*T}< z(`Ewv<2TCqy%n$nTXaYyWtbQ?%TRMO?U5n~jc!OL%oCer{E0Y4&8EF>_%dg{yRzw? zQG$}Y=vT-!vz?etZqd(6NHpdv|G4OR8~qB(n4%dweq&h0WG@sPqkI0*z@8n_MDGKJ z41_1l1_V$rg`{GRf~~F?92glslC^Z0UI70bDGzBbidQqFmJ7`sGMNxG&7=rZVZ2-8 zEpZ-Qgy8>INvCl6WK$4g+9Oa@;&3(}q6`H`*2o}tX46pQPnfoWBjF~-^&T9Rag$$T zJ6}k<5E0{DO!Jrg-2{8KghkvJ>1Ua-axmUVa1$Sfy)5}e8E-+m0AfQqwi!3?4Ea=a zuI;BR`?Wn9eCG3OIC)2SQ%ol(i1TsAcZuDLpSLs0go1C@)xthItcgo)AF+NAr|Ec| z38uxt&xr=&JfAME*zDHH-MBu2-bDUHJ5q?C?8Eptv`Ogr7ANnn#?8k&g++x2L%D(` zNN7*5U)Y61RgzglKUad4R49m~{3+HJG|pm3^cOmp>^Gl%bjFWRougilf&u|_32F9E z_)Vun(KM9=t$wI9`wv1R4hjdsvBtW=E{5NH!qvmK2U6#QWg+3BtgBNCao-A)%)`gE zi>nuf8E!YiG`PZV0u0?$jO4&BB6LJ3v_;qsE7%$bGhD}x6B4Nmp}*$EHmBbdveX)5Mn z5qTUt(o1kllYPbg3o^kS_7ufjFR!3Hf~Cn+<|t!%8P05S?rPkCgvrDKv0~4xs2yg) zFls7 z3Y94fl-&5Zd;52Gb@K7`a+P3oh^aJ%2h;mxYRAx=S1&eqjrlaZWG1t*xQQ}khiT3W zegw0)`iP(B66EZC6~ZES#&=eb(L*h$*Mt%EO3i3ul3bHUOjl?!m>KsWIw~}|M7=_jM@+NO zydNa`G1j3;1~K@gnFme- zvp~%MX>!2D;B9aY_!Z0mEgQ4>KuryB7R*`@V-A{jAm$G>dT=Hf0H%ORAjYaR^T2W7 zCU82K11 zyH>mmqiD348oN^R9aIDm7?)r)nEJBDEj-yite5~YM4)*^_X`?k;2T7=H6gD^B{o+j zV*jeR4cb4n(1W#*=~GDuzr>)0O^pa+FbF#YYm>sz?+Zr1fEwWZ+H=+^z?Ys^w=3F{ z6#KQPc3D4@*VyO#!D8Q27;8kj=`=#V&r8{b?O=soIi;(JT*yht(Dz1TmrtQdsgHNh z+o2Q65{5(~W3Zzo>pEbaHO>qtAGD1--1B>_qDg6{mMr#n(ViCa6dHP1c2Ds!+F@(x z&_L`*iq+?XF?MXGE^U;FzC<@+_@0ZuvFOJbPxElaq>Jt%={V_dj5vz@P~m=&*!dd0 zG^7&icaRXHd-Pe&!()4Y7V|3>NYM}9)<+@&BWYOJ7#1&QC)v<8hd2qwRNh3t!v1|m zKNKOvi-jb*p{HLw{v$)9Suc_fj$`)}24bijp;;InPWu3ec`n!)701aA%Pm>Dg}q+Q z`abm7P&5V!;Ue)+hc&$)#@E8wH)dn~lx`s`?9)mEzo=GBGNE6OA#=9dsnIRguJapG z7*pVC~N7$)Ua3sc5j2E5R##@>0Ap{|zCX85N zuw#4pPP*}2K1vId7prHO>=*TqI3^Gp6%2puZK1&^Xe^ix1s*2Elb)F|?sOkPF6eWz z!`+1P%Bnyy4PqI_Udkb%p$7DWB2mF56nU2@?9j-lxWQpeOCN4%?7@^QnAwIHRC7Qr zAN?r4n@V!prWnb^vILy?YEnO@FwE_+<$oYkiiMnVqGh(i@KbS(!n$03 zq=a_RrCK2d{UEb^GplD}Fc5$O75b}s%xFhjM0V)ag zHw>Q@n#nago0y6e%tgz3@hld{EyP+tG>dDG#cvSSBSPmc3{4Z0p0V(3SV~2IrU4_q ze28-74?pLJAsjI%(T>J3&Bs4bsfi;=*#DdlhcDyeFfyOHysY>g@lA(LG3#6NI+!qv zeQi^p*C-PP7Xl4f7y^aT1OxoXMB1{md4+y03(M4hWs4c ziJ<&qW;%2k+Mi~R3S%(n7n2-Xm_|1!F6>}n_~Y&QJ&bvKI(1689|l*bgG%A^?&1)0 z;a({0IPZ~7>@$D3Z!pe^WWQd< zSt6_qh{ShMixphq#@6jv(6#m)Twtfp}I zV<0KNOfp`<)F>Mk#J~R3%{CoSfaojy#LIkU9(=1|hqO zxTV{R>a@(Q*w~?$gC4LL2cw)Hcq{4_tGW^l%sES=S;6JaeXw9aNR>a^-=B|>7#APW z{ug$>KAp^h zK8_f}Em~ib*#-L&^Q!M?gTd_D$!KI|^SF_{-YjlprhSb?|I~tI6(HgWO;9W#$G~rR z0{=TE4u=9HNTM*z$<7TBMl)IS&EMGUXL}*Epd(uCSoM$7=rR0({SnM$d=u4N&fXL= zcVx!-hV%i1Go$~ZA%j?`B%}Q~TKMxp3Er`vCsoX>_)DFZPnc9t*D^mv$vt;TBVv6Af~I-mQJ9R zLS2LCSVnD6

    T*W>%;JhI`ClLcN1%P^hmE)79#HX0K37onf|8 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

    t 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¨2pCgoT*qu$m=4&axP2*=$b}J9B_Re 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 z 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

    r`KAU1i_ZSfGb#>}Pt=qf^#(3^1lHA3nJ& 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

    ka~p8f%l3BJGbvrY5W=gy%7;wu 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

    rB_3KwT6_0Gd=QTmV%*xB#Ls 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
    hHwibxP#UIit`4r*kAR+GDd%f8N9$N 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

    ;NZ$N74&6P*1;G8m6I|b`ijIZ_L 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

    E8YdvnmIp*PC;w0w(ckN(8% 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

    bk4R`rQEBWhwxFl$l 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 %`rIjrODp= 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 SUH3P4-p>9-{g9v4mwyc6Hu>rR literal 0 HcmV?d00001 diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/.checkignore b/NodeRed/NodeRedFiles/pika-0.13.1/.checkignore new file mode 100644 index 000000000..e5a2365ca --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/.checkignore @@ -0,0 +1,5 @@ +**/docs +**/examples +**/test +**/utils +setup.py diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/.codeclimate.yml b/NodeRed/NodeRedFiles/pika-0.13.1/.codeclimate.yml new file mode 100644 index 000000000..ba9e7cc78 --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/.codeclimate.yml @@ -0,0 +1,8 @@ +languages: + - python +exclude_paths: + - docs/* + - tests/* + - utils/* + - pika/examples/* + - pika/spec.py diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/.coveragerc b/NodeRed/NodeRedFiles/pika-0.13.1/.coveragerc new file mode 100644 index 000000000..16b0aa24c --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/.coveragerc @@ -0,0 +1,2 @@ +[run] +omit = pika/spec.py diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/.github/ISSUE_TEMPLATE.md b/NodeRed/NodeRedFiles/pika-0.13.1/.github/ISSUE_TEMPLATE.md new file mode 100644 index 000000000..97428b0c5 --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,15 @@ +Thank you for using Pika. + +GitHub issues are **strictly** used for actionable work and pull +requests. + +Pika's maintainers do NOT use GitHub issues for questions, root cause +analysis, conversations, code reviews, etc. + +Please direct all non-work issues to either the `pika-python` or +`rabbitmq-users` mailing list: + +* https://groups.google.com/forum/#!forum/pika-python +* https://groups.google.com/forum/#!forum/rabbitmq-users + +Thank you diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/.github/PULL_REQUEST_TEMPLATE.md b/NodeRed/NodeRedFiles/pika-0.13.1/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 000000000..13131ca02 --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,43 @@ +## Proposed Changes + +Please describe the big picture of your changes here to communicate to +the Pika team why we should accept this pull request. If it fixes a bug +or resolves a feature request, be sure to link to that issue. + +A pull request that doesn't explain **why** the change was made has a +much lower chance of being accepted. + +If English isn't your first language, don't worry about it and try to +communicate the problem you are trying to solve to the best of your +abilities. As long as we can understand the intent, it's all good. + +## Types of Changes + +What types of changes does your code introduce to this project? +_Put an `x` in the boxes that apply_ + +- [ ] Bugfix (non-breaking change which fixes issue #NNNN) +- [ ] New feature (non-breaking change which adds functionality) +- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected) +- [ ] Documentation (correction or otherwise) +- [ ] Cosmetics (whitespace, appearance) + +## Checklist + +_Put an `x` in the boxes that apply. You can also fill these out after +creating the PR. If you're unsure about any of them, don't hesitate to +ask on the +[`pika-python`](https://groups.google.com/forum/#!forum/pika-python) +mailing list. We're here to help! This is simply a reminder of what we +are going to look for before merging your code._ + +- [ ] I have read the `CONTRIBUTING.md` document +- [ ] All tests pass locally with my changes +- [ ] I have added tests that prove my fix is effective or that my feature works +- [ ] I have added necessary documentation (if appropriate) + +## Further Comments + +If this is a relatively large or complex change, kick off the discussion +by explaining why you chose the solution you did and what alternatives +you considered, etc. diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/.gitignore b/NodeRed/NodeRedFiles/pika-0.13.1/.gitignore new file mode 100644 index 000000000..8d1682e26 --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/.gitignore @@ -0,0 +1,20 @@ +*.pyc +*~ +.idea +.coverage +.tox +.DS_Store +.python-version +pika.iml +codegen +pika.egg-info +debug/ +examples/pika +examples/blocking/pika +atlassian*xml +build +dist +docs/_build +venv*/ +env/ +testdata/*.conf diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/.travis.yml b/NodeRed/NodeRedFiles/pika-0.13.1/.travis.yml new file mode 100644 index 000000000..a359dff13 --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/.travis.yml @@ -0,0 +1,103 @@ +language: python + +sudo: false + +addons: + apt: + sources: + - sourceline: deb https://packages.erlang-solutions.com/ubuntu trusty contrib + key_url: https://packages.erlang-solutions.com/ubuntu/erlang_solutions.asc + packages: + # apt-cache show erlang-nox=1:20.3-1 | grep Depends | tr ' ' '\n' | grep erlang | grep -v erlang-base-hipe | tr -d ',' | sed 's/$/=1:20.3-1/' + - erlang-nox + +env: + global: + - RABBITMQ_VERSION=3.7.8 + - RABBITMQ_DOWNLOAD_URL="https://github.com/rabbitmq/rabbitmq-server/releases/download/v$RABBITMQ_VERSION/rabbitmq-server-generic-unix-$RABBITMQ_VERSION.tar.xz" + - RABBITMQ_TAR="rabbitmq-$RABBITMQ_VERSION.tar.xz" + - PATH=$HOME/.local/bin:$PATH + - AWS_DEFAULT_REGION=us-east-1 + - secure: "Eghft2UgJmWuCgnqz6O+KV5F9AERzUbKIeXkcw7vsFAVdkB9z01XgqVLhQ6N+n6i8mkiRDkc0Jes6htVtO4Hi6lTTFeDhu661YCXXTFdRdsx+D9v5bgw8Q2bP41xFy0iao7otYqkzFKIo32Q2cUYzMUqXlS661Yai5DXldr3mjM=" + - secure: "LjieH/Yh0ng5gwT6+Pl3rL7RMxxb/wOlogoLG7cS99XKdX6N4WRVFvWbHWwCxoVr0be2AcyQynu4VOn+0jC8iGfQjkJZ7UrJjZCDGWbNjAWrNcY0F9VdretFDy8Vn2sHfBXq8fINqszJkgTnmbQk8dZWUtj0m/RNVnOBeBcsIOU=" + +stages: +- test +- name: coverage + if: repo = pika/pika +- name: deploy + if: tag IS present + +cache: + apt: true + directories: + - $HOME/.cache + +install: + - pip install -r test-requirements.txt + - pip install awscli==1.11.18 + - if [ ! -d "$HOME/.cache" ]; then mkdir "$HOME/.cache"; fi + - if [ -s "$HOME/.cache/$RABBITMQ_TAR" ]; then echo "[INFO] found cached $RABBITMQ_TAR file"; else wget -O "$HOME/.cache/$RABBITMQ_TAR" "$RABBITMQ_DOWNLOAD_URL"; fi + - tar -C "$TRAVIS_BUILD_DIR" -xvf "$HOME/.cache/$RABBITMQ_TAR" + - sed -e "s#PIKA_DIR#$TRAVIS_BUILD_DIR#g" "$TRAVIS_BUILD_DIR/testdata/rabbitmq.conf.in" > "$TRAVIS_BUILD_DIR/testdata/rabbitmq.conf" + +before_script: + - pip freeze + - /bin/sh -c "RABBITMQ_PID_FILE=$TRAVIS_BUILD_DIR/rabbitmq.pid RABBITMQ_CONFIG_FILE=$TRAVIS_BUILD_DIR/testdata/rabbitmq $TRAVIS_BUILD_DIR/rabbitmq_server-$RABBITMQ_VERSION/sbin/rabbitmq-server &" + - /bin/sh "$TRAVIS_BUILD_DIR/rabbitmq_server-$RABBITMQ_VERSION/sbin/rabbitmqctl" wait "$TRAVIS_BUILD_DIR/rabbitmq.pid" + - /bin/sh "$TRAVIS_BUILD_DIR/rabbitmq_server-$RABBITMQ_VERSION/sbin/rabbitmqctl" status + +script: + # See https://github.com/travis-ci/travis-ci/issues/1066 and https://github.com/pika/pika/pull/984#issuecomment-370565220 + # as to why 'set -e' and 'set +e' are added here + - set -e + - nosetests + - PIKA_TEST_TLS=true nosetests + - set +e + +after_success: + - aws s3 cp .coverage "s3://com-gavinroy-travis/pika/$TRAVIS_BUILD_NUMBER/.coverage.${TRAVIS_PYTHON_VERSION}" + +jobs: + include: + - python: pypy3 + - python: pypy + - python: 2.7 + - python: 3.4 + - python: 3.5 + - python: 3.6 + - python: 3.7 + dist: xenial # required for Python 3.7 (travis-ci/travis-ci#9069) + - stage: coverage + if: fork = false OR type != pull_request + python: 3.6 + services: [] + install: + - pip install awscli coverage codecov + before_script: [] + script: + - mkdir coverage + - aws s3 cp --recursive s3://com-gavinroy-travis/pika/$TRAVIS_BUILD_NUMBER/ coverage + - cd coverage + - coverage combine + - cd .. + - mv coverage/.coverage . + - coverage report + after_success: codecov + - stage: deploy + if: repo = pika/pika + python: 3.6 + services: [] + install: true + before_script: [] + script: true + after_success: [] + deploy: + distributions: sdist bdist_wheel + provider: pypi + user: crad + on: + tags: true + all_branches: true + password: + secure: "V/JTU/X9C6uUUVGEAWmWWbmKW7NzVVlC/JWYpo05Ha9c0YV0vX4jOfov2EUAphM0WwkD/MRhz4dq3kCU5+cjHxR3aTSb+sbiElsCpaciaPkyrns+0wT5MCMO29Lpnq2qBLc1ePR1ey5aTWC/VibgFJOL7H/3wyvukL6ZaCnktYk=" diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/CHANGELOG.rst b/NodeRed/NodeRedFiles/pika-0.13.1/CHANGELOG.rst new file mode 100644 index 000000000..8a7578d77 --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/CHANGELOG.rst @@ -0,0 +1,760 @@ +Version History +=============== + +0.13.1 2019-03-07 +----------------- + +`GitHub milestone `_ + +0.13.0 2019-01-17 +----------------- + +`GitHub milestone `_ + +- `AsyncioConnection`, `TornadoConnection` and `TwistedProtocolConnection` are no longer auto-imported (`PR `_) +- Python `3.7` support (`Issue `_) + +0.12.0 2018-06-19 +----------------- + +`GitHub milestone `_ + +This is an interim release prior to version `1.0.0`. It includes the following backported pull requests and commits from the `master` branch: + +- `PR #908 `_ +- `PR #910 `_ +- `PR #918 `_ +- `PR #920 `_ +- `PR #924 `_ +- `PR #937 `_ +- `PR #938 `_ +- `PR #933 `_ +- `PR #940 `_ +- `PR #932 `_ +- `PR #928 `_ +- `PR #934 `_ +- `PR #915 `_ +- `PR #946 `_ +- `PR #947 `_ +- `PR #952 `_ +- `PR #956 `_ +- `PR #966 `_ +- `PR #975 `_ +- `PR #978 `_ +- `PR #981 `_ +- `PR #994 `_ +- `PR #1007 `_ +- `PR #1045 `_ (manually backported) +- `PR #1011 `_ + +Commits: + +Travis CI fail fast - 3f0e739 + +New features: + +`BlockingConnection` now supports the `add_callback_threadsafe` method which allows a function to be executed correctly on the IO loop thread. The main use-case for this is as follows: + +- Application sets up a thread for `BlockingConnection` and calls `basic_consume` on it +- When a message is received, work is done on another thread +- When the work is done, the worker uses `connection.add_callback_threadsafe` to call the `basic_ack` method on the channel instance. + +Please see `examples/basic_consumer_threaded.py` for an example. As always, `SelectConnection` and a fully async consumer/publisher is the preferred method of using Pika. + +Heartbeats are now sent at an interval equal to 1/2 of the negotiated idle connection timeout. RabbitMQ's default timeout value is 60 seconds, so heartbeats will be sent at a 30 second interval. In addition, Pika's check for an idle connection will be done at an interval equal to the timeout value plus 5 seconds to allow for delays. This results in an interval of 65 seconds by default. + +0.11.2 2017-11-30 +----------------- + +`GitHub milestone `_ + +`0.11.2 `_ + +- Remove `+` character from platform releases string (`PR `_) + +0.11.1 2017-11-27 +----------------- + +`GitHub milestone `_ + +`0.11.1 `_ + +- Fix `BlockingConnection` to ensure event loop exits (`PR `_) +- Heartbeat timeouts will use the client value if specified (`PR `_) +- Allow setting some common TCP options (`PR `_) +- Errors when decoding Unicode are ignored (`PR `_) +- Fix large number encoding (`PR `_) + +0.11.0 2017-07-29 +----------------- + +`GitHub milestone `_ + +`0.11.0 `_ + + - Simplify Travis CI configuration for OS X. + - Add `asyncio` connection adapter for Python 3.4 and newer. + - Connection failures that occur after the socket is opened and before the + AMQP connection is ready to go are now reported by calling the connection + error callback. Previously these were not consistently reported. + - In BaseConnection.close, call _handle_ioloop_stop only if the connection is + already closed to allow the asynchronous close operation to complete + gracefully. + - Pass error information from failed socket connection to user callbacks + on_open_error_callback and on_close_callback with result_code=-1. + - ValueError is raised when a completion callback is passed to an asynchronous + (nowait) Channel operation. It's an application error to pass a non-None + completion callback with an asynchronous request, because this callback can + never be serviced in the asynchronous scenario. + - `Channel.basic_reject` fixed to allow `delivery_tag` to be of type `long` + as well as `int`. (by quantum5) + - Implemented support for blocked connection timeouts in + `pika.connection.Connection`. This feature is available to all pika adapters. + See `pika.connection.ConnectionParameters` docstring to learn more about + `blocked_connection_timeout` configuration. + - Deprecated the `heartbeat_interval` arg in `pika.ConnectionParameters` in + favor of the `heartbeat` arg for consistency with the other connection + parameters classes `pika.connection.Parameters` and `pika.URLParameters`. + - When the `port` arg is not set explicitly in `ConnectionParameters` + constructor, but the `ssl` arg is set explicitly, then set the port value to + to the default AMQP SSL port if SSL is enabled, otherwise to the default + AMQP plaintext port. + - `URLParameters` will raise ValueError if a non-empty URL scheme other than + {amqp | amqps | http | https} is specified. + - `InvalidMinimumFrameSize` and `InvalidMaximumFrameSize` exceptions are + deprecated. pika.connection.Parameters.frame_max property setter now raises + the standard `ValueError` exception when the value is out of bounds. + - Removed deprecated parameter `type` in `Channel.exchange_declare` and + `BlockingChannel.exchange_declare` in favor of the `exchange_type` arg that + doesn't overshadow the builtin `type` keyword. + - Channel.close() on OPENING channel transitions it to CLOSING instead of + raising ChannelClosed. + - Channel.close() on CLOSING channel raises `ChannelAlreadyClosing`; used to + raise `ChannelClosed`. + - Connection.channel() raises `ConnectionClosed` if connection is not in OPEN + state. + - When performing graceful close on a channel and `Channel.Close` from broker + arrives while waiting for CloseOk, don't release the channel number until + CloseOk arrives to avoid race condition that may lead to a new channel + receiving the CloseOk that was destined for the closing channel. + - The `backpressure_detection` option of `ConnectionParameters` and + `URLParameters` property is DEPRECATED in favor of `Connection.Blocked` and + `Connection.Unblocked`. See `Connection.add_on_connection_blocked_callback`. + +0.10.0 2015-09-02 +----------------- + +`0.10.0 `_ + + - a9bf96d - LibevConnection: Fixed dict chgd size during iteration (Michael Laing) + - 388c55d - SelectConnection: Fixed KeyError exceptions in IOLoop timeout executions (Shinji Suzuki) + - 4780de3 - BlockingConnection: Add support to make BlockingConnection a Context Manager (@reddec) + +0.10.0b2 2015-07-15 +------------------- + + - f72b58f - Fixed failure to purge _ConsumerCancellationEvt from BlockingChannel._pending_events during basic_cancel. (Vitaly Kruglikov) + +0.10.0b1 2015-07-10 +------------------- + +High-level summary of notable changes: + +- Change to 3-Clause BSD License +- Python 3.x support +- Over 150 commits from 19 contributors +- Refactoring of SelectConnection ioloop +- This major release contains certain non-backward-compatible API changes as + well as significant performance improvements in the `BlockingConnection` + adapter. +- Non-backward-compatible changes in `Channel.add_on_return_callback` callback's + signature. +- The `AsyncoreConnection` adapter was retired + +**Details** + +Python 3.x: this release introduces python 3.x support. Tested on Python 3.3 +and 3.4. + +`AsyncoreConnection`: Retired this legacy adapter to reduce maintenance burden; +the recommended replacement is the `SelectConnection` adapter. + +`SelectConnection`: ioloop was refactored for compatibility with other ioloops. + +`Channel.add_on_return_callback`: The callback is now passed the individual +parameters channel, method, properties, and body instead of a tuple of those +values for congruence with other similar callbacks. + +`BlockingConnection`: This adapter underwent a makeover under the hood and +gained significant performance improvements as well as enhanced timer +resolution. It is now implemented as a client of the `SelectConnection` adapter. + +Below is an overview of the `BlockingConnection` and `BlockingChannel` API +changes: + + - Recursion: the new implementation eliminates callback recursion that + sometimes blew out the stack in the legacy implementation (e.g., + publish -> consumer_callback -> publish -> consumer_callback, etc.). While + `BlockingConnection.process_data_events` and `BlockingConnection.sleep` may + still be called from the scope of the blocking adapter's callbacks in order + to process pending I/O, additional callbacks will be suppressed whenever + `BlockingConnection.process_data_events` and `BlockingConnection.sleep` are + nested in any combination; in that case, the callback information will be + bufferred and dispatched once nesting unwinds and control returns to the + level-zero dispatcher. + - `BlockingConnection.connect`: this method was removed in favor of the + constructor as the only way to establish connections; this reduces + maintenance burden, while improving reliability of the adapter. + - `BlockingConnection.process_data_events`: added the optional parameter + `time_limit`. + - `BlockingConnection.add_on_close_callback`: removed; legacy raised + `NotImplementedError`. + - `BlockingConnection.add_on_open_callback`: removed; legacy raised + `NotImplementedError`. + - `BlockingConnection.add_on_open_error_callback`: removed; legacy raised + `NotImplementedError`. + - `BlockingConnection.add_backpressure_callback`: not supported + - `BlockingConnection.set_backpressure_multiplier`: not supported + - `BlockingChannel.add_on_flow_callback`: not supported; per docstring in + channel.py: "Note that newer versions of RabbitMQ will not issue this but + instead use TCP backpressure". + - `BlockingChannel.flow`: not supported + - `BlockingChannel.force_data_events`: removed as it is no longer necessary + following redesign of the adapter. + - Removed the `nowait` parameter from `BlockingChannel` methods, forcing + `nowait=False` (former API default) in the implementation; this is more + suitable for the blocking nature of the adapter and its error-reporting + strategy; this concerns the following methods: `basic_cancel`, + `confirm_delivery`, `exchange_bind`, `exchange_declare`, `exchange_delete`, + `exchange_unbind`, `queue_bind`, `queue_declare`, `queue_delete`, and + `queue_purge`. + - `BlockingChannel.basic_cancel`: returns a sequence instead of None; for a + `no_ack=True` consumer, `basic_cancel` returns a sequence of pending + messages that arrived before broker confirmed the cancellation. + - `BlockingChannel.consume`: added new optional kwargs `arguments` and + `inactivity_timeout`. Also, raises ValueError if the consumer creation + parameters don't match those used to create the existing queue consumer + generator, if any; this happens when you break out of the consume loop, then + call `BlockingChannel.consume` again with different consumer-creation args + without first cancelling the previous queue consumer generator via + `BlockingChannel.cancel`. The legacy implementation would silently resume + consuming from the existing queue consumer generator even if the subsequent + `BlockingChannel.consume` was invoked with a different queue name, etc. + - `BlockingChannel.cancel`: returns 0; the legacy implementation tried to + return the number of requeued messages, but this number was not accurate + as it didn't include the messages returned by the Channel class; this count + is not generally useful, so returning 0 is a reasonable replacement. + - `BlockingChannel.open`: removed in favor of having a single mechanism for + creating a channel (`BlockingConnection.channel`); this reduces maintenance + burden, while improving reliability of the adapter. + - `BlockingChannel.confirm_delivery`: raises UnroutableError when unroutable + messages that were sent prior to this call are returned before we receive + Confirm.Select-ok. + - `BlockingChannel.basic_publish: always returns True when delivery + confirmation is not enabled (publisher-acks = off); the legacy implementation + returned a bool in this case if `mandatory=True` to indicate whether the + message was delivered; however, this was non-deterministic, because + Basic.Return is asynchronous and there is no way to know how long to wait + for it or its absence. The legacy implementation returned None when + publishing with publisher-acks = off and `mandatory=False`. The new + implementation always returns True when publishing while + publisher-acks = off. + - `BlockingChannel.publish`: a new alternate method (vs. `basic_publish`) for + publishing a message with more detailed error reporting via UnroutableError + and NackError exceptions. + - `BlockingChannel.start_consuming`: raises pika.exceptions.RecursionError if + called from the scope of a `BlockingConnection` or `BlockingChannel` + callback. + - `BlockingChannel.get_waiting_message_count`: new method; returns the number + of messages that may be retrieved from the current queue consumer generator + via `BasicChannel.consume` without blocking. + +**Commits** + + - 5aaa753 - Fixed SSL import and removed no_ack=True in favor of explicit AMQP message handling based on deferreds (skftn) + - 7f222c2 - Add checkignore for codeclimate (Gavin M. Roy) + - 4dec370 - Implemented BlockingChannel.flow; Implemented BlockingConnection.add_on_connection_blocked_callback; Implemented BlockingConnection.add_on_connection_unblocked_callback. (Vitaly Kruglikov) + - 4804200 - Implemented blocking adapter acceptance test for exchange-to-exchange binding. Added rudimentary validation of BasicProperties passthru in blocking adapter publish tests. Updated CHANGELOG. (Vitaly Kruglikov) + - 4ec07fd - Fixed sending of data in TwistedProtocolConnection (Vitaly Kruglikov) + - a747fb3 - Remove my copyright from forward_server.py test utility. (Vitaly Kruglikov) + - 94246d2 - Return True from basic_publish when pubacks is off. Implemented more blocking adapter accceptance tests. (Vitaly Kruglikov) + - 3ce013d - PIKA-609 Wait for broker to dispatch all messages to client before cancelling consumer in TestBasicCancelWithNonAckableConsumer and TestBasicCancelWithAckableConsumer (Vitaly Kruglikov) + - 293f778 - Created CHANGELOG entry for release 0.10.0. Fixed up callback documentation for basic_get, basic_consume, and add_on_return_callback. (Vitaly Kruglikov) + - 16d360a - Removed the legacy AsyncoreConnection adapter in favor of the recommended SelectConnection adapter. (Vitaly Kruglikov) + - 240a82c - Defer creation of poller's event loop interrupt socket pair until start is called, because some SelectConnection users (e.g., BlockingConnection adapter) don't use the event loop, and these sockets would just get reported as resource leaks. (Vitaly Kruglikov) + - aed5cae - Added EINTR loops in select_connection pollers. Addressed some pylint findings, including an error or two. Wrap socket.send and socket.recv calls in EINTR loops Use the correct exception for socket.error and select.error and get errno depending on python version. (Vitaly Kruglikov) + - 498f1be - Allow passing exchange, queue and routing_key as text, handle short strings as text in python3 (saarni) + - 9f7f243 - Restored basic_consume, basic_cancel, and add_on_cancel_callback (Vitaly Kruglikov) + - 18c9909 - Reintroduced BlockingConnection.process_data_events. (Vitaly Kruglikov) + - 4b25cb6 - Fixed BlockingConnection/BlockingChannel acceptance and unit tests (Vitaly Kruglikov) + - bfa932f - Facilitate proper connection state after BasicConnection._adapter_disconnect (Vitaly Kruglikov) + - 9a09268 - Fixed BlockingConnection test that was failing with ConnectionClosed error. (Vitaly Kruglikov) + - 5a36934 - Copied synchronous_connection.py from pika-synchronous branch Fixed pylint findings Integrated SynchronousConnection with the new ioloop in SelectConnection Defined dedicated message classes PolledMessage and ConsumerMessage and moved from BlockingChannel to module-global scope. Got rid of nowait args from BlockingChannel public API methods Signal unroutable messages via UnroutableError exception. Signal Nack'ed messages via NackError exception. These expose more information about the failure than legacy basic_publich API. Removed set_timeout and backpressure callback methods Restored legacy `is_open`, etc. property names (Vitaly Kruglikov) + - 6226dc0 - Remove deprecated --use-mirrors (Gavin M. Roy) + - 1a7112f - Raise ConnectionClosed when sending a frame with no connection (#439) (Gavin M. Roy) + - 9040a14 - Make delivery_tag non-optional (#498) (Gavin M. Roy) + - 86aabc2 - Bump version (Gavin M. Roy) + - 562075a - Update a few testing things (Gavin M. Roy) + - 4954d38 - use unicode_type in blocking_connection.py (Antti Haapala) + - 133d6bc - Let Travis install ordereddict for Python 2.6, and ttest 3.3, 3.4 too. (Antti Haapala) + - 0d2287d - Pika Python 3 support (Antti Haapala) + - 3125c79 - SSLWantRead is not supported before python 2.7.9 and 3.3 (Will) + - 9a9c46c - Fixed TestDisconnectDuringConnectionStart: it turns out that depending on callback order, it might get either ProbableAuthenticationError or ProbableAccessDeniedError. (Vitaly Kruglikov) + - cd8c9b0 - A fix the write starvation problem that we see with tornado and pika (Will) + - 8654fbc - SelectConnection - make interrupt socketpair non-blocking (Will) + - 4f3666d - Added copyright in forward_server.py and fixed NameError bug (Vitaly Kruglikov) + - f8ebbbc - ignore docs (Gavin M. Roy) + - a344f78 - Updated codeclimate config (Gavin M. Roy) + - 373c970 - Try and fix pathing issues in codeclimate (Gavin M. Roy) + - 228340d - Ignore codegen (Gavin M. Roy) + - 4db0740 - Add a codeclimate config (Gavin M. Roy) + - 7e989f9 - Slight code re-org, usage comment and better naming of test file. (Will) + - 287be36 - Set up _kqueue member of KQueuePoller before calling super constructor to avoid exception due to missing _kqueue member. Call `self._map_event(event)` instead of `self._map_event(event.filter)`, because `KQueuePoller._map_event()` assumes it's getting an event, not an event filter. (Vitaly Kruglikov) + - 62810fb - Fix issue #412: reset BlockingConnection._read_poller in BlockingConnection._adapter_disconnect() to guard against accidental access to old file descriptor. (Vitaly Kruglikov) + - 03400ce - Rationalise adapter acceptance tests (Will) + - 9414153 - Fix bug selecting non epoll poller (Will) + - 4f063df - Use user heartbeat setting if server proposes none (Pau Gargallo) + - 9d04d6e - Deactivate heartbeats when heartbeat_interval is 0 (Pau Gargallo) + - a52a608 - Bug fix and review comments. (Will) + - e3ebb6f - Fix incorrect x-expires argument in acceptance tests (Will) + - 294904e - Get BlockingConnection into consistent state upon loss of TCP/IP connection with broker and implement acceptance tests for those cases. (Vitaly Kruglikov) + - 7f91a68 - Make SelectConnection behave like an ioloop (Will) + - dc9db2b - Perhaps 5 seconds is too agressive for travis (Gavin M. Roy) + - c23e532 - Lower the stuck test timeout (Gavin M. Roy) + - 1053ebc - Late night bug (Gavin M. Roy) + - cd6c1bf - More BaseConnection._handle_error cleanup (Gavin M. Roy) + - a0ff21c - Fix the test to work with Python 2.6 (Gavin M. Roy) + - 748e8aa - Remove pypy for now (Gavin M. Roy) + - 1c921c1 - Socket close/shutdown cleanup (Gavin M. Roy) + - 5289125 - Formatting update from PR (Gavin M. Roy) + - d235989 - Be more specific when calling getaddrinfo (Gavin M. Roy) + - b5d1b31 - Reflect the method name change in pika.callback (Gavin M. Roy) + - df7d3b7 - Cleanup BlockingConnection in a few places (Gavin M. Roy) + - cd99e1c - Rename method due to use in BlockingConnection (Gavin M. Roy) + - 7e0d1b3 - Use google style with yapf instead of pep8 (Gavin M. Roy) + - 7dc9bab - Refactor socket writing to not use sendall #481 (Gavin M. Roy) + - 4838789 - Dont log the fd #521 (Gavin M. Roy) + - 765107d - Add Connection.Blocked callback registration methods #476 (Gavin M. Roy) + - c15b5c1 - Fix _blocking typo pointed out in #513 (Gavin M. Roy) + - 759ac2c - yapf of codegen (Gavin M. Roy) + - 9dadd77 - yapf cleanup of codegen and spec (Gavin M. Roy) + - ddba7ce - Do not reject consumers with no_ack=True #486 #530 (Gavin M. Roy) + - 4528a1a - yapf reformatting of tests (Gavin M. Roy) + - e7b6d73 - Remove catching AttributError (#531) (Gavin M. Roy) + - 41ea5ea - Update README badges [skip ci] (Gavin M. Roy) + - 6af987b - Add note on contributing (Gavin M. Roy) + - 161fc0d - yapf formatting cleanup (Gavin M. Roy) + - edcb619 - Add PYPY to travis testing (Gavin M. Roy) + - 2225771 - Change the coverage badge (Gavin M. Roy) + - 8f7d451 - Move to codecov from coveralls (Gavin M. Roy) + - b80407e - Add confirm_delivery to example (Andrew Smith) + - 6637212 - Update base_connection.py (bstemshorn) + - 1583537 - #544 get_waiting_message_count() (markcf) + - 0c9be99 - Fix #535: pass expected reply_code and reply_text from method frame to Connection._on_disconnect from Connection._on_connection_closed (Vitaly Kruglikov) + - d11e73f - Propagate ConnectionClosed exception out of BlockingChannel._send_method() and log ConnectionClosed in BlockingConnection._on_connection_closed() (Vitaly Kruglikov) + - 63d2951 - Fix #541 - make sure connection state is properly reset when BlockingConnection._check_state_on_disconnect raises ConnectionClosed. This supplements the previously-merged PR #450 by getting the connection into consistent state. (Vitaly Kruglikov) + - 71bc0eb - Remove unused self.fd attribute from BaseConnection (Vitaly Kruglikov) + - 8c08f93 - PIKA-532 Removed unnecessary params (Vitaly Kruglikov) + - 6052ecf - PIKA-532 Fix bug in BlockingConnection._handle_timeout that was preventing _on_connection_closed from being called when not closing. (Vitaly Kruglikov) + - 562aa15 - pika: callback: Display exception message when callback fails. (Stuart Longland) + - 452995c - Typo fix in connection.py (Andrew) + - 361c0ad - Added some missing yields (Robert Weidlich) + - 0ab5a60 - Added complete example for python twisted service (Robert Weidlich) + - 4429110 - Add deployment and webhooks (Gavin M. Roy) + - 7e50302 - Fix has_content style in codegen (Andrew Grigorev) + - 28c2214 - Fix the trove categorization (Gavin M. Roy) + - de8b545 - Ensure frames can not be interspersed on send (Gavin M. Roy) + - 8fe6bdd - Fix heartbeat behaviour after connection failure. (Kyösti Herrala) + - c123472 - Updating BlockingChannel.basic_get doc (it does not receive a callback like the rest of the adapters) (Roberto Decurnex) + - b5f52fb - Fix number of arguments passed to _on_return callback (Axel Eirola) + - 765139e - Lower default TIMEOUT to 0.01 (bra-fsn) + - 6cc22a5 - Fix confirmation on reconnects (bra-fsn) + - f4faf0a - asynchronous publisher and subscriber examples refactored to follow the StepDown rule (Riccardo Cirimelli) + +0.9.14 - 2014-07-11 +------------------- + +`0.9.14 `_ + + - 57fe43e - fix test to generate a correct range of random ints (ml) + - 0d68dee - fix async watcher for libev_connection (ml) + - 01710ad - Use default username and password if not specified in URLParameters (Sean Dwyer) + - fae328e - documentation typo (Jeff Fein-Worton) + - afbc9e0 - libev_connection: reset_io_watcher (ml) + - 24332a2 - Fix the manifest (Gavin M. Roy) + - acdfdef - Remove useless test (Gavin M. Roy) + - 7918e1a - Skip libev tests if pyev is not installed or if they are being run in pypy (Gavin M. Roy) + - bb583bf - Remove the deprecated test (Gavin M. Roy) + - aecf3f2 - Don't reject a message if the channel is not open (Gavin M. Roy) + - e37f336 - Remove UTF-8 decoding in spec (Gavin M. Roy) + - ddc35a9 - Update the unittest to reflect removal of force binary (Gavin M. Roy) + - fea2476 - PEP8 cleanup (Gavin M. Roy) + - 9b97956 - Remove force_binary (Gavin M. Roy) + - a42dd90 - Whitespace required (Gavin M. Roy) + - 85867ea - Update the content_frame_dispatcher tests to reflect removal of auto-cast utf-8 (Gavin M. Roy) + - 5a4bd5d - Remove unicode casting (Gavin M. Roy) + - efea53d - Remove force binary and unicode casting (Gavin M. Roy) + - e918d15 - Add methods to remove deprecation warnings from asyncore (Gavin M. Roy) + - 117f62d - Add a coveragerc to ignore the auto generated pika.spec (Gavin M. Roy) + - 52f4485 - Remove pypy tests from travis for now (Gavin M. Roy) + - c3aa958 - Update README.rst (Gavin M. Roy) + - 3e2319f - Delete README.md (Gavin M. Roy) + - c12b0f1 - Move to RST (Gavin M. Roy) + - 704f5be - Badging updates (Gavin M. Roy) + - 7ae33ca - Update for coverage info (Gavin M. Roy) + - ae7ca86 - add libev_adapter_tests.py; modify .travis.yml to install libev and pyev (ml) + - f86aba5 - libev_connection: add **kwargs to _handle_event; suppress default_ioloop reuse warning (ml) + - 603f1cf - async_test_base: add necessary args to _on_cconn_closed (ml) + - 3422007 - add libev_adapter_tests.py (ml) + - 6cbab0c - removed relative imports and importing urlparse from urllib.parse for py3+ (a-tal) + - f808464 - libev_connection: add async watcher; add optional parameters to add_timeout (ml) + - c041c80 - Remove ev all together for now (Gavin M. Roy) + - 9408388 - Update the test descriptions and timeout (Gavin M. Roy) + - 1b552e0 - Increase timeout (Gavin M. Roy) + - 69a1f46 - Remove the pyev requirement for 2.6 testing (Gavin M. Roy) + - fe062d2 - Update package name (Gavin M. Roy) + - 611ad0e - Distribute the LICENSE and README.md (#350) (Gavin M. Roy) + - df5e1d8 - Ensure that the entire frame is written using socket.sendall (#349) (Gavin M. Roy) + - 69ec8cf - Move the libev install to before_install (Gavin M. Roy) + - a75f693 - Update test structure (Gavin M. Roy) + - 636b424 - Update things to ignore (Gavin M. Roy) + - b538c68 - Add tox, nose.cfg, update testing config (Gavin M. Roy) + - a0e7063 - add some tests to increase coverage of pika.connection (Charles Law) + - c76d9eb - Address issue #459 (Gavin M. Roy) + - 86ad2db - Raise exception if positional arg for parameters isn't an instance of Parameters (Gavin M. Roy) + - 14d08e1 - Fix for python 2.6 (Gavin M. Roy) + - bd388a3 - Use the first unused channel number addressing #404, #460 (Gavin M. Roy) + - e7676e6 - removing a debug that was left in last commit (James Mutton) + - 6c93b38 - Fixing connection-closed behavior to detect on attempt to publish (James Mutton) + - c3f0356 - Initialize bytes_written in _handle_write() (Jonathan Kirsch) + - 4510e95 - Fix _handle_write() may not send full frame (Jonathan Kirsch) + - 12b793f - fixed Tornado Consumer example to successfully reconnect (Yang Yang) + - f074444 - remove forgotten import of ordereddict (Pedro Abranches) + - 1ba0aea - fix last merge (Pedro Abranches) + - 10490a6 - change timeouts structure to list to maintain scheduling order (Pedro Abranches) + - 7958394 - save timeouts in ordered dict instead of dict (Pedro Abranches) + - d2746bf - URLParameters and ConnectionParameters accept unicode strings (Allard Hoeve) + - 596d145 - previous fix for AttributeError made parent and child class methods identical, remove duplication (James Mutton) + - 42940dd - UrlParameters Docs: fixed amqps scheme examples (Riccardo Cirimelli) + - 43904ff - Dont test this in PyPy due to sort order issue (Gavin M. Roy) + - d7d293e - Don't leave __repr__ sorting up to chance (Gavin M. Roy) + - 848c594 - Add integration test to travis and fix invocation (Gavin M. Roy) + - 2678275 - Add pypy to travis tests (Gavin M. Roy) + - 1877f3d - Also addresses issue #419 (Gavin M. Roy) + - 470c245 - Address issue #419 (Gavin M. Roy) + - ca3cb59 - Address issue #432 (Gavin M. Roy) + - a3ff6f2 - Default frame max should be AMQP FRAME_MAX (Gavin M. Roy) + - ff3d5cb - Remove max consumer tag test due to change in code. (Gavin M. Roy) + - 6045dda - Catch KeyError (#437) to ensure that an exception is not raised in a race condition (Gavin M. Roy) + - 0b4d53a - Address issue #441 (Gavin M. Roy) + - 180e7c4 - Update license and related files (Gavin M. Roy) + - 256ed3d - Added Jython support. (Erik Olof Gunnar Andersson) + - f73c141 - experimental work around for recursion issue. (Erik Olof Gunnar Andersson) + - a623f69 - Prevent #436 by iterating the keys and not the dict (Gavin M. Roy) + - 755fcae - Add support for authentication_failure_close, connection.blocked (Gavin M. Roy) + - c121243 - merge upstream master (Michael Laing) + - a08dc0d - add arg to channel.basic_consume (Pedro Abranches) + - 10b136d - Documentation fix (Anton Ryzhov) + - 9313307 - Fixed minor markup errors. (Jorge Puente Sarrín) + - fb3e3cf - Fix the spelling of UnsupportedAMQPFieldException (Garrett Cooper) + - 03d5da3 - connection.py: Propagate the force_channel keyword parameter to methods involved in channel creation (Michael Laing) + - 7bbcff5 - Documentation fix for basic_publish (JuhaS) + - 01dcea7 - Expose no_ack and exclusive to BlockingChannel.consume (Jeff Tang) + - d39b6aa - Fix BlockingChannel.basic_consume does not block on non-empty queues (Juhyeong Park) + - 6e1d295 - fix for issue 391 and issue 307 (Qi Fan) + - d9ffce9 - Update parameters.rst (cacovsky) + - 6afa41e - Add additional badges (Gavin M. Roy) + - a255925 - Fix return value on dns resolution issue (Laurent Eschenauer) + - 3f7466c - libev_connection: tweak docs (Michael Laing) + - 0aaed93 - libev_connection: Fix varable naming (Michael Laing) + - 0562d08 - libev_connection: Fix globals warning (Michael Laing) + - 22ada59 - libev_connection: use globals to track sigint and sigterm watchers as they are created globally within libev (Michael Laing) + - 2649b31 - Move badge [skip ci] (Gavin M. Roy) + - f70eea1 - Remove pypy and installation attempt of pyev (Gavin M. Roy) + - f32e522 - Conditionally skip external connection adapters if lib is not installed (Gavin M. Roy) + - cce97c5 - Only install pyev on python 2.7 (Gavin M. Roy) + - ff84462 - Add travis ci support (Gavin M. Roy) + - cf971da - lib_evconnection: improve signal handling; add callback (Michael Laing) + - 9adb269 - bugfix in returning a list in Py3k (Alex Chandel) + - c41d5b9 - update exception syntax for Py3k (Alex Chandel) + - c8506f1 - fix _adapter_connect (Michael Laing) + - 67cb660 - Add LibevConnection to README (Michael Laing) + - 1f9e72b - Propagate low-level connection errors to the AMQPConnectionError. (Bjorn Sandberg) + - e1da447 - Avoid race condition in _on_getok on successive basic_get() when clearing out callbacks (Jeff) + - 7a09979 - Add support for upcoming Connection.Blocked/Unblocked (Gavin M. Roy) + - 53cce88 - TwistedChannel correctly handles multi-argument deferreds. (eivanov) + - 66f8ace - Use uuid when creating unique consumer tag (Perttu Ranta-aho) + - 4ee2738 - Limit the growth of Channel._cancelled, use deque instead of list. (Perttu Ranta-aho) + - 0369aed - fix adapter references and tweak docs (Michael Laing) + - 1738c23 - retry select.select() on EINTR (Cenk Alti) + - 1e55357 - libev_connection: reset internal state on reconnect (Michael Laing) + - 708559e - libev adapter (Michael Laing) + - a6b7c8b - Prioritize EPollPoller and KQueuePoller over PollPoller and SelectPoller (Anton Ryzhov) + - 53400d3 - Handle socket errors in PollPoller and EPollPoller Correctly check 'select.poll' availability (Anton Ryzhov) + - a6dc969 - Use dict.keys & items instead of iterkeys & iteritems (Alex Chandel) + - 5c1b0d0 - Use print function syntax, in examples (Alex Chandel) + - ac9f87a - Fixed a typo in the name of the Asyncore Connection adapter (Guruprasad) + - dfbba50 - Fixed bug mentioned in Issue #357 (Erik Andersson) + - c906a2d - Drop additional flags when getting info for the hostnames, log errors (#352) (Gavin M. Roy) + - baf23dd - retry poll() on EINTR (Cenk Alti) + - 7cd8762 - Address ticket #352 catching an error when socket.getprotobyname fails (Gavin M. Roy) + - 6c3ec75 - Prep for 0.9.14 (Gavin M. Roy) + - dae7a99 - Bump to 0.9.14p0 (Gavin M. Roy) + - 620edc7 - Use default port and virtual host if omitted in URLParameters (Issue #342) (Gavin M. Roy) + - 42a8787 - Move the exception handling inside the while loop (Gavin M. Roy) + - 10e0264 - Fix connection back pressure detection issue #347 (Gavin M. Roy) + - 0bfd670 - Fixed mistake in commit 3a19d65. (Erik Andersson) + - da04bc0 - Fixed Unknown state on disconnect error message generated when closing connections. (Erik Andersson) + - 3a19d65 - Alternative solution to fix #345. (Erik Andersson) + - abf9fa8 - switch to sendall to send entire frame (Dustin Koupal) + - 9ce8ce4 - Fixed the async publisher example to work with reconnections (Raphaël De Giusti) + - 511028a - Fix typo in TwistedChannel docstring (cacovsky) + - 8b69e5a - calls self._adapter_disconnect() instead of self.disconnect() which doesn't actually exist #294 (Mark Unsworth) + - 06a5cf8 - add NullHandler to prevent logging warnings (Cenk Alti) + - f404a9a - Fix #337 cannot start ioloop after stop (Ralf Nyren) + +0.9.13 - 2013-05-15 +------------------- + +`0.9.13 `_ + +**Major Changes** + +- IPv6 Support with thanks to Alessandro Tagliapietra for initial prototype +- Officially remove support for <= Python 2.5 even though it was broken already +- Drop pika.simplebuffer.SimpleBuffer in favor of the Python stdlib collections.deque object +- New default object for receiving content is a "bytes" object which is a str wrapper in Python 2, but paves way for Python 3 support +- New "Raw" mode for frame decoding content frames (#334) addresses issues #331, #229 added by Garth Williamson +- Connection and Disconnection logic refactored, allowing for cleaner separation of protocol logic and socket handling logic as well as connection state management +- New "on_open_error_callback" argument in creating connection objects and new Connection.add_on_open_error_callback method +- New Connection.connect method to cleanly allow for reconnection code +- Support for all AMQP field types, using protocol specified signed/unsigned unpacking + +**Backwards Incompatible Changes** + +- Method signature for creating connection objects has new argument "on_open_error_callback" which is positionally before "on_close_callback" +- Internal callback variable names in connection.Connection have been renamed and constants used. If you relied on any of these callbacks outside of their internal use, make sure to check out the new constants. +- Connection._connect method, which was an internal only method is now deprecated and will raise a DeprecationWarning. If you relied on this method, your code needs to change. +- pika.simplebuffer has been removed + +**Bugfixes** + +- BlockingConnection consumer generator does not free buffer when exited (#328) +- Unicode body payloads in the blocking adapter raises exception (#333) +- Support "b" short-short-int AMQP data type (#318) +- Docstring type fix in adapters/select_connection (#316) fix by Rikard Hultén +- IPv6 not supported (#309) +- Stop the HeartbeatChecker when connection is closed (#307) +- Unittest fix for SelectConnection (#336) fix by Erik Andersson +- Handle condition where no connection or socket exists but SelectConnection needs a timeout for retrying a connection (#322) +- TwistedAdapter lagging behind BaseConnection changes (#321) fix by Jan Urbański + +**Other** + +- Refactored documentation +- Added Twisted Adapter example (#314) by nolinksoft + +0.9.12 - 2013-03-18 +------------------- + +`0.9.12 `_ + +**Bugfixes** + +- New timeout id hashing was not unique + +0.9.11 - 2013-03-17 +------------------- + +`0.9.11 `_ + +**Bugfixes** + +- Address inconsistent channel close callback documentation and add the signature + change to the TwistedChannel class (#305) +- Address a missed timeout related internal data structure name change + introduced in the SelectConnection 0.9.10 release. Update all connection + adapters to use same signature and docstring (#306). + +0.9.10 - 2013-03-16 +------------------- + +`0.9.10 `_ + +**Bugfixes** + +- Fix timeout in twisted adapter (Submitted by cellscape) +- Fix blocking_connection poll timer resolution to milliseconds (Submitted by cellscape) +- Fix channel._on_close() without a method frame (Submitted by Richard Boulton) +- Addressed exception on close (Issue #279 - fix by patcpsc) +- 'messages' not initialized in BlockingConnection.cancel() (Issue #289 - fix by Mik Kocikowski) +- Make queue_unbind behave like queue_bind (Issue #277) +- Address closing behavioral issues for connections and channels (Issue #275) +- Pass a Method frame to Channel._on_close in Connection._on_disconnect (Submitted by Jan Urbański) +- Fix channel closed callback signature in the Twisted adapter (Submitted by Jan Urbański) +- Don't stop the IOLoop on connection close for in the Twisted adapter (Submitted by Jan Urbański) +- Update the asynchronous examples to fix reconnecting and have it work +- Warn if the socket was closed such as if RabbitMQ dies without a Close frame +- Fix URLParameters ssl_options (Issue #296) +- Add state to BlockingConnection addressing (Issue #301) +- Encode unicode body content prior to publishing (Issue #282) +- Fix an issue with unicode keys in BasicProperties headers key (Issue #280) +- Change how timeout ids are generated (Issue #254) +- Address post close state issues in Channel (Issue #302) + +** Behavior changes ** + +- Change core connection communication behavior to prefer outbound writes over reads, addressing a recursion issue +- Update connection on close callbacks, changing callback method signature +- Update channel on close callbacks, changing callback method signature +- Give more info in the ChannelClosed exception +- Change the constructor signature for BlockingConnection, block open/close callbacks +- Disable the use of add_on_open_callback/add_on_close_callback methods in BlockingConnection + + +0.9.9 - 2013-01-29 +------------------ + +`0.9.9 `_ + +**Bugfixes** + +- Only remove the tornado_connection.TornadoConnection file descriptor from the IOLoop if it's still open (Issue #221) +- Allow messages with no body (Issue #227) +- Allow for empty routing keys (Issue #224) +- Don't raise an exception when trying to send a frame to a closed connection (Issue #229) +- Only send a Connection.CloseOk if the connection is still open. (Issue #236 - Fix by noleaf) +- Fix timeout threshold in blocking connection - (Issue #232 - Fix by Adam Flynn) +- Fix closing connection while a channel is still open (Issue #230 - Fix by Adam Flynn) +- Fixed misleading warning and exception messages in BaseConnection (Issue #237 - Fix by Tristan Penman) +- Pluralised and altered the wording of the AMQPConnectionError exception (Issue #237 - Fix by Tristan Penman) +- Fixed _adapter_disconnect in TornadoConnection class (Issue #237 - Fix by Tristan Penman) +- Fixing hang when closing connection without any channel in BlockingConnection (Issue #244 - Fix by Ales Teska) +- Remove the process_timeouts() call in SelectConnection (Issue #239) +- Change the string validation to basestring for host connection parameters (Issue #231) +- Add a poller to the BlockingConnection to address latency issues introduced in Pika 0.9.8 (Issue #242) +- reply_code and reply_text is not set in ChannelException (Issue #250) +- Add the missing constraint parameter for Channel._on_return callback processing (Issue #257 - Fix by patcpsc) +- Channel callbacks not being removed from callback manager when channel is closed or deleted (Issue #261) + +0.9.8 - 2012-11-18 +------------------ + +`0.9.8 `_ + +**Bugfixes** + +- Channel.queue_declare/BlockingChannel.queue_declare not setting up callbacks property for empty queue name (Issue #218) +- Channel.queue_bind/BlockingChannel.queue_bind not allowing empty routing key +- Connection._on_connection_closed calling wrong method in Channel (Issue #219) +- Fix tx_commit and tx_rollback bugs in BlockingChannel (Issue #217) + +0.9.7 - 2012-11-11 +------------------ + +`0.9.7 `_ + +**New features** + +- generator based consumer in BlockingChannel (See :doc:`examples/blocking_consumer_generator` for example) + +**Changes** + +- BlockingChannel._send_method will only wait if explicitly told to + +**Bugfixes** + +- Added the exchange "type" parameter back but issue a DeprecationWarning +- Dont require a queue name in Channel.queue_declare() +- Fixed KeyError when processing timeouts (Issue # 215 - Fix by Raphael De Giusti) +- Don't try and close channels when the connection is closed (Issue #216 - Fix by Charles Law) +- Dont raise UnexpectedFrame exceptions, log them instead +- Handle multiple synchronous RPC calls made without waiting for the call result (Issues #192, #204, #211) +- Typo in docs (Issue #207 Fix by Luca Wehrstedt) +- Only sleep on connection failure when retry attempts are > 0 (Issue #200) +- Bypass _rpc method and just send frames for Basic.Ack, Basic.Nack, Basic.Reject (Issue #205) + +0.9.6 - 2012-10-29 +------------------ + +`0.9.6 `_ + +**New features** + +- URLParameters +- BlockingChannel.start_consuming() and BlockingChannel.stop_consuming() +- Delivery Confirmations +- Improved unittests + +**Major bugfix areas** + +- Connection handling +- Blocking functionality in the BlockingConnection +- SSL +- UTF-8 Handling + +**Removals** + +- pika.reconnection_strategies +- pika.channel.ChannelTransport +- pika.log +- pika.template +- examples directory + +0.9.5 - 2011-03-29 +------------------ + +`0.9.5 `_ + +**Changelog** + +- Scope changes with adapter IOLoops and CallbackManager allowing for cleaner, multi-threaded operation +- Add support for Confirm.Select with channel.Channel.confirm_delivery() +- Add examples of delivery confirmation to examples (demo_send_confirmed.py) +- Update uses of log.warn with warning.warn for TCP Back-pressure alerting +- License boilerplate updated to simplify license text in source files +- Increment the timeout in select_connection.SelectPoller reducing CPU utilization +- Bug fix in Heartbeat frame delivery addressing issue #35 +- Remove abuse of pika.log.method_call through a majority of the code +- Rename of key modules: table to data, frames to frame +- Cleanup of frame module and related classes +- Restructure of tests and test runner +- Update functional tests to respect RABBITMQ_HOST, RABBITMQ_PORT environment variables +- Bug fixes to reconnection_strategies module +- Fix the scale of timeout for PollPoller to be specified in milliseconds +- Remove mutable default arguments in RPC calls +- Add data type validation to RPC calls +- Move optional credentials erasing out of connection.Connection into credentials module +- Add support to allow for additional external credential types +- Add a NullHandler to prevent the 'No handlers could be found for logger "pika"' error message when not using pika.log in a client app at all. +- Clean up all examples to make them easier to read and use +- Move documentation into its own repository https://github.com/pika/documentation + +- channel.py + + - Move channel.MAX_CHANNELS constant from connection.CHANNEL_MAX + - Add default value of None to ChannelTransport.rpc + - Validate callback and acceptable replies parameters in ChannelTransport.RPC + - Remove unused connection attribute from Channel + +- connection.py + + - Remove unused import of struct + - Remove direct import of pika.credentials.PlainCredentials + - Change to import pika.credentials + - Move CHANNEL_MAX to channel.MAX_CHANNELS + - Change ConnectionParameters initialization parameter heartbeat to boolean + - Validate all inbound parameter types in ConnectionParameters + - Remove the Connection._erase_credentials stub method in favor of letting the Credentials object deal with that itself. + - Warn if the credentials object intends on erasing the credentials and a reconnection strategy other than NullReconnectionStrategy is specified. + - Change the default types for callback and acceptable_replies in Connection._rpc + - Validate the callback and acceptable_replies data types in Connection._rpc + +- adapters.blocking_connection.BlockingConnection + + - Addition of _adapter_disconnect to blocking_connection.BlockingConnection + - Add timeout methods to BlockingConnection addressing issue #41 + - BlockingConnection didn't allow you register more than one consumer callback because basic_consume was overridden to block immediately. New behavior allows you to do so. + - Removed overriding of base basic_consume and basic_cancel methods. Now uses underlying Channel versions of those methods. + - Added start_consuming() method to BlockingChannel to start the consumption loop. + - Updated stop_consuming() to iterate through all the registered consumers in self._consumers and issue a basic_cancel. diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/CONTRIBUTING.md b/NodeRed/NodeRedFiles/pika-0.13.1/CONTRIBUTING.md new file mode 100644 index 000000000..d856697ca --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/CONTRIBUTING.md @@ -0,0 +1,68 @@ +# Contributing + +## Test Coverage + +To contribute to Pika, please make sure that any new features or changes +to existing functionality **include test coverage**. + +*Pull requests that add or change code without coverage have a much lower chance +of being accepted.* + + +## Prerequisites + +Pika test suite has a couple of requirements: + + * Dependencies from `test-dependencies.txt` are installed + * A RabbitMQ node with all defaults is running on `localhost:5672` + + +## Installing Dependencies + +To install the dependencies needed to run Pika tests, use + + pip install -r test-requirements.txt + +which on Python 3 might look like this + + pip3 install -r test-requirements.txt + + +## Running Tests + +To run all test suites, use + + nosetests + +Note that some tests are OS-specific (e.g. epoll on Linux +or kqueue on MacOS and BSD). Those will be skipped +automatically. + +If you would like to run TLS/SSL tests, use the following procedure: + +* Create a `rabbitmq.conf` file: + + ``` + sed -e "s#PIKA_DIR#$PWD#g" ./testdata/rabbitmq.conf.in > ./testdata/rabbitmq.conf + ``` + +* Start RabbitMQ and use the configuration file you just created. An example command + that works with the `generic-unix` package is as follows: + + ``` + $ RABBITMQ_CONFIG_FILE=/path/to/pika/testdata/rabbitmq.conf ./sbin/rabbitmq-server + ``` + +* Run the tests indicating that TLS/SSL connections should be used: + + ``` + PIKA_TEST_TLS=true nosetests + ``` + + +## Code Formatting + +Please format your code using [yapf](http://pypi.python.org/pypi/yapf) +with ``google`` style prior to issuing your pull request. *Note: only format those +lines that you have changed in your pull request. If you format an entire file and +change code outside of the scope of your PR, it will likely be rejected.* diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/LICENSE b/NodeRed/NodeRedFiles/pika-0.13.1/LICENSE new file mode 100644 index 000000000..0aed110fe --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/LICENSE @@ -0,0 +1,25 @@ +Copyright (c) 2009-2017, Tony Garnock-Jones, Gavin M. Roy, Pivotal and others. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of the Pika project nor the names of its contributors may be used + to endorse or promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/MANIFEST.in b/NodeRed/NodeRedFiles/pika-0.13.1/MANIFEST.in new file mode 100644 index 000000000..9c8317c45 --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/MANIFEST.in @@ -0,0 +1,2 @@ +include LICENSE +include README.rst \ No newline at end of file diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/README.rst b/NodeRed/NodeRedFiles/pika-0.13.1/README.rst new file mode 100644 index 000000000..ac39d70f2 --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/README.rst @@ -0,0 +1,157 @@ +Pika +==== +Pika is a RabbitMQ (AMQP-0-9-1) client library for Python. + +|Version| |Python versions| |Status| |Coverage| |License| |Docs| + +Introduction +------------- +Pika is a pure-Python implementation of the AMQP 0-9-1 protocol including RabbitMQ's +extensions. + +- Python 2.7 and 3.4+ are supported. + +- Since threads aren't appropriate to every situation, it doesn't + require threads. It takes care not to forbid them, either. The same + goes for greenlets, callbacks, continuations and generators. It is + not necessarily thread-safe however, and your mileage will vary. + +- People may be using direct sockets, plain old `select()`, + or any of the wide variety of ways of getting network events to and from a + python application. Pika tries to stay compatible with all of these, and to + make adapting it to a new environment as simple as possible. + +Documentation +------------- +Pika's documentation can be found at `https://pika.readthedocs.io `_ + +Example +------- +Here is the most simple example of use, sending a message with the BlockingConnection adapter: + +.. code :: python + + import pika + connection = pika.BlockingConnection() + channel = connection.channel() + channel.basic_publish(exchange='example', + routing_key='test', + body='Test Message') + connection.close() + +And an example of writing a blocking consumer: + +.. code :: python + + import pika + connection = pika.BlockingConnection() + channel = connection.channel() + + for method_frame, properties, body in channel.consume('test'): + + # Display the message parts and ack the message + print(method_frame, properties, body) + channel.basic_ack(method_frame.delivery_tag) + + # Escape out of the loop after 10 messages + if method_frame.delivery_tag == 10: + break + + # Cancel the consumer and return any pending messages + requeued_messages = channel.cancel() + print('Requeued %i messages' % requeued_messages) + connection.close() + +Pika provides the following adapters +------------------------------------ + +- AsyncioConnection - adapter for the Python3 AsyncIO event loop +- BlockingConnection - enables blocking, synchronous operation on top of library for simple uses +- SelectConnection - fast asynchronous adapter +- TornadoConnection - adapter for use with the Tornado IO Loop http://tornadoweb.org +- TwistedConnection - adapter for use with the Twisted asynchronous package http://twistedmatrix.com/ + +Requesting message ACKs from another thread +------------------------------------------- +The single-threaded usage constraint of an individual Pika connection adapter +instance may result in a dropped AMQP/stream connection due to AMQP heartbeat +timeout in consumers that take a long time to process an incoming message. A +common solution is to delegate processing of the incoming messages to another +thread, while the connection adapter's thread continues to service its ioloop's +message pump, permitting AMQP heartbeats and other I/O to be serviced in a +timely fashion. + +Messages processed in another thread may not be ACK'ed directly from that thread, +since all accesses to the connection adapter instance must be from a single +thread - the thread that is running the adapter's ioloop. However, this may be +accomplished by requesting a callback to be executed in the adapter's ioloop +thread. For example, the callback function's implementation might look like this: + +.. code :: python + + def ack_message(channel, delivery_tag): + """Note that `channel` must be the same pika channel instance via which + the message being ACKed was retrieved (AMQP protocol constraint). + """ + if channel.is_open: + channel.basic_ack(delivery_tag) + else: + # Channel is already closed, so we can't ACK this message; + # log and/or do something that makes sense for your app in this case. + pass + +The code running in the other thread may request the `ack_message()` function +to be executed in the connection adapter's ioloop thread using an +adapter-specific mechanism: + +- :py:class:`pika.BlockingConnection` abstracts its ioloop from the application + and thus exposes :py:meth:`pika.BlockingConnection.add_callback_threadsafe()`. + Refer to this method's docstring for additional information. For example: + + .. code :: python + + connection.add_callback_threadsafe(functools.partial(ack_message, channel, delivery_tag)) + +- When using a non-blocking connection adapter, such as +:py:class:`pika.adapters.asyncio_connection.AsyncioConnection` or +:py:class:`pika.SelectConnection`, you use the underlying asynchronous +framework's native API for requesting an ioloop-bound callback from +another thread. For example, `SelectConnection`'s `IOLoop` provides +`add_callback_threadsafe()`, `Tornado`'s `IOLoop` has +`add_callback()`, while `asyncio`'s event loop exposes +`call_soon_threadsafe()`. + +This threadsafe callback request mechanism may also be used to delegate +publishing of messages, etc., from a background thread to the connection adapter's +thread. + +Contributing +------------ +To contribute to pika, please make sure that any new features or changes +to existing functionality **include test coverage**. + +*Pull requests that add or change code without coverage will most likely be rejected.* + +Additionally, please format your code using `yapf `_ +with ``google`` style prior to issuing your pull request. *Note: only format those +lines that you have changed in your pull request. If you format an entire file and +change code outside of the scope of your PR, it will likely be rejected.* + +.. |Version| image:: https://img.shields.io/pypi/v/pika.svg? + :target: http://badge.fury.io/py/pika + +.. |Python versions| image:: https://img.shields.io/pypi/pyversions/pika.svg + :target: https://pypi.python.org/pypi/pika + +.. |Status| image:: https://img.shields.io/travis/pika/pika.svg? + :target: https://travis-ci.org/pika/pika + +.. |Coverage| image:: https://img.shields.io/codecov/c/github/pika/pika.svg? + :target: https://codecov.io/github/pika/pika?branch=master + +.. |License| image:: https://img.shields.io/pypi/l/pika.svg? + :target: https://pika.readthedocs.io + +.. |Docs| image:: https://readthedocs.org/projects/pika/badge/?version=stable + :target: https://pika.readthedocs.io + :alt: Documentation Status diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/appveyor.yml b/NodeRed/NodeRedFiles/pika-0.13.1/appveyor.yml new file mode 100644 index 000000000..13259f809 --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/appveyor.yml @@ -0,0 +1,107 @@ +# Windows build and test of Pika + +environment: + erlang_download_url: "http://erlang.org/download/otp_win64_19.3.exe" + erlang_exe_path: "C:\\Users\\appveyor\\erlang_19.3.exe" + erlang_home_dir: "C:\\Users\\appveyor\\erlang" + erlang_erts_version: "erts-8.3" + + rabbitmq_version: 3.7.4 + rabbitmq_installer_download_url: "https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.7.4/rabbitmq-server-3.7.4.exe" + rabbitmq_installer_path: "C:\\Users\\appveyor\\rabbitmq-server-3.7.4.exe" + + matrix: + - PYTHON_ARCH: "32" + PYTHONHOME: "C:\\Python27" + PIKA_TEST_TLS: false + - PYTHON_ARCH: "32" + PYTHONHOME: "C:\\Python27" + PIKA_TEST_TLS: true + + +cache: + # RabbitMQ is a pretty big package, so caching it in hopes of expediting the + # runtime + - "%erlang_exe_path%" + - "%rabbitmq_installer_path%" + + +install: + - SET PYTHONPATH=%PYTHONHOME% + - SET PATH=%PYTHONHOME%\Scripts;%PYTHONHOME%;%PATH% + + # For diagnostics + - ECHO %PYTHONPATH% + - ECHO %PATH% + - python --version + + - ECHO Upgrading pip... + - python -m pip install --upgrade pip setuptools + - pip --version + + - ECHO Installing wheel... + - pip install wheel + + +build_script: + - ECHO Building distributions... + - python setup.py sdist bdist bdist_wheel + - DIR /s *.whl + + +artifacts: + - path: 'dist\*.whl' + name: pika wheel + + +before_test: + # Install test requirements + - ECHO Installing pika... + - python setup.py install + + - ECHO Installing pika test requirements... + - pip install -r test-requirements.txt + + # List conents of C:\ to help debug caching of rabbitmq artifacts + # - DIR C:\ + + - ps: $webclient=New-Object System.Net.WebClient + + - ECHO Downloading Erlang... + - ps: if (-Not (Test-Path "$env:erlang_exe_path")) { $webclient.DownloadFile("$env:erlang_download_url", "$env:erlang_exe_path") } else { Write-Host "Found" $env:erlang_exe_path "in cache." } + + - ECHO Installing Erlang... + - start /B /WAIT %erlang_exe_path% /S /D=%erlang_home_dir% + - set ERLANG_HOME=%erlang_home_dir% + + - ECHO Downloading RabbitMQ... + - ps: if (-Not (Test-Path "$env:rabbitmq_installer_path")) { $webclient.DownloadFile("$env:rabbitmq_installer_download_url", "$env:rabbitmq_installer_path") } else { Write-Host "Found" $env:rabbitmq_installer_path "in cache." } + + - ECHO Creating directory %AppData%\RabbitMQ... + - ps: New-Item -ItemType Directory -ErrorAction Continue -Path "$env:AppData/RabbitMQ" + + - ECHO Creating RabbitMQ configuration file in %AppData%\RabbitMQ... + - ps: Get-Content C:/Projects/pika/testdata/rabbitmq.conf.in | %{ $_ -replace 'PIKA_DIR', 'C:/projects/pika' } | Set-Content -Path "$env:AppData/RabbitMQ/rabbitmq.conf" + - ps: Get-Content "$env:AppData/RabbitMQ/rabbitmq.conf" + + - ECHO Creating Erlang cookie files... + - ps: '[System.IO.File]::WriteAllText("C:\Users\appveyor\.erlang.cookie", "PIKAISTHEBEST", [System.Text.Encoding]::ASCII)' + - ps: '[System.IO.File]::WriteAllText("C:\Windows\System32\config\systemprofile\.erlang.cookie", "PIKAISTHEBEST", [System.Text.Encoding]::ASCII)' + + - ECHO Installing and starting RabbitMQ with default config... + - start /B /WAIT %rabbitmq_installer_path% /S + - ps: (Get-Service -Name RabbitMQ).Status + + - ECHO Waiting for epmd to report that RabbitMQ has started... + - ps: 'C:\projects\pika\testdata\wait-epmd.ps1' + - ps: 'C:\projects\pika\testdata\wait-rabbitmq.ps1' + + - ECHO Getting RabbitMQ status... + - cmd /c "C:\Program Files\RabbitMQ Server\rabbitmq_server-%rabbitmq_version%\sbin\rabbitmqctl.bat" status + + +test_script: + - nosetests + +# Since Pika is source-only there's no need to deploy from Windows +deploy: false diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/docs/Makefile b/NodeRed/NodeRedFiles/pika-0.13.1/docs/Makefile new file mode 100644 index 000000000..f7b78b37a --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/docs/Makefile @@ -0,0 +1,153 @@ +# Makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +PAPER = +BUILDDIR = _build + +# Internal variables. +PAPEROPT_a4 = -D latex_paper_size=a4 +PAPEROPT_letter = -D latex_paper_size=letter +ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . +# the i18n builder cannot share the environment and doctrees with the others +I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . + +.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext + +help: + @echo "Please use \`make ' where is one of" + @echo " html to make standalone HTML files" + @echo " dirhtml to make HTML files named index.html in directories" + @echo " singlehtml to make a single large HTML file" + @echo " pickle to make pickle files" + @echo " json to make JSON files" + @echo " htmlhelp to make HTML files and a HTML help project" + @echo " qthelp to make HTML files and a qthelp project" + @echo " devhelp to make HTML files and a Devhelp project" + @echo " epub to make an epub" + @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" + @echo " latexpdf to make LaTeX files and run them through pdflatex" + @echo " text to make text files" + @echo " man to make manual pages" + @echo " texinfo to make Texinfo files" + @echo " info to make Texinfo files and run them through makeinfo" + @echo " gettext to make PO message catalogs" + @echo " changes to make an overview of all changed/added/deprecated items" + @echo " linkcheck to check all external links for integrity" + @echo " doctest to run all doctests embedded in the documentation (if enabled)" + +clean: + -rm -rf $(BUILDDIR)/* + +html: + $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." + +dirhtml: + $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." + +singlehtml: + $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml + @echo + @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." + +pickle: + $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle + @echo + @echo "Build finished; now you can process the pickle files." + +json: + $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json + @echo + @echo "Build finished; now you can process the JSON files." + +htmlhelp: + $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp + @echo + @echo "Build finished; now you can run HTML Help Workshop with the" \ + ".hhp project file in $(BUILDDIR)/htmlhelp." + +qthelp: + $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp + @echo + @echo "Build finished; now you can run "qcollectiongenerator" with the" \ + ".qhcp project file in $(BUILDDIR)/qthelp, like this:" + @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/pika.qhcp" + @echo "To view the help file:" + @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/pika.qhc" + +devhelp: + $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp + @echo + @echo "Build finished." + @echo "To view the help file:" + @echo "# mkdir -p $$HOME/.local/share/devhelp/pika" + @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/pika" + @echo "# devhelp" + +epub: + $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub + @echo + @echo "Build finished. The epub file is in $(BUILDDIR)/epub." + +latex: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo + @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." + @echo "Run \`make' in that directory to run these through (pdf)latex" \ + "(use \`make latexpdf' here to do that automatically)." + +latexpdf: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through pdflatex..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +text: + $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text + @echo + @echo "Build finished. The text files are in $(BUILDDIR)/text." + +man: + $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man + @echo + @echo "Build finished. The manual pages are in $(BUILDDIR)/man." + +texinfo: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo + @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." + @echo "Run \`make' in that directory to run these through makeinfo" \ + "(use \`make info' here to do that automatically)." + +info: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo "Running Texinfo files through makeinfo..." + make -C $(BUILDDIR)/texinfo info + @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." + +gettext: + $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale + @echo + @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." + +changes: + $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes + @echo + @echo "The overview file is in $(BUILDDIR)/changes." + +linkcheck: + $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck + @echo + @echo "Link check complete; look for any errors in the above output " \ + "or in $(BUILDDIR)/linkcheck/output.txt." + +doctest: + $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest + @echo "Testing of doctests in the sources finished, look at the " \ + "results in $(BUILDDIR)/doctest/output.txt." diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/docs/conf.py b/NodeRed/NodeRedFiles/pika-0.13.1/docs/conf.py new file mode 100644 index 000000000..bb1aa36dc --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/docs/conf.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- +import sys +sys.path.insert(0, '../') +#needs_sphinx = '1.0' + +extensions = ['sphinx.ext.autodoc', 'sphinx.ext.viewcode', + 'sphinx.ext.intersphinx'] + +intersphinx_mapping = {'python': ('https://docs.python.org/3/', + 'https://docs.python.org/3/objects.inv'), + 'tornado': ('http://www.tornadoweb.org/en/stable/', + 'http://www.tornadoweb.org/en/stable/objects.inv')} + +templates_path = ['_templates'] + +source_suffix = '.rst' +master_doc = 'index' + +project = 'pika' +copyright = '2009-2017, Tony Garnock-Jones, Gavin M. Roy, Pivotal Software, Inc and contributors.' + +import pika +release = pika.__version__ +version = '.'.join(release.split('.')[0:1]) + +exclude_patterns = ['_build'] +add_function_parentheses = True +add_module_names = True +show_authors = True +pygments_style = 'sphinx' +modindex_common_prefix = ['pika'] +html_theme = 'default' +html_static_path = ['_static'] +htmlhelp_basename = 'pikadoc' diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/docs/contributors.rst b/NodeRed/NodeRedFiles/pika-0.13.1/docs/contributors.rst new file mode 100644 index 000000000..9cd50ef20 --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/docs/contributors.rst @@ -0,0 +1,104 @@ +Contributors +============ +The following people have directly contributes code by way of new features and/or bug fixes to Pika: + + - Gavin M. Roy + - Tony Garnock-Jones + - Vitaly Kruglikov + - Michael Laing + - Marek Majkowski + - Jan Urbański + - Brian K. Jones + - Ask Solem + - ml + - Will + - atatsu + - Fredrik Svensson + - Pedro Abranches + - Kyösti Herrala + - Erik Andersson + - Charles Law + - Alex Chandel + - Tristan Penman + - Raphaël De Giusti + - Jozef Van Eenbergen + - Josh Braegger + - Jason J. W. Williams + - James Mutton + - Cenk Alti + - Asko Soukka + - Antti Haapala + - Anton Ryzhov + - cellscape + - cacovsky + - bra-fsn + - ateska + - Roey Berman + - Robert Weidlich + - Riccardo Cirimelli + - Perttu Ranta-aho + - Pau Gargallo + - Kane + - Kamil Kisiel + - Jonty Wareing + - Jonathan Kirsch + - Jacek 'Forger' Całusiński + - Garth Williamson + - Erik Olof Gunnar Andersson + - David Strauss + - Anton V. Yanchenko + - Alexey Myasnikov + - Alessandro Tagliapietra + - Adam Flynn + - skftn + - saarni + - pavlobaron + - nonleaf + - markcf + - george y + - eivanov + - bstemshorn + - a-tal + - Yang Yang + - Stuart Longland + - Sigurd Høgsbro + - Sean Dwyer + - Samuel Stauffer + - Roberto Decurnex + - Rikard Hultén + - Richard Boulton + - Ralf Nyren + - Qi Fan + - Peter Magnusson + - Pankrat + - Olivier Le Thanh Duong + - Njal Karevoll + - Milan Skuhra + - Mik Kocikowski + - Michael Kenney + - Mark Unsworth + - Luca Wehrstedt + - Laurent Eschenauer + - Lars van de Kerkhof + - Kyösti Herrala + - Juhyeong Park + - JuhaS + - Josh Hansen + - Jorge Puente Sarrín + - Jeff Tang + - Jeff Fein-Worton + - Jeff + - Hunter Morris + - Guruprasad + - Garrett Cooper + - Frank Slaughter + - Dustin Koupal + - Bjorn Sandberg + - Axel Eirola + - Andrew Smith + - Andrew Grigorev + - Andrew + - Allard Hoeve + - A.Shaposhnikov + +*Contributors listed by commit count.* diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/docs/examples.rst b/NodeRed/NodeRedFiles/pika-0.13.1/docs/examples.rst new file mode 100644 index 000000000..5df6740c8 --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/docs/examples.rst @@ -0,0 +1,23 @@ +Usage Examples +============== + +Pika has various methods of use, between the synchronous BlockingConnection adapter and the various asynchronous connection adapter. The following examples illustrate the various ways that you can use Pika in your projects. + +.. toctree:: + :glob: + :maxdepth: 1 + + examples/using_urlparameters + examples/connecting_async + examples/blocking_basic_get + examples/blocking_consume + examples/blocking_consumer_generator + examples/comparing_publishing_sync_async + examples/blocking_delivery_confirmations + examples/blocking_publish_mandatory + examples/asynchronous_consumer_example + examples/asynchronous_publisher_example + examples/twisted_example + examples/tornado_consumer + examples/tls_mutual_authentication + examples/tls_server_authentication diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/docs/examples/asynchronous_consumer_example.rst b/NodeRed/NodeRedFiles/pika-0.13.1/docs/examples/asynchronous_consumer_example.rst new file mode 100644 index 000000000..8ec3f25f7 --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/docs/examples/asynchronous_consumer_example.rst @@ -0,0 +1,357 @@ +Asynchronous consumer example +============================= +The following example implements a consumer that will respond to RPC commands sent from RabbitMQ. For example, it will reconnect if RabbitMQ closes the connection and will shutdown if RabbitMQ cancels the consumer or closes the channel. While it may look intimidating, each method is very short and represents a individual actions that a consumer can do. + +consumer.py:: + + # -*- coding: utf-8 -*- + + import logging + import pika + + LOG_FORMAT = ('%(levelname) -10s %(asctime)s %(name) -30s %(funcName) ' + '-35s %(lineno) -5d: %(message)s') + LOGGER = logging.getLogger(__name__) + + + class ExampleConsumer(object): + """This is an example consumer that will handle unexpected interactions + with RabbitMQ such as channel and connection closures. + + If RabbitMQ closes the connection, it will reopen it. You should + look at the output, as there are limited reasons why the connection may + be closed, which usually are tied to permission related issues or + socket timeouts. + + If the channel is closed, it will indicate a problem with one of the + commands that were issued and that should surface in the output as well. + + """ + EXCHANGE = 'message' + EXCHANGE_TYPE = 'topic' + QUEUE = 'text' + ROUTING_KEY = 'example.text' + + def __init__(self, amqp_url): + """Create a new instance of the consumer class, passing in the AMQP + URL used to connect to RabbitMQ. + + :param str amqp_url: The AMQP url to connect with + + """ + self._connection = None + self._channel = None + self._closing = False + self._consumer_tag = None + self._url = amqp_url + + def connect(self): + """This method connects to RabbitMQ, returning the connection handle. + When the connection is established, the on_connection_open method + will be invoked by pika. + + :rtype: pika.SelectConnection + + """ + LOGGER.info('Connecting to %s', self._url) + return pika.SelectConnection(pika.URLParameters(self._url), + self.on_connection_open, + stop_ioloop_on_close=False) + + def on_connection_open(self, unused_connection): + """This method is called by pika once the connection to RabbitMQ has + been established. It passes the handle to the connection object in + case we need it, but in this case, we'll just mark it unused. + + :type unused_connection: pika.SelectConnection + + """ + LOGGER.info('Connection opened') + self.add_on_connection_close_callback() + self.open_channel() + + def add_on_connection_close_callback(self): + """This method adds an on close callback that will be invoked by pika + when RabbitMQ closes the connection to the publisher unexpectedly. + + """ + LOGGER.info('Adding connection close callback') + self._connection.add_on_close_callback(self.on_connection_closed) + + def on_connection_closed(self, connection, reply_code, reply_text): + """This method is invoked by pika when the connection to RabbitMQ is + closed unexpectedly. Since it is unexpected, we will reconnect to + RabbitMQ if it disconnects. + + :param pika.connection.Connection connection: The closed connection obj + :param int reply_code: The server provided reply_code if given + :param str reply_text: The server provided reply_text if given + + """ + self._channel = None + if self._closing: + self._connection.ioloop.stop() + else: + LOGGER.warning('Connection closed, reopening in 5 seconds: (%s) %s', + reply_code, reply_text) + self._connection.add_timeout(5, self.reconnect) + + def reconnect(self): + """Will be invoked by the IOLoop timer if the connection is + closed. See the on_connection_closed method. + + """ + # This is the old connection IOLoop instance, stop its ioloop + self._connection.ioloop.stop() + + if not self._closing: + + # Create a new connection + self._connection = self.connect() + + # There is now a new connection, needs a new ioloop to run + self._connection.ioloop.start() + + def open_channel(self): + """Open a new channel with RabbitMQ by issuing the Channel.Open RPC + command. When RabbitMQ responds that the channel is open, the + on_channel_open callback will be invoked by pika. + + """ + LOGGER.info('Creating a new channel') + self._connection.channel(on_open_callback=self.on_channel_open) + + def on_channel_open(self, channel): + """This method is invoked by pika when the channel has been opened. + The channel object is passed in so we can make use of it. + + Since the channel is now open, we'll declare the exchange to use. + + :param pika.channel.Channel channel: The channel object + + """ + LOGGER.info('Channel opened') + self._channel = channel + self.add_on_channel_close_callback() + self.setup_exchange(self.EXCHANGE) + + def add_on_channel_close_callback(self): + """This method tells pika to call the on_channel_closed method if + RabbitMQ unexpectedly closes the channel. + + """ + LOGGER.info('Adding channel close callback') + self._channel.add_on_close_callback(self.on_channel_closed) + + def on_channel_closed(self, channel, reply_code, reply_text): + """Invoked by pika when RabbitMQ unexpectedly closes the channel. + Channels are usually closed if you attempt to do something that + violates the protocol, such as re-declare an exchange or queue with + different parameters. In this case, we'll close the connection + to shutdown the object. + + :param pika.channel.Channel: The closed channel + :param int reply_code: The numeric reason the channel was closed + :param str reply_text: The text reason the channel was closed + + """ + LOGGER.warning('Channel %i was closed: (%s) %s', + channel, reply_code, reply_text) + self._connection.close() + + def setup_exchange(self, exchange_name): + """Setup the exchange on RabbitMQ by invoking the Exchange.Declare RPC + command. When it is complete, the on_exchange_declareok method will + be invoked by pika. + + :param str|unicode exchange_name: The name of the exchange to declare + + """ + LOGGER.info('Declaring exchange %s', exchange_name) + self._channel.exchange_declare(self.on_exchange_declareok, + exchange_name, + self.EXCHANGE_TYPE) + + def on_exchange_declareok(self, unused_frame): + """Invoked by pika when RabbitMQ has finished the Exchange.Declare RPC + command. + + :param pika.Frame.Method unused_frame: Exchange.DeclareOk response frame + + """ + LOGGER.info('Exchange declared') + self.setup_queue(self.QUEUE) + + def setup_queue(self, queue_name): + """Setup the queue on RabbitMQ by invoking the Queue.Declare RPC + command. When it is complete, the on_queue_declareok method will + be invoked by pika. + + :param str|unicode queue_name: The name of the queue to declare. + + """ + LOGGER.info('Declaring queue %s', queue_name) + self._channel.queue_declare(self.on_queue_declareok, queue_name) + + def on_queue_declareok(self, method_frame): + """Method invoked by pika when the Queue.Declare RPC call made in + setup_queue has completed. In this method we will bind the queue + and exchange together with the routing key by issuing the Queue.Bind + RPC command. When this command is complete, the on_bindok method will + be invoked by pika. + + :param pika.frame.Method method_frame: The Queue.DeclareOk frame + + """ + LOGGER.info('Binding %s to %s with %s', + self.EXCHANGE, self.QUEUE, self.ROUTING_KEY) + self._channel.queue_bind(self.on_bindok, self.QUEUE, + self.EXCHANGE, self.ROUTING_KEY) + + def on_bindok(self, unused_frame): + """Invoked by pika when the Queue.Bind method has completed. At this + point we will start consuming messages by calling start_consuming + which will invoke the needed RPC commands to start the process. + + :param pika.frame.Method unused_frame: The Queue.BindOk response frame + + """ + LOGGER.info('Queue bound') + self.start_consuming() + + def start_consuming(self): + """This method sets up the consumer by first calling + add_on_cancel_callback so that the object is notified if RabbitMQ + cancels the consumer. It then issues the Basic.Consume RPC command + which returns the consumer tag that is used to uniquely identify the + consumer with RabbitMQ. We keep the value to use it when we want to + cancel consuming. The on_message method is passed in as a callback pika + will invoke when a message is fully received. + + """ + LOGGER.info('Issuing consumer related RPC commands') + self.add_on_cancel_callback() + self._consumer_tag = self._channel.basic_consume(self.on_message, + self.QUEUE) + + def add_on_cancel_callback(self): + """Add a callback that will be invoked if RabbitMQ cancels the consumer + for some reason. If RabbitMQ does cancel the consumer, + on_consumer_cancelled will be invoked by pika. + + """ + LOGGER.info('Adding consumer cancellation callback') + self._channel.add_on_cancel_callback(self.on_consumer_cancelled) + + def on_consumer_cancelled(self, method_frame): + """Invoked by pika when RabbitMQ sends a Basic.Cancel for a consumer + receiving messages. + + :param pika.frame.Method method_frame: The Basic.Cancel frame + + """ + LOGGER.info('Consumer was cancelled remotely, shutting down: %r', + method_frame) + if self._channel: + self._channel.close() + + def on_message(self, unused_channel, basic_deliver, properties, body): + """Invoked by pika when a message is delivered from RabbitMQ. The + channel is passed for your convenience. The basic_deliver object that + is passed in carries the exchange, routing key, delivery tag and + a redelivered flag for the message. The properties passed in is an + instance of BasicProperties with the message properties and the body + is the message that was sent. + + :param pika.channel.Channel unused_channel: The channel object + :param pika.Spec.Basic.Deliver: basic_deliver method + :param pika.Spec.BasicProperties: properties + :param str|unicode body: The message body + + """ + LOGGER.info('Received message # %s from %s: %s', + basic_deliver.delivery_tag, properties.app_id, body) + self.acknowledge_message(basic_deliver.delivery_tag) + + def acknowledge_message(self, delivery_tag): + """Acknowledge the message delivery from RabbitMQ by sending a + Basic.Ack RPC method for the delivery tag. + + :param int delivery_tag: The delivery tag from the Basic.Deliver frame + + """ + LOGGER.info('Acknowledging message %s', delivery_tag) + self._channel.basic_ack(delivery_tag) + + def stop_consuming(self): + """Tell RabbitMQ that you would like to stop consuming by sending the + Basic.Cancel RPC command. + + """ + if self._channel: + LOGGER.info('Sending a Basic.Cancel RPC command to RabbitMQ') + self._channel.basic_cancel(self.on_cancelok, self._consumer_tag) + + def on_cancelok(self, unused_frame): + """This method is invoked by pika when RabbitMQ acknowledges the + cancellation of a consumer. At this point we will close the channel. + This will invoke the on_channel_closed method once the channel has been + closed, which will in-turn close the connection. + + :param pika.frame.Method unused_frame: The Basic.CancelOk frame + + """ + LOGGER.info('RabbitMQ acknowledged the cancellation of the consumer') + self.close_channel() + + def close_channel(self): + """Call to close the channel with RabbitMQ cleanly by issuing the + Channel.Close RPC command. + + """ + LOGGER.info('Closing the channel') + self._channel.close() + + def run(self): + """Run the example consumer by connecting to RabbitMQ and then + starting the IOLoop to block and allow the SelectConnection to operate. + + """ + self._connection = self.connect() + self._connection.ioloop.start() + + def stop(self): + """Cleanly shutdown the connection to RabbitMQ by stopping the consumer + with RabbitMQ. When RabbitMQ confirms the cancellation, on_cancelok + will be invoked by pika, which will then closing the channel and + connection. The IOLoop is started again because this method is invoked + when CTRL-C is pressed raising a KeyboardInterrupt exception. This + exception stops the IOLoop which needs to be running for pika to + communicate with RabbitMQ. All of the commands issued prior to starting + the IOLoop will be buffered but not processed. + + """ + LOGGER.info('Stopping') + self._closing = True + self.stop_consuming() + self._connection.ioloop.start() + LOGGER.info('Stopped') + + def close_connection(self): + """This method closes the connection to RabbitMQ.""" + LOGGER.info('Closing connection') + self._connection.close() + + + def main(): + logging.basicConfig(level=logging.INFO, format=LOG_FORMAT) + example = ExampleConsumer('amqp://guest:guest@localhost:5672/%2F') + try: + example.run() + except KeyboardInterrupt: + example.stop() + + + if __name__ == '__main__': + main() + diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/docs/examples/asynchronous_publisher_example.rst b/NodeRed/NodeRedFiles/pika-0.13.1/docs/examples/asynchronous_publisher_example.rst new file mode 100644 index 000000000..887148db0 --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/docs/examples/asynchronous_publisher_example.rst @@ -0,0 +1,359 @@ +Asynchronous publisher example +============================== +The following example implements a publisher that will respond to RPC commands sent from RabbitMQ and uses delivery confirmations. It will reconnect if RabbitMQ closes the connection and will shutdown if RabbitMQ closes the channel. While it may look intimidating, each method is very short and represents a individual actions that a publisher can do. + +publisher.py:: + + # -*- coding: utf-8 -*- + + import logging + import pika + import json + + LOG_FORMAT = ('%(levelname) -10s %(asctime)s %(name) -30s %(funcName) ' + '-35s %(lineno) -5d: %(message)s') + LOGGER = logging.getLogger(__name__) + + + class ExamplePublisher(object): + """This is an example publisher that will handle unexpected interactions + with RabbitMQ such as channel and connection closures. + + If RabbitMQ closes the connection, it will reopen it. You should + look at the output, as there are limited reasons why the connection may + be closed, which usually are tied to permission related issues or + socket timeouts. + + It uses delivery confirmations and illustrates one way to keep track of + messages that have been sent and if they've been confirmed by RabbitMQ. + + """ + EXCHANGE = 'message' + EXCHANGE_TYPE = 'topic' + PUBLISH_INTERVAL = 1 + QUEUE = 'text' + ROUTING_KEY = 'example.text' + + def __init__(self, amqp_url): + """Setup the example publisher object, passing in the URL we will use + to connect to RabbitMQ. + + :param str amqp_url: The URL for connecting to RabbitMQ + + """ + self._connection = None + self._channel = None + + self._deliveries = None + self._acked = None + self._nacked = None + self._message_number = None + + self._stopping = False + self._url = amqp_url + + def connect(self): + """This method connects to RabbitMQ, returning the connection handle. + When the connection is established, the on_connection_open method + will be invoked by pika. If you want the reconnection to work, make + sure you set stop_ioloop_on_close to False, which is not the default + behavior of this adapter. + + :rtype: pika.SelectConnection + + """ + LOGGER.info('Connecting to %s', self._url) + return pika.SelectConnection(pika.URLParameters(self._url), + on_open_callback=self.on_connection_open, + on_close_callback=self.on_connection_closed, + stop_ioloop_on_close=False) + + def on_connection_open(self, unused_connection): + """This method is called by pika once the connection to RabbitMQ has + been established. It passes the handle to the connection object in + case we need it, but in this case, we'll just mark it unused. + + :type unused_connection: pika.SelectConnection + + """ + LOGGER.info('Connection opened') + self.open_channel() + + def on_connection_closed(self, connection, reply_code, reply_text): + """This method is invoked by pika when the connection to RabbitMQ is + closed unexpectedly. Since it is unexpected, we will reconnect to + RabbitMQ if it disconnects. + + :param pika.connection.Connection connection: The closed connection obj + :param int reply_code: The server provided reply_code if given + :param str reply_text: The server provided reply_text if given + + """ + self._channel = None + if self._stopping: + self._connection.ioloop.stop() + else: + LOGGER.warning('Connection closed, reopening in 5 seconds: (%s) %s', + reply_code, reply_text) + self._connection.add_timeout(5, self._connection.ioloop.stop) + + def open_channel(self): + """This method will open a new channel with RabbitMQ by issuing the + Channel.Open RPC command. When RabbitMQ confirms the channel is open + by sending the Channel.OpenOK RPC reply, the on_channel_open method + will be invoked. + + """ + LOGGER.info('Creating a new channel') + self._connection.channel(on_open_callback=self.on_channel_open) + + def on_channel_open(self, channel): + """This method is invoked by pika when the channel has been opened. + The channel object is passed in so we can make use of it. + + Since the channel is now open, we'll declare the exchange to use. + + :param pika.channel.Channel channel: The channel object + + """ + LOGGER.info('Channel opened') + self._channel = channel + self.add_on_channel_close_callback() + self.setup_exchange(self.EXCHANGE) + + def add_on_channel_close_callback(self): + """This method tells pika to call the on_channel_closed method if + RabbitMQ unexpectedly closes the channel. + + """ + LOGGER.info('Adding channel close callback') + self._channel.add_on_close_callback(self.on_channel_closed) + + def on_channel_closed(self, channel, reply_code, reply_text): + """Invoked by pika when RabbitMQ unexpectedly closes the channel. + Channels are usually closed if you attempt to do something that + violates the protocol, such as re-declare an exchange or queue with + different parameters. In this case, we'll close the connection + to shutdown the object. + + :param pika.channel.Channel channel: The closed channel + :param int reply_code: The numeric reason the channel was closed + :param str reply_text: The text reason the channel was closed + + """ + LOGGER.warning('Channel was closed: (%s) %s', reply_code, reply_text) + self._channel = None + if not self._stopping: + self._connection.close() + + def setup_exchange(self, exchange_name): + """Setup the exchange on RabbitMQ by invoking the Exchange.Declare RPC + command. When it is complete, the on_exchange_declareok method will + be invoked by pika. + + :param str|unicode exchange_name: The name of the exchange to declare + + """ + LOGGER.info('Declaring exchange %s', exchange_name) + self._channel.exchange_declare(self.on_exchange_declareok, + exchange_name, + self.EXCHANGE_TYPE) + + def on_exchange_declareok(self, unused_frame): + """Invoked by pika when RabbitMQ has finished the Exchange.Declare RPC + command. + + :param pika.Frame.Method unused_frame: Exchange.DeclareOk response frame + + """ + LOGGER.info('Exchange declared') + self.setup_queue(self.QUEUE) + + def setup_queue(self, queue_name): + """Setup the queue on RabbitMQ by invoking the Queue.Declare RPC + command. When it is complete, the on_queue_declareok method will + be invoked by pika. + + :param str|unicode queue_name: The name of the queue to declare. + + """ + LOGGER.info('Declaring queue %s', queue_name) + self._channel.queue_declare(self.on_queue_declareok, queue_name) + + def on_queue_declareok(self, method_frame): + """Method invoked by pika when the Queue.Declare RPC call made in + setup_queue has completed. In this method we will bind the queue + and exchange together with the routing key by issuing the Queue.Bind + RPC command. When this command is complete, the on_bindok method will + be invoked by pika. + + :param pika.frame.Method method_frame: The Queue.DeclareOk frame + + """ + LOGGER.info('Binding %s to %s with %s', + self.EXCHANGE, self.QUEUE, self.ROUTING_KEY) + self._channel.queue_bind(self.on_bindok, self.QUEUE, + self.EXCHANGE, self.ROUTING_KEY) + + def on_bindok(self, unused_frame): + """This method is invoked by pika when it receives the Queue.BindOk + response from RabbitMQ. Since we know we're now setup and bound, it's + time to start publishing.""" + LOGGER.info('Queue bound') + self.start_publishing() + + def start_publishing(self): + """This method will enable delivery confirmations and schedule the + first message to be sent to RabbitMQ + + """ + LOGGER.info('Issuing consumer related RPC commands') + self.enable_delivery_confirmations() + self.schedule_next_message() + + def enable_delivery_confirmations(self): + """Send the Confirm.Select RPC method to RabbitMQ to enable delivery + confirmations on the channel. The only way to turn this off is to close + the channel and create a new one. + + When the message is confirmed from RabbitMQ, the + on_delivery_confirmation method will be invoked passing in a Basic.Ack + or Basic.Nack method from RabbitMQ that will indicate which messages it + is confirming or rejecting. + + """ + LOGGER.info('Issuing Confirm.Select RPC command') + self._channel.confirm_delivery(self.on_delivery_confirmation) + + def on_delivery_confirmation(self, method_frame): + """Invoked by pika when RabbitMQ responds to a Basic.Publish RPC + command, passing in either a Basic.Ack or Basic.Nack frame with + the delivery tag of the message that was published. The delivery tag + is an integer counter indicating the message number that was sent + on the channel via Basic.Publish. Here we're just doing house keeping + to keep track of stats and remove message numbers that we expect + a delivery confirmation of from the list used to keep track of messages + that are pending confirmation. + + :param pika.frame.Method method_frame: Basic.Ack or Basic.Nack frame + + """ + confirmation_type = method_frame.method.NAME.split('.')[1].lower() + LOGGER.info('Received %s for delivery tag: %i', + confirmation_type, + method_frame.method.delivery_tag) + if confirmation_type == 'ack': + self._acked += 1 + elif confirmation_type == 'nack': + self._nacked += 1 + self._deliveries.remove(method_frame.method.delivery_tag) + LOGGER.info('Published %i messages, %i have yet to be confirmed, ' + '%i were acked and %i were nacked', + self._message_number, len(self._deliveries), + self._acked, self._nacked) + + def schedule_next_message(self): + """If we are not closing our connection to RabbitMQ, schedule another + message to be delivered in PUBLISH_INTERVAL seconds. + + """ + LOGGER.info('Scheduling next message for %0.1f seconds', + self.PUBLISH_INTERVAL) + self._connection.add_timeout(self.PUBLISH_INTERVAL, + self.publish_message) + + def publish_message(self): + """If the class is not stopping, publish a message to RabbitMQ, + appending a list of deliveries with the message number that was sent. + This list will be used to check for delivery confirmations in the + on_delivery_confirmations method. + + Once the message has been sent, schedule another message to be sent. + The main reason I put scheduling in was just so you can get a good idea + of how the process is flowing by slowing down and speeding up the + delivery intervals by changing the PUBLISH_INTERVAL constant in the + class. + + """ + if self._channel is None or not self._channel.is_open: + return + + hdrs = {u'مفتاح': u' قيمة', + u'键': u'值', + u'キー': u'値'} + properties = pika.BasicProperties(app_id='example-publisher', + content_type='application/json', + headers=hdrs) + + message = u'مفتاح قيمة 键 值 キー 値' + self._channel.basic_publish(self.EXCHANGE, self.ROUTING_KEY, + json.dumps(message, ensure_ascii=False), + properties) + self._message_number += 1 + self._deliveries.append(self._message_number) + LOGGER.info('Published message # %i', self._message_number) + self.schedule_next_message() + + def run(self): + """Run the example code by connecting and then starting the IOLoop. + + """ + while not self._stopping: + self._connection = None + self._deliveries = [] + self._acked = 0 + self._nacked = 0 + self._message_number = 0 + + try: + self._connection = self.connect() + self._connection.ioloop.start() + except KeyboardInterrupt: + self.stop() + if (self._connection is not None and + not self._connection.is_closed): + # Finish closing + self._connection.ioloop.start() + + LOGGER.info('Stopped') + + def stop(self): + """Stop the example by closing the channel and connection. We + set a flag here so that we stop scheduling new messages to be + published. The IOLoop is started because this method is + invoked by the Try/Catch below when KeyboardInterrupt is caught. + Starting the IOLoop again will allow the publisher to cleanly + disconnect from RabbitMQ. + + """ + LOGGER.info('Stopping') + self._stopping = True + self.close_channel() + self.close_connection() + + def close_channel(self): + """Invoke this command to close the channel with RabbitMQ by sending + the Channel.Close RPC command. + + """ + if self._channel is not None: + LOGGER.info('Closing the channel') + self._channel.close() + + def close_connection(self): + """This method closes the connection to RabbitMQ.""" + if self._connection is not None: + LOGGER.info('Closing connection') + self._connection.close() + + + def main(): + logging.basicConfig(level=logging.DEBUG, format=LOG_FORMAT) + + # Connect to localhost:5672 as guest with the password guest and virtual host "/" (%2F) + example = ExamplePublisher('amqp://guest:guest@localhost:5672/%2F?connection_attempts=3&heartbeat_interval=3600') + example.run() + + + if __name__ == '__main__': + main() diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/docs/examples/asyncio_consumer.rst b/NodeRed/NodeRedFiles/pika-0.13.1/docs/examples/asyncio_consumer.rst new file mode 100644 index 000000000..1ea654ae7 --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/docs/examples/asyncio_consumer.rst @@ -0,0 +1,355 @@ +Asyncio Consumer +================ +The following example implements a consumer using the +:class:`Asyncio adapter ` for the +`Asyncio library `_ that will respond to RPC commands sent + from RabbitMQ. For example, it will reconnect if RabbitMQ closes the connection and will shutdown if + RabbitMQ cancels the consumer or closes the channel. While it may look intimidating, each method is + very short and represents a individual actions that a consumer can do. + +consumer.py:: + + from pika import adapters + import pika + import logging + + LOG_FORMAT = ('%(levelname) -10s %(asctime)s %(name) -30s %(funcName) ' + '-35s %(lineno) -5d: %(message)s') + + LOGGER = logging.getLogger(__name__) + + + class ExampleConsumer(object): + """This is an example consumer that will handle unexpected interactions + with RabbitMQ such as channel and connection closures. + + If RabbitMQ closes the connection, it will reopen it. You should + look at the output, as there are limited reasons why the connection may + be closed, which usually are tied to permission related issues or + socket timeouts. + + If the channel is closed, it will indicate a problem with one of the + commands that were issued and that should surface in the output as well. + + """ + EXCHANGE = 'message' + EXCHANGE_TYPE = 'topic' + QUEUE = 'text' + ROUTING_KEY = 'example.text' + + def __init__(self, amqp_url): + """Create a new instance of the consumer class, passing in the AMQP + URL used to connect to RabbitMQ. + + :param str amqp_url: The AMQP url to connect with + + """ + self._connection = None + self._channel = None + self._closing = False + self._consumer_tag = None + self._url = amqp_url + + def connect(self): + """This method connects to RabbitMQ, returning the connection handle. + When the connection is established, the on_connection_open method + will be invoked by pika. + + :rtype: pika.SelectConnection + + """ + LOGGER.info('Connecting to %s', self._url) + return adapters.asyncio_connection.AsyncioConnection(pika.URLParameters(self._url), + self.on_connection_open) + + def close_connection(self): + """This method closes the connection to RabbitMQ.""" + LOGGER.info('Closing connection') + self._connection.close() + + def add_on_connection_close_callback(self): + """This method adds an on close callback that will be invoked by pika + when RabbitMQ closes the connection to the publisher unexpectedly. + + """ + LOGGER.info('Adding connection close callback') + self._connection.add_on_close_callback(self.on_connection_closed) + + def on_connection_closed(self, connection, reply_code, reply_text): + """This method is invoked by pika when the connection to RabbitMQ is + closed unexpectedly. Since it is unexpected, we will reconnect to + RabbitMQ if it disconnects. + + :param pika.connection.Connection connection: The closed connection obj + :param int reply_code: The server provided reply_code if given + :param str reply_text: The server provided reply_text if given + + """ + self._channel = None + if self._closing: + self._connection.ioloop.stop() + else: + LOGGER.warning('Connection closed, reopening in 5 seconds: (%s) %s', + reply_code, reply_text) + self._connection.add_timeout(5, self.reconnect) + + def on_connection_open(self, unused_connection): + """This method is called by pika once the connection to RabbitMQ has + been established. It passes the handle to the connection object in + case we need it, but in this case, we'll just mark it unused. + + :type unused_connection: pika.SelectConnection + + """ + LOGGER.info('Connection opened') + self.add_on_connection_close_callback() + self.open_channel() + + def reconnect(self): + """Will be invoked by the IOLoop timer if the connection is + closed. See the on_connection_closed method. + + """ + if not self._closing: + + # Create a new connection + self._connection = self.connect() + + def add_on_channel_close_callback(self): + """This method tells pika to call the on_channel_closed method if + RabbitMQ unexpectedly closes the channel. + + """ + LOGGER.info('Adding channel close callback') + self._channel.add_on_close_callback(self.on_channel_closed) + + def on_channel_closed(self, channel, reply_code, reply_text): + """Invoked by pika when RabbitMQ unexpectedly closes the channel. + Channels are usually closed if you attempt to do something that + violates the protocol, such as re-declare an exchange or queue with + different parameters. In this case, we'll close the connection + to shutdown the object. + + :param pika.channel.Channel: The closed channel + :param int reply_code: The numeric reason the channel was closed + :param str reply_text: The text reason the channel was closed + + """ + LOGGER.warning('Channel %i was closed: (%s) %s', + channel, reply_code, reply_text) + self._connection.close() + + def on_channel_open(self, channel): + """This method is invoked by pika when the channel has been opened. + The channel object is passed in so we can make use of it. + + Since the channel is now open, we'll declare the exchange to use. + + :param pika.channel.Channel channel: The channel object + + """ + LOGGER.info('Channel opened') + self._channel = channel + self.add_on_channel_close_callback() + self.setup_exchange(self.EXCHANGE) + + def setup_exchange(self, exchange_name): + """Setup the exchange on RabbitMQ by invoking the Exchange.Declare RPC + command. When it is complete, the on_exchange_declareok method will + be invoked by pika. + + :param str|unicode exchange_name: The name of the exchange to declare + + """ + LOGGER.info('Declaring exchange %s', exchange_name) + self._channel.exchange_declare(self.on_exchange_declareok, + exchange_name, + self.EXCHANGE_TYPE) + + def on_exchange_declareok(self, unused_frame): + """Invoked by pika when RabbitMQ has finished the Exchange.Declare RPC + command. + + :param pika.Frame.Method unused_frame: Exchange.DeclareOk response frame + + """ + LOGGER.info('Exchange declared') + self.setup_queue(self.QUEUE) + + def setup_queue(self, queue_name): + """Setup the queue on RabbitMQ by invoking the Queue.Declare RPC + command. When it is complete, the on_queue_declareok method will + be invoked by pika. + + :param str|unicode queue_name: The name of the queue to declare. + + """ + LOGGER.info('Declaring queue %s', queue_name) + self._channel.queue_declare(self.on_queue_declareok, queue_name) + + def on_queue_declareok(self, method_frame): + """Method invoked by pika when the Queue.Declare RPC call made in + setup_queue has completed. In this method we will bind the queue + and exchange together with the routing key by issuing the Queue.Bind + RPC command. When this command is complete, the on_bindok method will + be invoked by pika. + + :param pika.frame.Method method_frame: The Queue.DeclareOk frame + + """ + LOGGER.info('Binding %s to %s with %s', + self.EXCHANGE, self.QUEUE, self.ROUTING_KEY) + self._channel.queue_bind(self.on_bindok, self.QUEUE, + self.EXCHANGE, self.ROUTING_KEY) + + def add_on_cancel_callback(self): + """Add a callback that will be invoked if RabbitMQ cancels the consumer + for some reason. If RabbitMQ does cancel the consumer, + on_consumer_cancelled will be invoked by pika. + + """ + LOGGER.info('Adding consumer cancellation callback') + self._channel.add_on_cancel_callback(self.on_consumer_cancelled) + + def on_consumer_cancelled(self, method_frame): + """Invoked by pika when RabbitMQ sends a Basic.Cancel for a consumer + receiving messages. + + :param pika.frame.Method method_frame: The Basic.Cancel frame + + """ + LOGGER.info('Consumer was cancelled remotely, shutting down: %r', + method_frame) + if self._channel: + self._channel.close() + + def acknowledge_message(self, delivery_tag): + """Acknowledge the message delivery from RabbitMQ by sending a + Basic.Ack RPC method for the delivery tag. + + :param int delivery_tag: The delivery tag from the Basic.Deliver frame + + """ + LOGGER.info('Acknowledging message %s', delivery_tag) + self._channel.basic_ack(delivery_tag) + + def on_message(self, unused_channel, basic_deliver, properties, body): + """Invoked by pika when a message is delivered from RabbitMQ. The + channel is passed for your convenience. The basic_deliver object that + is passed in carries the exchange, routing key, delivery tag and + a redelivered flag for the message. The properties passed in is an + instance of BasicProperties with the message properties and the body + is the message that was sent. + + :param pika.channel.Channel unused_channel: The channel object + :param pika.Spec.Basic.Deliver: basic_deliver method + :param pika.Spec.BasicProperties: properties + :param str|unicode body: The message body + + """ + LOGGER.info('Received message # %s from %s: %s', + basic_deliver.delivery_tag, properties.app_id, body) + self.acknowledge_message(basic_deliver.delivery_tag) + + def on_cancelok(self, unused_frame): + """This method is invoked by pika when RabbitMQ acknowledges the + cancellation of a consumer. At this point we will close the channel. + This will invoke the on_channel_closed method once the channel has been + closed, which will in-turn close the connection. + + :param pika.frame.Method unused_frame: The Basic.CancelOk frame + + """ + LOGGER.info('RabbitMQ acknowledged the cancellation of the consumer') + self.close_channel() + + def stop_consuming(self): + """Tell RabbitMQ that you would like to stop consuming by sending the + Basic.Cancel RPC command. + + """ + if self._channel: + LOGGER.info('Sending a Basic.Cancel RPC command to RabbitMQ') + self._channel.basic_cancel(self.on_cancelok, self._consumer_tag) + + def start_consuming(self): + """This method sets up the consumer by first calling + add_on_cancel_callback so that the object is notified if RabbitMQ + cancels the consumer. It then issues the Basic.Consume RPC command + which returns the consumer tag that is used to uniquely identify the + consumer with RabbitMQ. We keep the value to use it when we want to + cancel consuming. The on_message method is passed in as a callback pika + will invoke when a message is fully received. + + """ + LOGGER.info('Issuing consumer related RPC commands') + self.add_on_cancel_callback() + self._consumer_tag = self._channel.basic_consume(self.on_message, + self.QUEUE) + + def on_bindok(self, unused_frame): + """Invoked by pika when the Queue.Bind method has completed. At this + point we will start consuming messages by calling start_consuming + which will invoke the needed RPC commands to start the process. + + :param pika.frame.Method unused_frame: The Queue.BindOk response frame + + """ + LOGGER.info('Queue bound') + self.start_consuming() + + def close_channel(self): + """Call to close the channel with RabbitMQ cleanly by issuing the + Channel.Close RPC command. + + """ + LOGGER.info('Closing the channel') + self._channel.close() + + def open_channel(self): + """Open a new channel with RabbitMQ by issuing the Channel.Open RPC + command. When RabbitMQ responds that the channel is open, the + on_channel_open callback will be invoked by pika. + + """ + LOGGER.info('Creating a new channel') + self._connection.channel(on_open_callback=self.on_channel_open) + + def run(self): + """Run the example consumer by connecting to RabbitMQ and then + starting the IOLoop to block and allow the SelectConnection to operate. + + """ + self._connection = self.connect() + self._connection.ioloop.start() + + def stop(self): + """Cleanly shutdown the connection to RabbitMQ by stopping the consumer + with RabbitMQ. When RabbitMQ confirms the cancellation, on_cancelok + will be invoked by pika, which will then closing the channel and + connection. The IOLoop is started again because this method is invoked + when CTRL-C is pressed raising a KeyboardInterrupt exception. This + exception stops the IOLoop which needs to be running for pika to + communicate with RabbitMQ. All of the commands issued prior to starting + the IOLoop will be buffered but not processed. + + """ + LOGGER.info('Stopping') + self._closing = True + self.stop_consuming() + self._connection.ioloop.start() + LOGGER.info('Stopped') + + + def main(): + logging.basicConfig(level=logging.INFO, format=LOG_FORMAT) + example = ExampleConsumer('amqp://guest:guest@localhost:5672/%2F') + try: + example.run() + except KeyboardInterrupt: + example.stop() + + + if __name__ == '__main__': + main() + diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/docs/examples/blocking_basic_get.rst b/NodeRed/NodeRedFiles/pika-0.13.1/docs/examples/blocking_basic_get.rst new file mode 100644 index 000000000..d679ea825 --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/docs/examples/blocking_basic_get.rst @@ -0,0 +1,23 @@ +Using the Blocking Connection to get a message from RabbitMQ +============================================================ + +.. _example_blocking_basic_get: + +The :py:meth:`BlockingChannel.basic_get ` method will return a tuple with the members. + +If the server returns a message, the first item in the tuple will be a :class:`pika.spec.Basic.GetOk` object with the current message count, the redelivered flag, the routing key that was used to put the message in the queue, and the exchange the message was published to. The second item will be a :py:class:`~pika.spec.BasicProperties` object and the third will be the message body. + +If the server did not return a message a tuple of None, None, None will be returned. + +Example of getting a message and acknowledging it:: + + import pika + + connection = pika.BlockingConnection() + channel = connection.channel() + method_frame, header_frame, body = channel.basic_get('test') + if method_frame: + print(method_frame, header_frame, body) + channel.basic_ack(method_frame.delivery_tag) + else: + print('No message returned') diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/docs/examples/blocking_consume.rst b/NodeRed/NodeRedFiles/pika-0.13.1/docs/examples/blocking_consume.rst new file mode 100644 index 000000000..85852e460 --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/docs/examples/blocking_consume.rst @@ -0,0 +1,29 @@ +Using the Blocking Connection to consume messages from RabbitMQ +=============================================================== + +.. _example_blocking_basic_consume: + +The :py:meth:`BlockingChannel.basic_consume ` method assign a callback method to be called every time that RabbitMQ delivers messages to your consuming application. + +When pika calls your method, it will pass in the channel, a :py:class:`pika.spec.Basic.Deliver` object with the delivery tag, the redelivered flag, the routing key that was used to put the message in the queue, and the exchange the message was published to. The third argument will be a :py:class:`pika.spec.BasicProperties` object and the last will be the message body. + +Example of consuming messages and acknowledging them:: + + import pika + + + def on_message(channel, method_frame, header_frame, body): + print(method_frame.delivery_tag) + print(body) + print() + channel.basic_ack(delivery_tag=method_frame.delivery_tag) + + + connection = pika.BlockingConnection() + channel = connection.channel() + channel.basic_consume(on_message, 'test') + try: + channel.start_consuming() + except KeyboardInterrupt: + channel.stop_consuming() + connection.close() \ No newline at end of file diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/docs/examples/blocking_consumer_generator.rst b/NodeRed/NodeRedFiles/pika-0.13.1/docs/examples/blocking_consumer_generator.rst new file mode 100644 index 000000000..f875a1095 --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/docs/examples/blocking_consumer_generator.rst @@ -0,0 +1,73 @@ +Using the BlockingChannel.consume generator to consume messages +=============================================================== + +.. _example_blocking_basic_get: + +The :py:meth:`BlockingChannel.consume ` method is a generator that will return a tuple of method, properties and body. + +When you escape out of the loop, be sure to call consumer.cancel() to return any unprocessed messages. + +Example of consuming messages and acknowledging them:: + + import pika + + connection = pika.BlockingConnection() + channel = connection.channel() + + # Get ten messages and break out + for method_frame, properties, body in channel.consume('test'): + + # Display the message parts + print(method_frame) + print(properties) + print(body) + + # Acknowledge the message + channel.basic_ack(method_frame.delivery_tag) + + # Escape out of the loop after 10 messages + if method_frame.delivery_tag == 10: + break + + # Cancel the consumer and return any pending messages + requeued_messages = channel.cancel() + print('Requeued %i messages' % requeued_messages) + + # Close the channel and the connection + channel.close() + connection.close() + +If you have pending messages in the test queue, your output should look something like:: + + (pika)gmr-0x02:pika gmr$ python blocking_nack.py + + + Hello World! + + + Hello World! + + + Hello World! + + + Hello World! + + + Hello World! + + + Hello World! + + + Hello World! + + + Hello World! + + + Hello World! + + + Hello World! + Requeued 1894 messages diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/docs/examples/blocking_delivery_confirmations.rst b/NodeRed/NodeRedFiles/pika-0.13.1/docs/examples/blocking_delivery_confirmations.rst new file mode 100644 index 000000000..ade888f58 --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/docs/examples/blocking_delivery_confirmations.rst @@ -0,0 +1,28 @@ +Using Delivery Confirmations with the BlockingConnection +======================================================== + +The following code demonstrates how to turn on delivery confirmations with the BlockingConnection and how to check for confirmation from RabbitMQ:: + + import pika + + # Open a connection to RabbitMQ on localhost using all default parameters + connection = pika.BlockingConnection() + + # Open the channel + channel = connection.channel() + + # Declare the queue + channel.queue_declare(queue="test", durable=True, exclusive=False, auto_delete=False) + + # Turn on delivery confirmations + channel.confirm_delivery() + + # Send a message + if channel.basic_publish(exchange='test', + routing_key='test', + body='Hello World!', + properties=pika.BasicProperties(content_type='text/plain', + delivery_mode=1)): + print('Message publish was confirmed') + else: + print('Message could not be confirmed') diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/docs/examples/blocking_publish_mandatory.rst b/NodeRed/NodeRedFiles/pika-0.13.1/docs/examples/blocking_publish_mandatory.rst new file mode 100644 index 000000000..800cf667d --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/docs/examples/blocking_publish_mandatory.rst @@ -0,0 +1,29 @@ +Ensuring message delivery with the mandatory flag +================================================= + +The following example demonstrates how to check if a message is delivered by setting the mandatory flag and checking the return result when using the BlockingConnection:: + + import pika + + # Open a connection to RabbitMQ on localhost using all default parameters + connection = pika.BlockingConnection() + + # Open the channel + channel = connection.channel() + + # Declare the queue + channel.queue_declare(queue="test", durable=True, exclusive=False, auto_delete=False) + + # Enabled delivery confirmations + channel.confirm_delivery() + + # Send a message + if channel.basic_publish(exchange='test', + routing_key='test', + body='Hello World!', + properties=pika.BasicProperties(content_type='text/plain', + delivery_mode=1), + mandatory=True): + print('Message was published') + else: + print('Message was returned') diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/docs/examples/comparing_publishing_sync_async.rst b/NodeRed/NodeRedFiles/pika-0.13.1/docs/examples/comparing_publishing_sync_async.rst new file mode 100644 index 000000000..89c48faa7 --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/docs/examples/comparing_publishing_sync_async.rst @@ -0,0 +1,64 @@ +Comparing Message Publishing with BlockingConnection and SelectConnection +========================================================================= + +For those doing simple, non-asynchronous programming, :py:meth:`pika.adapters.blocking_connection.BlockingConnection` proves to be the easiest way to get up and running with Pika to publish messages. + +In the following example, a connection is made to RabbitMQ listening to port *5672* on *localhost* using the username *guest* and password *guest* and virtual host */*. Once connected, a channel is opened and a message is published to the *test_exchange* exchange using the *test_routing_key* routing key. The BasicProperties value passed in sets the message to delivery mode *1* (non-persisted) with a content-type of *text/plain*. Once the message is published, the connection is closed:: + + import pika + + parameters = pika.URLParameters('amqp://guest:guest@localhost:5672/%2F') + + connection = pika.BlockingConnection(parameters) + + channel = connection.channel() + + channel.basic_publish('test_exchange', + 'test_routing_key', + 'message body value', + pika.BasicProperties(content_type='text/plain', + delivery_mode=1)) + + connection.close() + + +In contrast, using :py:meth:`pika.adapters.select_connection.SelectConnection` and the other asynchronous adapters is more complicated and less pythonic, but when used with other asynchronous services can have tremendous performance improvements. In the following code example, all of the same parameters and values are used as were used in the previous example:: + + import pika + + # Step #3 + def on_open(connection): + + connection.channel(on_channel_open) + + # Step #4 + def on_channel_open(channel): + + channel.basic_publish('test_exchange', + 'test_routing_key', + 'message body value', + pika.BasicProperties(content_type='text/plain', + delivery_mode=1)) + + connection.close() + + # Step #1: Connect to RabbitMQ + parameters = pika.URLParameters('amqp://guest:guest@localhost:5672/%2F') + + connection = pika.SelectConnection(parameters=parameters, + on_open_callback=on_open) + + try: + + # Step #2 - Block on the IOLoop + connection.ioloop.start() + + # Catch a Keyboard Interrupt to make sure that the connection is closed cleanly + except KeyboardInterrupt: + + # Gracefully close the connection + connection.close() + + # Start the IOLoop again so Pika can communicate, it will stop on its own when the connection is closed + connection.ioloop.start() + diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/docs/examples/connecting_async.rst b/NodeRed/NodeRedFiles/pika-0.13.1/docs/examples/connecting_async.rst new file mode 100644 index 000000000..125de3c96 --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/docs/examples/connecting_async.rst @@ -0,0 +1,49 @@ +Connecting to RabbitMQ with Callback-Passing Style +================================================== + +When you connect to RabbitMQ with an asynchronous adapter, you are writing event +oriented code. The connection adapter will block on the IOLoop that is watching +to see when pika should read data from and write data to RabbitMQ. Because you're +now blocking on the IOLoop, you will receive callback notifications when specific +events happen. + +Example Code +------------ +In the example, there are three steps that take place: + +1. Setup the connection to RabbitMQ +2. Start the IOLoop +3. Once connected, the on_open method will be called by Pika with a handle to + the connection. In this method, a new channel will be opened on the connection. +4. Once the channel is opened, you can do your other actions, whether they be + publishing messages, consuming messages or other RabbitMQ related activities.:: + + import pika + + # Step #3 + def on_open(connection): + connection.channel(on_channel_open) + + # Step #4 + def on_channel_open(channel): + channel.basic_publish('exchange_name', + 'routing_key', + 'Test Message', + pika.BasicProperties(content_type='text/plain', + type='example')) + + # Step #1: Connect to RabbitMQ + connection = pika.SelectConnection(on_open_callback=on_open) + + try: + # Step #2 - Block on the IOLoop + connection.ioloop.start() + + # Catch a Keyboard Interrupt to make sure that the connection is closed cleanly + except KeyboardInterrupt: + + # Gracefully close the connection + connection.close() + + # Start the IOLoop again so Pika can communicate, it will stop on its own when the connection is closed + connection.ioloop.start() diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/docs/examples/direct_reply_to.rst b/NodeRed/NodeRedFiles/pika-0.13.1/docs/examples/direct_reply_to.rst new file mode 100644 index 000000000..3d8f6d8ec --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/docs/examples/direct_reply_to.rst @@ -0,0 +1,81 @@ +Direct reply-to example +============================== +The following example demonstrates the use of the RabbitMQ "Direct reply-to" feature via `pika.BlockingConnection`. See https://www.rabbitmq.com/direct-reply-to.html for more info about this feature. + +direct_reply_to.py:: + + # -*- coding: utf-8 -*- + + """ + This example demonstrates the RabbitMQ "Direct reply-to" usage via + `pika.BlockingConnection`. See https://www.rabbitmq.com/direct-reply-to.html + for more info about this feature. + """ + import pika + + + SERVER_QUEUE = 'rpc.server.queue' + + + def main(): + """ Here, Client sends "Marco" to RPC Server, and RPC Server replies with + "Polo". + + NOTE Normally, the server would be running separately from the client, but + in this very simple example both are running in the same thread and sharing + connection and channel. + + """ + with pika.BlockingConnection() as conn: + channel = conn.channel() + + # Set up server + + channel.queue_declare(queue=SERVER_QUEUE, + exclusive=True, + auto_delete=True) + channel.basic_consume(on_server_rx_rpc_request, queue=SERVER_QUEUE) + + + # Set up client + + # NOTE Client must create its consumer and publish RPC requests on the + # same channel to enable the RabbitMQ broker to make the necessary + # associations. + # + # Also, client must create the consumer *before* starting to publish the + # RPC requests. + # + # Client must create its consumer with no_ack=True, because the reply-to + # queue isn't real. + + channel.basic_consume(on_client_rx_reply_from_server, + queue='amq.rabbitmq.reply-to', + no_ack=True) + channel.basic_publish( + exchange='', + routing_key=SERVER_QUEUE, + body='Marco', + properties=pika.BasicProperties(reply_to='amq.rabbitmq.reply-to')) + + channel.start_consuming() + + + def on_server_rx_rpc_request(ch, method_frame, properties, body): + print 'RPC Server got request:', body + + ch.basic_publish('', routing_key=properties.reply_to, body='Polo') + + ch.basic_ack(delivery_tag=method_frame.delivery_tag) + + print 'RPC Server says good bye' + + + def on_client_rx_reply_from_server(ch, method_frame, properties, body): + print 'RPC Client got reply:', body + + # NOTE A real client might want to make additional RPC requests, but in this + # simple example we're closing the channel after getting our first reply + # to force control to return from channel.start_consuming() + print 'RPC Client says bye' + ch.close() diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/docs/examples/heartbeat_and_blocked_timeouts.rst b/NodeRed/NodeRedFiles/pika-0.13.1/docs/examples/heartbeat_and_blocked_timeouts.rst new file mode 100644 index 000000000..d7469a100 --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/docs/examples/heartbeat_and_blocked_timeouts.rst @@ -0,0 +1,37 @@ +Ensuring well-behaved connection with heartbeat and blocked-connection timeouts +=============================================================================== + + +This example demonstrates explicit setting of heartbeat and blocked connection timeouts. + +Starting with RabbitMQ 3.5.5, the broker's default heartbeat timeout decreased from 580 seconds to 60 seconds. As a result, applications that perform lengthy processing in the same thread that also runs their Pika connection may experience unexpected dropped connections due to heartbeat timeout. Here, we specify an explicit lower bound for heartbeat timeout. + +When RabbitMQ broker is running out of certain resources, such as memory and disk space, it may block connections that are performing resource-consuming operations, such as publishing messages. Once a connection is blocked, RabbitMQ stops reading from that connection's socket, so no commands from the client will get through to the broker on that connection until the broker unblocks it. A blocked connection may last for an indefinite period of time, stalling the connection and possibly resulting in a hang (e.g., in BlockingConnection) until the connection is unblocked. Blocked Connection Timeout is intended to interrupt (i.e., drop) a connection that has been blocked longer than the given timeout value. + +Example of configuring hertbeat and blocked-connection timeouts:: + + import pika + + + def main(): + + # NOTE: These parameters work with all Pika connection types + params = pika.ConnectionParameters(heartbeat_interval=600, + blocked_connection_timeout=300) + + conn = pika.BlockingConnection(params) + + chan = conn.channel() + + chan.basic_publish('', 'my-alphabet-queue', "abc") + + # If publish causes the connection to become blocked, then this conn.close() + # would hang until the connection is unblocked, if ever. However, the + # blocked_connection_timeout connection parameter would interrupt the wait, + # resulting in ConnectionClosed exception from BlockingConnection (or the + # on_connection_closed callback call in an asynchronous adapter) + conn.close() + + + if __name__ == '__main__': + main() diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/docs/examples/tls_mutual_authentication.rst b/NodeRed/NodeRedFiles/pika-0.13.1/docs/examples/tls_mutual_authentication.rst new file mode 100644 index 000000000..9cd8decd1 --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/docs/examples/tls_mutual_authentication.rst @@ -0,0 +1,61 @@ +TLS parameters example +============================= +This examples demonstrates a TLS session with RabbitMQ using mutual authentication. + +It was tested against RabbitMQ 3.6.10, using Python 3.6.1 and pre-release Pika `0.11.0` + +Note the use of `ssl_version=ssl.PROTOCOL_TLSv1`. The recent verions of RabbitMQ disable older versions of +SSL due to security vulnerabilities. + +See https://www.rabbitmq.com/ssl.html for certificate creation and rabbitmq SSL configuration instructions. + + +tls_example.py:: + + import ssl + import pika + import logging + + logging.basicConfig(level=logging.INFO) + + cp = pika.ConnectionParameters( + ssl=True, + ssl_options=dict( + ssl_version=ssl.PROTOCOL_TLSv1, + ca_certs="/Users/me/tls-gen/basic/testca/cacert.pem", + keyfile="/Users/me/tls-gen/basic/client/key.pem", + certfile="/Users/me/tls-gen/basic/client/cert.pem", + cert_reqs=ssl.CERT_REQUIRED)) + + conn = pika.BlockingConnection(cp) + ch = conn.channel() + print(ch.queue_declare("sslq")) + ch.publish("", "sslq", "abc") + print(ch.basic_get("sslq")) + + +rabbitmq.config:: + + %% Both the client and rabbitmq server were running on the same machine, a MacBookPro laptop. + %% + %% rabbitmq.config was created in its default location for OS X: /usr/local/etc/rabbitmq/rabbitmq.config. + %% + %% The contents of the example rabbitmq.config are for demonstration purposes only. See https://www.rabbitmq.com/ssl.html for instructions about creating the test certificates and the contents of rabbitmq.config. + + + [ + {rabbit, + [ + {ssl_listeners, [{"127.0.0.1", 5671}]}, + + %% Configuring SSL. + %% See http://www.rabbitmq.com/ssl.html for full documentation. + %% + {ssl_options, [{cacertfile, "/Users/me/tls-gen/basic/testca/cacert.pem"}, + {certfile, "/Users/me/tls-gen/basic/server/cert.pem"}, + {keyfile, "/Users/me/tls-gen/basic/server/key.pem"}, + {verify, verify_peer}, + {fail_if_no_peer_cert, true}]} + ] + } + ]. diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/docs/examples/tls_server_uathentication.rst b/NodeRed/NodeRedFiles/pika-0.13.1/docs/examples/tls_server_uathentication.rst new file mode 100644 index 000000000..2cdb4ecd7 --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/docs/examples/tls_server_uathentication.rst @@ -0,0 +1,60 @@ +TLS parameters example +============================= +This examples demonstrates a TLS session with RabbitMQ using server authentication. + +It was tested against RabbitMQ 3.6.10, using Python 3.6.1 and pre-release Pika `0.11.0` + +Note the use of `ssl_version=ssl.PROTOCOL_TLSv1`. The recent versions of RabbitMQ disable older versions of +SSL due to security vulnerabilities. + +See https://www.rabbitmq.com/ssl.html for certificate creation and rabbitmq SSL configuration instructions. + + +tls_example.py:: + + import ssl + import pika + import logging + + logging.basicConfig(level=logging.INFO) + + cp = pika.ConnectionParameters( + ssl=True, + ssl_options=dict( + ssl_version=ssl.PROTOCOL_TLSv1, + ca_certs="/Users/me/tls-gen/basic/testca/cacert.pem", + cert_reqs=ssl.CERT_REQUIRED)) + + conn = pika.BlockingConnection(cp) + ch = conn.channel() + print(ch.queue_declare("sslq")) + ch.publish("", "sslq", "abc") + print(ch.basic_get("sslq")) + + +rabbitmq.config:: + + %% Both the client and rabbitmq server were running on the same machine, a MacBookPro laptop. + %% + %% rabbitmq.config was created in its default location for OS X: /usr/local/etc/rabbitmq/rabbitmq.config. + %% + %% The contents of the example rabbitmq.config are for demonstration purposes only. See https://www.rabbitmq.com/ssl.html for instructions about creating the test certificates and the contents of rabbitmq.config. + %% + %% Note that the {fail_if_no_peer_cert,false} option, states that RabbitMQ should accept clients that don't have a certificate to send to the broker, but through the {verify,verify_peer} option, we state that if the client does send a certificate to the broker, the broker must be able to establish a chain of trust to it. + + [ + {rabbit, + [ + {ssl_listeners, [{"127.0.0.1", 5671}]}, + + %% Configuring SSL. + %% See http://www.rabbitmq.com/ssl.html for full documentation. + %% + {ssl_options, [{cacertfile, "/Users/me/tls-gen/basic/testca/cacert.pem"}, + {certfile, "/Users/me/tls-gen/basic/server/cert.pem"}, + {keyfile, "/Users/me/tls-gen/basic/server/key.pem"}, + {verify, verify_peer}, + {fail_if_no_peer_cert, false}]} + ] + } + ]. diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/docs/examples/tornado_consumer.rst b/NodeRed/NodeRedFiles/pika-0.13.1/docs/examples/tornado_consumer.rst new file mode 100644 index 000000000..0dae22181 --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/docs/examples/tornado_consumer.rst @@ -0,0 +1,349 @@ +Tornado Consumer +================ +The following example implements a consumer using the :class:`Tornado adapter ` for the `Tornado framework `_ that will respond to RPC commands sent from RabbitMQ. For example, it will reconnect if RabbitMQ closes the connection and will shutdown if RabbitMQ cancels the consumer or closes the channel. While it may look intimidating, each method is very short and represents a individual actions that a consumer can do. + +consumer.py:: + + from pika import adapters + import pika + import logging + + LOG_FORMAT = ('%(levelname) -10s %(asctime)s %(name) -30s %(funcName) ' + '-35s %(lineno) -5d: %(message)s') + LOGGER = logging.getLogger(__name__) + + + class ExampleConsumer(object): + """This is an example consumer that will handle unexpected interactions + with RabbitMQ such as channel and connection closures. + + If RabbitMQ closes the connection, it will reopen it. You should + look at the output, as there are limited reasons why the connection may + be closed, which usually are tied to permission related issues or + socket timeouts. + + If the channel is closed, it will indicate a problem with one of the + commands that were issued and that should surface in the output as well. + + """ + EXCHANGE = 'message' + EXCHANGE_TYPE = 'topic' + QUEUE = 'text' + ROUTING_KEY = 'example.text' + + def __init__(self, amqp_url): + """Create a new instance of the consumer class, passing in the AMQP + URL used to connect to RabbitMQ. + + :param str amqp_url: The AMQP url to connect with + + """ + self._connection = None + self._channel = None + self._closing = False + self._consumer_tag = None + self._url = amqp_url + + def connect(self): + """This method connects to RabbitMQ, returning the connection handle. + When the connection is established, the on_connection_open method + will be invoked by pika. + + :rtype: pika.SelectConnection + + """ + LOGGER.info('Connecting to %s', self._url) + return adapters.tornado_connection.TornadoConnection(pika.URLParameters(self._url), + self.on_connection_open) + + def close_connection(self): + """This method closes the connection to RabbitMQ.""" + LOGGER.info('Closing connection') + self._connection.close() + + def add_on_connection_close_callback(self): + """This method adds an on close callback that will be invoked by pika + when RabbitMQ closes the connection to the publisher unexpectedly. + + """ + LOGGER.info('Adding connection close callback') + self._connection.add_on_close_callback(self.on_connection_closed) + + def on_connection_closed(self, connection, reply_code, reply_text): + """This method is invoked by pika when the connection to RabbitMQ is + closed unexpectedly. Since it is unexpected, we will reconnect to + RabbitMQ if it disconnects. + + :param pika.connection.Connection connection: The closed connection obj + :param int reply_code: The server provided reply_code if given + :param str reply_text: The server provided reply_text if given + + """ + self._channel = None + if self._closing: + self._connection.ioloop.stop() + else: + LOGGER.warning('Connection closed, reopening in 5 seconds: (%s) %s', + reply_code, reply_text) + self._connection.add_timeout(5, self.reconnect) + + def on_connection_open(self, unused_connection): + """This method is called by pika once the connection to RabbitMQ has + been established. It passes the handle to the connection object in + case we need it, but in this case, we'll just mark it unused. + + :type unused_connection: pika.SelectConnection + + """ + LOGGER.info('Connection opened') + self.add_on_connection_close_callback() + self.open_channel() + + def reconnect(self): + """Will be invoked by the IOLoop timer if the connection is + closed. See the on_connection_closed method. + + """ + if not self._closing: + + # Create a new connection + self._connection = self.connect() + + def add_on_channel_close_callback(self): + """This method tells pika to call the on_channel_closed method if + RabbitMQ unexpectedly closes the channel. + + """ + LOGGER.info('Adding channel close callback') + self._channel.add_on_close_callback(self.on_channel_closed) + + def on_channel_closed(self, channel, reply_code, reply_text): + """Invoked by pika when RabbitMQ unexpectedly closes the channel. + Channels are usually closed if you attempt to do something that + violates the protocol, such as re-declare an exchange or queue with + different parameters. In this case, we'll close the connection + to shutdown the object. + + :param pika.channel.Channel: The closed channel + :param int reply_code: The numeric reason the channel was closed + :param str reply_text: The text reason the channel was closed + + """ + LOGGER.warning('Channel %i was closed: (%s) %s', + channel, reply_code, reply_text) + self._connection.close() + + def on_channel_open(self, channel): + """This method is invoked by pika when the channel has been opened. + The channel object is passed in so we can make use of it. + + Since the channel is now open, we'll declare the exchange to use. + + :param pika.channel.Channel channel: The channel object + + """ + LOGGER.info('Channel opened') + self._channel = channel + self.add_on_channel_close_callback() + self.setup_exchange(self.EXCHANGE) + + def setup_exchange(self, exchange_name): + """Setup the exchange on RabbitMQ by invoking the Exchange.Declare RPC + command. When it is complete, the on_exchange_declareok method will + be invoked by pika. + + :param str|unicode exchange_name: The name of the exchange to declare + + """ + LOGGER.info('Declaring exchange %s', exchange_name) + self._channel.exchange_declare(self.on_exchange_declareok, + exchange_name, + self.EXCHANGE_TYPE) + + def on_exchange_declareok(self, unused_frame): + """Invoked by pika when RabbitMQ has finished the Exchange.Declare RPC + command. + + :param pika.Frame.Method unused_frame: Exchange.DeclareOk response frame + + """ + LOGGER.info('Exchange declared') + self.setup_queue(self.QUEUE) + + def setup_queue(self, queue_name): + """Setup the queue on RabbitMQ by invoking the Queue.Declare RPC + command. When it is complete, the on_queue_declareok method will + be invoked by pika. + + :param str|unicode queue_name: The name of the queue to declare. + + """ + LOGGER.info('Declaring queue %s', queue_name) + self._channel.queue_declare(self.on_queue_declareok, queue_name) + + def on_queue_declareok(self, method_frame): + """Method invoked by pika when the Queue.Declare RPC call made in + setup_queue has completed. In this method we will bind the queue + and exchange together with the routing key by issuing the Queue.Bind + RPC command. When this command is complete, the on_bindok method will + be invoked by pika. + + :param pika.frame.Method method_frame: The Queue.DeclareOk frame + + """ + LOGGER.info('Binding %s to %s with %s', + self.EXCHANGE, self.QUEUE, self.ROUTING_KEY) + self._channel.queue_bind(self.on_bindok, self.QUEUE, + self.EXCHANGE, self.ROUTING_KEY) + + def add_on_cancel_callback(self): + """Add a callback that will be invoked if RabbitMQ cancels the consumer + for some reason. If RabbitMQ does cancel the consumer, + on_consumer_cancelled will be invoked by pika. + + """ + LOGGER.info('Adding consumer cancellation callback') + self._channel.add_on_cancel_callback(self.on_consumer_cancelled) + + def on_consumer_cancelled(self, method_frame): + """Invoked by pika when RabbitMQ sends a Basic.Cancel for a consumer + receiving messages. + + :param pika.frame.Method method_frame: The Basic.Cancel frame + + """ + LOGGER.info('Consumer was cancelled remotely, shutting down: %r', + method_frame) + if self._channel: + self._channel.close() + + def acknowledge_message(self, delivery_tag): + """Acknowledge the message delivery from RabbitMQ by sending a + Basic.Ack RPC method for the delivery tag. + + :param int delivery_tag: The delivery tag from the Basic.Deliver frame + + """ + LOGGER.info('Acknowledging message %s', delivery_tag) + self._channel.basic_ack(delivery_tag) + + def on_message(self, unused_channel, basic_deliver, properties, body): + """Invoked by pika when a message is delivered from RabbitMQ. The + channel is passed for your convenience. The basic_deliver object that + is passed in carries the exchange, routing key, delivery tag and + a redelivered flag for the message. The properties passed in is an + instance of BasicProperties with the message properties and the body + is the message that was sent. + + :param pika.channel.Channel unused_channel: The channel object + :param pika.Spec.Basic.Deliver: basic_deliver method + :param pika.Spec.BasicProperties: properties + :param str|unicode body: The message body + + """ + LOGGER.info('Received message # %s from %s: %s', + basic_deliver.delivery_tag, properties.app_id, body) + self.acknowledge_message(basic_deliver.delivery_tag) + + def on_cancelok(self, unused_frame): + """This method is invoked by pika when RabbitMQ acknowledges the + cancellation of a consumer. At this point we will close the channel. + This will invoke the on_channel_closed method once the channel has been + closed, which will in-turn close the connection. + + :param pika.frame.Method unused_frame: The Basic.CancelOk frame + + """ + LOGGER.info('RabbitMQ acknowledged the cancellation of the consumer') + self.close_channel() + + def stop_consuming(self): + """Tell RabbitMQ that you would like to stop consuming by sending the + Basic.Cancel RPC command. + + """ + if self._channel: + LOGGER.info('Sending a Basic.Cancel RPC command to RabbitMQ') + self._channel.basic_cancel(self.on_cancelok, self._consumer_tag) + + def start_consuming(self): + """This method sets up the consumer by first calling + add_on_cancel_callback so that the object is notified if RabbitMQ + cancels the consumer. It then issues the Basic.Consume RPC command + which returns the consumer tag that is used to uniquely identify the + consumer with RabbitMQ. We keep the value to use it when we want to + cancel consuming. The on_message method is passed in as a callback pika + will invoke when a message is fully received. + + """ + LOGGER.info('Issuing consumer related RPC commands') + self.add_on_cancel_callback() + self._consumer_tag = self._channel.basic_consume(self.on_message, + self.QUEUE) + + def on_bindok(self, unused_frame): + """Invoked by pika when the Queue.Bind method has completed. At this + point we will start consuming messages by calling start_consuming + which will invoke the needed RPC commands to start the process. + + :param pika.frame.Method unused_frame: The Queue.BindOk response frame + + """ + LOGGER.info('Queue bound') + self.start_consuming() + + def close_channel(self): + """Call to close the channel with RabbitMQ cleanly by issuing the + Channel.Close RPC command. + + """ + LOGGER.info('Closing the channel') + self._channel.close() + + def open_channel(self): + """Open a new channel with RabbitMQ by issuing the Channel.Open RPC + command. When RabbitMQ responds that the channel is open, the + on_channel_open callback will be invoked by pika. + + """ + LOGGER.info('Creating a new channel') + self._connection.channel(on_open_callback=self.on_channel_open) + + def run(self): + """Run the example consumer by connecting to RabbitMQ and then + starting the IOLoop to block and allow the SelectConnection to operate. + + """ + self._connection = self.connect() + self._connection.ioloop.start() + + def stop(self): + """Cleanly shutdown the connection to RabbitMQ by stopping the consumer + with RabbitMQ. When RabbitMQ confirms the cancellation, on_cancelok + will be invoked by pika, which will then closing the channel and + connection. The IOLoop is started again because this method is invoked + when CTRL-C is pressed raising a KeyboardInterrupt exception. This + exception stops the IOLoop which needs to be running for pika to + communicate with RabbitMQ. All of the commands issued prior to starting + the IOLoop will be buffered but not processed. + + """ + LOGGER.info('Stopping') + self._closing = True + self.stop_consuming() + self._connection.ioloop.start() + LOGGER.info('Stopped') + + + def main(): + logging.basicConfig(level=logging.INFO, format=LOG_FORMAT) + example = ExampleConsumer('amqp://guest:guest@localhost:5672/%2F') + try: + example.run() + except KeyboardInterrupt: + example.stop() + + + if __name__ == '__main__': + main() + diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/docs/examples/twisted_example.rst b/NodeRed/NodeRedFiles/pika-0.13.1/docs/examples/twisted_example.rst new file mode 100644 index 000000000..e4a36f8a1 --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/docs/examples/twisted_example.rst @@ -0,0 +1,49 @@ +Twisted Consumer Example +======================== +Example of writing a consumer using the :py:class:`Twisted connection adapter `:: + + # -*- coding:utf-8 -*- + + import pika + from pika import exceptions + from pika.adapters import twisted_connection + from twisted.internet import defer, reactor, protocol,task + + + @defer.inlineCallbacks + def run(connection): + + channel = yield connection.channel() + + exchange = yield channel.exchange_declare(exchange='topic_link', exchange_type='topic') + + queue = yield channel.queue_declare(queue='hello', auto_delete=False, exclusive=False) + + yield channel.queue_bind(exchange='topic_link',queue='hello',routing_key='hello.world') + + yield channel.basic_qos(prefetch_count=1) + + queue_object, consumer_tag = yield channel.basic_consume(queue='hello',no_ack=False) + + l = task.LoopingCall(read, queue_object) + + l.start(0.01) + + + @defer.inlineCallbacks + def read(queue_object): + + ch,method,properties,body = yield queue_object.get() + + if body: + print(body) + + yield ch.basic_ack(delivery_tag=method.delivery_tag) + + + parameters = pika.ConnectionParameters() + cc = protocol.ClientCreator(reactor, twisted_connection.TwistedProtocolConnection, parameters) + d = cc.connectTCP('hostname', 5672) + d.addCallback(lambda protocol: protocol.ready) + d.addCallback(run) + reactor.run() diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/docs/examples/using_urlparameters.rst b/NodeRed/NodeRedFiles/pika-0.13.1/docs/examples/using_urlparameters.rst new file mode 100644 index 000000000..b9f73cd8d --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/docs/examples/using_urlparameters.rst @@ -0,0 +1,68 @@ +Using URLParameters +=================== +Pika has two methods of encapsulating the data that lets it know how to connect +to RabbitMQ, :py:class:`pika.connection.ConnectionParameters` and :py:class:`pika.connection.URLParameters`. + +.. note:: + If you're connecting to RabbitMQ on localhost on port 5672, with the default virtual host of */* and the default username and password of *guest* and *guest*, you do not need to specify connection parameters when connecting. + +Using :py:class:`pika.connection.URLParameters` is an easy way to minimize the +variables required to connect to RabbitMQ and supports all of the directives +that :py:class:`pika.connection.ConnectionParameters` supports. + +The following is the format for the URLParameters connection value:: + + scheme://username:password@host:port/virtual_host?key=value&key=value + +As you can see, by default, the scheme (amqp, amqps), username, password, host, port and virtual host make up the core of the URL and any other parameter is passed in as query string values. + +Example Connection URLS +----------------------- + +The default connection URL connects to the / virtual host as guest using the guest password on localhost port 5672. Note the forwardslash in the URL is encoded to %2F:: + + amqp://guest:guest@localhost:5672/%2F + +Connect to a host *rabbit1* as the user *www-data* using the password *rabbit_pwd* on the virtual host *web_messages*:: + + amqp://www-data:rabbit_pwd@rabbit1/web_messages + +Connecting via SSL is pretty easy too. To connect via SSL for the previous example, simply change the scheme to *amqps*. If you do not specify a port, Pika will use the default SSL port of 5671:: + + amqps://www-data:rabbit_pwd@rabbit1/web_messages + +If you're looking to tweak other parameters, such as enabling heartbeats, simply add the key/value pair as a query string value. The following builds upon the SSL connection, enabling heartbeats every 30 seconds:: + + amqps://www-data:rabbit_pwd@rabbit1/web_messages?heartbeat=30 + + +Options that are available as query string values: + +- backpressure_detection: Pass in a value of *t* to enable backpressure detection, it is disabled by default. +- channel_max: Alter the default channel maximum by passing in a 32-bit integer value here. +- connection_attempts: Alter the default of 1 connection attempt by passing in an integer value here. +- frame_max: Alter the default frame maximum size value by passing in a long integer value [#f1]_. +- heartbeat: Pass a value greater than zero to enable heartbeats between the server and your application. The integer value you pass here will be the number of seconds between heartbeats. +- locale: Set the locale of the client using underscore delimited posix Locale code in ll_CC format (en_US, pt_BR, de_DE). +- retry_delay: The number of seconds to wait before attempting to reconnect on a failed connection, if connection_attempts is > 0. +- socket_timeout: Change the default socket timeout duration from 0.25 seconds to another integer or float value. Adjust with caution. +- ssl_options: A url encoded dict of values for the SSL connection. The available keys are: + - ca_certs + - cert_reqs + - certfile + - keyfile + - ssl_version + +For an information on what the ssl_options can be set to reference the `official Python documentation `_. Here is an example of setting the client certificate and key:: + + amqp://www-data:rabbit_pwd@rabbit1/web_messages?heartbeat=30&ssl_options=%7B%27keyfile%27%3A+%27%2Fetc%2Fssl%2Fmykey.pem%27%2C+%27certfile%27%3A+%27%2Fetc%2Fssl%2Fmycert.pem%27%7D + +The following example demonstrates how to generate the ssl_options string with `Python's urllib `_:: + + import urllib + urllib.urlencode({'ssl_options': {'certfile': '/etc/ssl/mycert.pem', 'keyfile': '/etc/ssl/mykey.pem'}}) + + +.. rubric:: Footnotes + +.. [#f1] The AMQP specification states that a server can reject a request for a frame size larger than the value it passes during content negotiation. diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/docs/faq.rst b/NodeRed/NodeRedFiles/pika-0.13.1/docs/faq.rst new file mode 100644 index 000000000..f70ef5528 --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/docs/faq.rst @@ -0,0 +1,18 @@ +Frequently Asked Questions +-------------------------- + +- Is Pika thread safe? + + Pika does not have any notion of threading in the code. If you want to use Pika with threading, make sure you have a Pika connection per thread, created in that thread. It is not safe to share one Pika connection across threads, with one exception: you may call the connection method `add_callback_threadsafe` from another thread to schedule a callback within an active pika connection. + +- How do I report a bug with Pika? + + The `main Pika repository `_ is hosted on `Github `_ and we use the Issue tracker at `https://github.com/pika/pika/issues `_. + +- Is there a mailing list for Pika? + + Yes, Pika's mailing list is available `on Google Groups `_ and the email address is pika-python@googlegroups.com, though traditionally questions about Pika have been asked on the `RabbitMQ-Discuss mailing list `_. + +- How can I contribute to Pika? + + You can `fork the project on Github `_ and issue `Pull Requests `_ when you believe you have something solid to be added to the main repository. diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/docs/index.rst b/NodeRed/NodeRedFiles/pika-0.13.1/docs/index.rst new file mode 100644 index 000000000..7f7677864 --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/docs/index.rst @@ -0,0 +1,37 @@ +Introduction to Pika +==================== +Pika is a pure-Python implementation of the AMQP 0-9-1 protocol that tries to stay fairly independent of the underlying network support library. + +If you have not developed with Pika or RabbitMQ before, the :doc:`intro` documentation is a good place to get started. + +Installing Pika +--------------- +Pika is available for download via PyPI and may be installed using easy_install or pip:: + + pip install pika + +or:: + + easy_install pika + +To install from source, run "python setup.py install" in the root source directory. + +Using Pika +---------- +.. toctree:: + :glob: + :maxdepth: 1 + + intro + modules/index + examples + faq + contributors + version_history + +Indices and tables +------------------ + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/docs/intro.rst b/NodeRed/NodeRedFiles/pika-0.13.1/docs/intro.rst new file mode 100644 index 000000000..ab701879d --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/docs/intro.rst @@ -0,0 +1,125 @@ +Introduction to Pika +==================== + +IO and Event Looping +-------------------- +As AMQP is a two-way RPC protocol where the client can send requests to the server and the server can send requests to a client, Pika implements or extends IO loops in each of its asynchronous connection adapters. These IO loops are blocking methods which loop and listen for events. Each asynchronous adapter follows the same standard for invoking the IO loop. The IO loop is created when the connection adapter is created. To start an IO loop for any given adapter, call the ``connection.ioloop.start()`` method. + +If you are using an external IO loop such as Tornado's :class:`~tornado.ioloop.IOLoop` you invoke it normally and then add the Pika Tornado adapter to it. + +Example:: + + import pika + + def on_open(connection): + # Invoked when the connection is open + pass + + # Create our connection object, passing in the on_open method + connection = pika.SelectConnection(on_open_callback=on_open) + + try: + # Loop so we can communicate with RabbitMQ + connection.ioloop.start() + except KeyboardInterrupt: + # Gracefully close the connection + connection.close() + # Loop until we're fully closed, will stop on its own + connection.ioloop.start() + +.. _intro_to_cps: + +Continuation-Passing Style +-------------------------- + +Interfacing with Pika asynchronously is done by passing in callback methods you would like to have invoked when a certain event completes. For example, if you are going to declare a queue, you pass in a method that will be called when the RabbitMQ server returns a `Queue.DeclareOk `_ response. + +In our example below we use the following five easy steps: + +#. We start by creating our connection object, then starting our event loop. +#. When we are connected, the *on_connected* method is called. In that method we create a channel. +#. When the channel is created, the *on_channel_open* method is called. In that method we declare a queue. +#. When the queue is declared successfully, *on_queue_declared* is called. In that method we call :py:meth:`channel.basic_consume ` telling it to call the handle_delivery for each message RabbitMQ delivers to us. +#. When RabbitMQ has a message to send us, it calls the handle_delivery method passing the AMQP Method frame, Header frame, and Body. + +.. NOTE:: + Step #1 is on line #28 and Step #2 is on line #6. This is so that Python knows about the functions we'll call in Steps #2 through #5. + +.. _cps_example: + +Example:: + + import pika + + # Create a global channel variable to hold our channel object in + channel = None + + # Step #2 + def on_connected(connection): + """Called when we are fully connected to RabbitMQ""" + # Open a channel + connection.channel(on_channel_open) + + # Step #3 + def on_channel_open(new_channel): + """Called when our channel has opened""" + global channel + channel = new_channel + channel.queue_declare(queue="test", durable=True, exclusive=False, auto_delete=False, callback=on_queue_declared) + + # Step #4 + def on_queue_declared(frame): + """Called when RabbitMQ has told us our Queue has been declared, frame is the response from RabbitMQ""" + channel.basic_consume(handle_delivery, queue='test') + + # Step #5 + def handle_delivery(channel, method, header, body): + """Called when we receive a message from RabbitMQ""" + print(body) + + # Step #1: Connect to RabbitMQ using the default parameters + parameters = pika.ConnectionParameters() + connection = pika.SelectConnection(parameters, on_connected) + + try: + # Loop so we can communicate with RabbitMQ + connection.ioloop.start() + except KeyboardInterrupt: + # Gracefully close the connection + connection.close() + # Loop until we're fully closed, will stop on its own + connection.ioloop.start() + +Credentials +----------- +The :mod:`pika.credentials` module provides the mechanism by which you pass the username and password to the :py:class:`ConnectionParameters ` class when it is created. + +Example:: + + import pika + credentials = pika.PlainCredentials('username', 'password') + parameters = pika.ConnectionParameters(credentials=credentials) + +.. _connection_parameters: + +Connection Parameters +--------------------- +There are two types of connection parameter classes in Pika to allow you to pass the connection information into a connection adapter, :class:`ConnectionParameters ` and :class:`URLParameters `. Both classes share the same default connection values. + + +.. _intro_to_backpressure: + +TCP Backpressure +---------------- + +As of RabbitMQ 2.0, client side `Channel.Flow `_ has been removed [#f1]_. Instead, the RabbitMQ broker uses TCP Backpressure to slow your client if it is delivering messages too fast. If you pass in backpressure_detection into your connection parameters, Pika attempts to help you handle this situation by providing a mechanism by which you may be notified if Pika has noticed too many frames have yet to be delivered. By registering a callback function with the :py:meth:`add_backpressure_callback ` method of any connection adapter, your function will be called when Pika sees that a backlog of 10 times the average frame size you have been sending has been exceeded. You may tweak the notification multiplier value by calling the :py:meth:`set_backpressure_multiplier ` method passing any integer value. + +Example:: + + import pika + + parameters = pika.URLParameters('amqp://guest:guest@rabbit-server1:5672/%2F?backpressure_detection=t') + +.. rubric:: Footnotes + +.. [#f1] "more effective flow control mechanism that does not require cooperation from clients and reacts quickly to prevent the broker from exhausting memory - see http://www.rabbitmq.com/extensions.html#memsup" from http://lists.rabbitmq.com/pipermail/rabbitmq-announce/attachments/20100825/2c672695/attachment.txt diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/docs/modules/adapters/asyncio.rst b/NodeRed/NodeRedFiles/pika-0.13.1/docs/modules/adapters/asyncio.rst new file mode 100644 index 000000000..2e58db450 --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/docs/modules/adapters/asyncio.rst @@ -0,0 +1,9 @@ +asyncio Connection Adapter +========================== +.. automodule:: pika.adapters.asyncio_connection + +Be sure to check out the :doc:`asynchronous examples ` including the asyncio specific :doc:`consumer ` example. + +.. autoclass:: pika.adapters.asyncio_connection.AsyncioConnection + :members: + :inherited-members: diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/docs/modules/adapters/blocking.rst b/NodeRed/NodeRedFiles/pika-0.13.1/docs/modules/adapters/blocking.rst new file mode 100644 index 000000000..81b2eb504 --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/docs/modules/adapters/blocking.rst @@ -0,0 +1,13 @@ +BlockingConnection +------------------ +.. automodule:: pika.adapters.blocking_connection + +Be sure to check out examples in :doc:`/examples`. + +.. autoclass:: pika.adapters.blocking_connection.BlockingConnection + :members: + :inherited-members: + +.. autoclass:: pika.adapters.blocking_connection.BlockingChannel + :members: + :inherited-members: diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/docs/modules/adapters/index.rst b/NodeRed/NodeRedFiles/pika-0.13.1/docs/modules/adapters/index.rst new file mode 100644 index 000000000..7bc694da4 --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/docs/modules/adapters/index.rst @@ -0,0 +1,15 @@ +Connection Adapters +=================== +Pika uses connection adapters to provide a flexible method for adapting pika's +core communication to different IOLoop implementations. In addition to asynchronous adapters, there is the :class:`BlockingConnection ` adapter that provides a more idiomatic procedural approach to using Pika. + +Adapters +-------- +.. toctree:: + :glob: + :maxdepth: 1 + + blocking + select + tornado + twisted diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/docs/modules/adapters/select.rst b/NodeRed/NodeRedFiles/pika-0.13.1/docs/modules/adapters/select.rst new file mode 100644 index 000000000..e02b57135 --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/docs/modules/adapters/select.rst @@ -0,0 +1,7 @@ +Select Connection Adapter +========================== +.. automodule:: pika.adapters.select_connection + +.. autoclass:: pika.adapters.select_connection.SelectConnection + :members: + :inherited-members: diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/docs/modules/adapters/tornado.rst b/NodeRed/NodeRedFiles/pika-0.13.1/docs/modules/adapters/tornado.rst new file mode 100644 index 000000000..97784a5c5 --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/docs/modules/adapters/tornado.rst @@ -0,0 +1,9 @@ +Tornado Connection Adapter +========================== +.. automodule:: pika.adapters.tornado_connection + +Be sure to check out the :doc:`asynchronous examples ` including the Tornado specific :doc:`consumer ` example. + +.. autoclass:: pika.adapters.tornado_connection.TornadoConnection + :members: + :inherited-members: diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/docs/modules/adapters/twisted.rst b/NodeRed/NodeRedFiles/pika-0.13.1/docs/modules/adapters/twisted.rst new file mode 100644 index 000000000..434201ced --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/docs/modules/adapters/twisted.rst @@ -0,0 +1,15 @@ +Twisted Connection Adapter +========================== +.. automodule:: pika.adapters.twisted_connection + +.. autoclass:: pika.adapters.twisted_connection.TwistedConnection + :members: + :inherited-members: + +.. autoclass:: pika.adapters.twisted_connection.TwistedProtocolConnection + :members: + :inherited-members: + +.. autoclass:: pika.adapters.twisted_connection.TwistedChannel + :members: + :inherited-members: diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/docs/modules/channel.rst b/NodeRed/NodeRedFiles/pika-0.13.1/docs/modules/channel.rst new file mode 100644 index 000000000..eb729c564 --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/docs/modules/channel.rst @@ -0,0 +1,10 @@ +Channel +======= +.. automodule:: pika.channel + +Channel +------- +.. autoclass:: Channel + :members: + :inherited-members: + :member-order: bysource diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/docs/modules/connection.rst b/NodeRed/NodeRedFiles/pika-0.13.1/docs/modules/connection.rst new file mode 100644 index 000000000..de42f5c72 --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/docs/modules/connection.rst @@ -0,0 +1,7 @@ +Connection +---------- +The :class:`~pika.connection.Connection` class implements the base behavior +that all connection adapters extend. + +.. autoclass:: pika.connection.Connection + :members: diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/docs/modules/credentials.rst b/NodeRed/NodeRedFiles/pika-0.13.1/docs/modules/credentials.rst new file mode 100644 index 000000000..94a2de54e --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/docs/modules/credentials.rst @@ -0,0 +1,18 @@ +Authentication Credentials +========================== +.. automodule:: pika.credentials + +PlainCredentials +---------------- +.. autoclass:: PlainCredentials + :members: + :inherited-members: + :noindex: + +ExternalCredentials +------------------- +.. autoclass:: ExternalCredentials + :members: + :inherited-members: + :noindex: + diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/docs/modules/exceptions.rst b/NodeRed/NodeRedFiles/pika-0.13.1/docs/modules/exceptions.rst new file mode 100644 index 000000000..3bb3afdac --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/docs/modules/exceptions.rst @@ -0,0 +1,5 @@ +Exceptions +========== +.. automodule:: pika.exceptions + :members: + :undoc-members: diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/docs/modules/index.rst b/NodeRed/NodeRedFiles/pika-0.13.1/docs/modules/index.rst new file mode 100644 index 000000000..33f5b0c72 --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/docs/modules/index.rst @@ -0,0 +1,21 @@ +Core Class and Module Documentation +=================================== +For the end user, Pika is organized into a small set of objects for all communication with RabbitMQ. + +- A :doc:`connection adapter ` is used to connect to RabbitMQ and manages the connection. +- :doc:`Connection parameters ` are used to instruct the :class:`~pika.connection.Connection` object how to connect to RabbitMQ. +- :doc:`credentials` are used to encapsulate all authentication information for the :class:`~pika.connection.ConnectionParameters` class. +- A :class:`~pika.channel.Channel` object is used to communicate with RabbitMQ via the AMQP RPC methods. +- :doc:`exceptions` are raised at various points when using Pika when something goes wrong. + +.. toctree:: + :hidden: + :maxdepth: 1 + + adapters/index + channel + connection + credentials + exceptions + parameters + spec diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/docs/modules/parameters.rst b/NodeRed/NodeRedFiles/pika-0.13.1/docs/modules/parameters.rst new file mode 100644 index 000000000..fa05ed094 --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/docs/modules/parameters.rst @@ -0,0 +1,42 @@ +Connection Parameters +===================== +To maintain flexibility in how you specify the connection information required for your applications to properly connect to RabbitMQ, pika implements two classes for encapsulating the information, :class:`~pika.connection.ConnectionParameters` and :class:`~pika.connection.URLParameters`. + +ConnectionParameters +-------------------- +The classic object for specifying all of the connection parameters required to connect to RabbitMQ, :class:`~pika.connection.ConnectionParameters` provides attributes for tweaking every possible connection option. + +Example:: + + import pika + + # Set the connection parameters to connect to rabbit-server1 on port 5672 + # on the / virtual host using the username "guest" and password "guest" + credentials = pika.PlainCredentials('guest', 'guest') + parameters = pika.ConnectionParameters('rabbit-server1', + 5672, + '/', + credentials) + +.. autoclass:: pika.connection.ConnectionParameters + :members: + :inherited-members: + :member-order: bysource + +URLParameters +------------- +The :class:`~pika.connection.URLParameters` class allows you to pass in an AMQP URL when creating the object and supports the host, port, virtual host, ssl, username and password in the base URL and other options are passed in via query parameters. + +Example:: + + import pika + + # Set the connection parameters to connect to rabbit-server1 on port 5672 + # on the / virtual host using the username "guest" and password "guest" + parameters = pika.URLParameters('amqp://guest:guest@rabbit-server1:5672/%2F') + +.. autoclass:: pika.connection.URLParameters + :members: + :inherited-members: + :member-order: bysource + diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/docs/modules/spec.rst b/NodeRed/NodeRedFiles/pika-0.13.1/docs/modules/spec.rst new file mode 100644 index 000000000..d494300a8 --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/docs/modules/spec.rst @@ -0,0 +1,8 @@ +pika.spec +========= + +.. automodule:: pika.spec + :members: + :inherited-members: + :member-order: bysource + :undoc-members: diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/docs/version_history.rst b/NodeRed/NodeRedFiles/pika-0.13.1/docs/version_history.rst new file mode 100644 index 000000000..8a7578d77 --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/docs/version_history.rst @@ -0,0 +1,760 @@ +Version History +=============== + +0.13.1 2019-03-07 +----------------- + +`GitHub milestone `_ + +0.13.0 2019-01-17 +----------------- + +`GitHub milestone `_ + +- `AsyncioConnection`, `TornadoConnection` and `TwistedProtocolConnection` are no longer auto-imported (`PR `_) +- Python `3.7` support (`Issue `_) + +0.12.0 2018-06-19 +----------------- + +`GitHub milestone `_ + +This is an interim release prior to version `1.0.0`. It includes the following backported pull requests and commits from the `master` branch: + +- `PR #908 `_ +- `PR #910 `_ +- `PR #918 `_ +- `PR #920 `_ +- `PR #924 `_ +- `PR #937 `_ +- `PR #938 `_ +- `PR #933 `_ +- `PR #940 `_ +- `PR #932 `_ +- `PR #928 `_ +- `PR #934 `_ +- `PR #915 `_ +- `PR #946 `_ +- `PR #947 `_ +- `PR #952 `_ +- `PR #956 `_ +- `PR #966 `_ +- `PR #975 `_ +- `PR #978 `_ +- `PR #981 `_ +- `PR #994 `_ +- `PR #1007 `_ +- `PR #1045 `_ (manually backported) +- `PR #1011 `_ + +Commits: + +Travis CI fail fast - 3f0e739 + +New features: + +`BlockingConnection` now supports the `add_callback_threadsafe` method which allows a function to be executed correctly on the IO loop thread. The main use-case for this is as follows: + +- Application sets up a thread for `BlockingConnection` and calls `basic_consume` on it +- When a message is received, work is done on another thread +- When the work is done, the worker uses `connection.add_callback_threadsafe` to call the `basic_ack` method on the channel instance. + +Please see `examples/basic_consumer_threaded.py` for an example. As always, `SelectConnection` and a fully async consumer/publisher is the preferred method of using Pika. + +Heartbeats are now sent at an interval equal to 1/2 of the negotiated idle connection timeout. RabbitMQ's default timeout value is 60 seconds, so heartbeats will be sent at a 30 second interval. In addition, Pika's check for an idle connection will be done at an interval equal to the timeout value plus 5 seconds to allow for delays. This results in an interval of 65 seconds by default. + +0.11.2 2017-11-30 +----------------- + +`GitHub milestone `_ + +`0.11.2 `_ + +- Remove `+` character from platform releases string (`PR `_) + +0.11.1 2017-11-27 +----------------- + +`GitHub milestone `_ + +`0.11.1 `_ + +- Fix `BlockingConnection` to ensure event loop exits (`PR `_) +- Heartbeat timeouts will use the client value if specified (`PR `_) +- Allow setting some common TCP options (`PR `_) +- Errors when decoding Unicode are ignored (`PR `_) +- Fix large number encoding (`PR `_) + +0.11.0 2017-07-29 +----------------- + +`GitHub milestone `_ + +`0.11.0 `_ + + - Simplify Travis CI configuration for OS X. + - Add `asyncio` connection adapter for Python 3.4 and newer. + - Connection failures that occur after the socket is opened and before the + AMQP connection is ready to go are now reported by calling the connection + error callback. Previously these were not consistently reported. + - In BaseConnection.close, call _handle_ioloop_stop only if the connection is + already closed to allow the asynchronous close operation to complete + gracefully. + - Pass error information from failed socket connection to user callbacks + on_open_error_callback and on_close_callback with result_code=-1. + - ValueError is raised when a completion callback is passed to an asynchronous + (nowait) Channel operation. It's an application error to pass a non-None + completion callback with an asynchronous request, because this callback can + never be serviced in the asynchronous scenario. + - `Channel.basic_reject` fixed to allow `delivery_tag` to be of type `long` + as well as `int`. (by quantum5) + - Implemented support for blocked connection timeouts in + `pika.connection.Connection`. This feature is available to all pika adapters. + See `pika.connection.ConnectionParameters` docstring to learn more about + `blocked_connection_timeout` configuration. + - Deprecated the `heartbeat_interval` arg in `pika.ConnectionParameters` in + favor of the `heartbeat` arg for consistency with the other connection + parameters classes `pika.connection.Parameters` and `pika.URLParameters`. + - When the `port` arg is not set explicitly in `ConnectionParameters` + constructor, but the `ssl` arg is set explicitly, then set the port value to + to the default AMQP SSL port if SSL is enabled, otherwise to the default + AMQP plaintext port. + - `URLParameters` will raise ValueError if a non-empty URL scheme other than + {amqp | amqps | http | https} is specified. + - `InvalidMinimumFrameSize` and `InvalidMaximumFrameSize` exceptions are + deprecated. pika.connection.Parameters.frame_max property setter now raises + the standard `ValueError` exception when the value is out of bounds. + - Removed deprecated parameter `type` in `Channel.exchange_declare` and + `BlockingChannel.exchange_declare` in favor of the `exchange_type` arg that + doesn't overshadow the builtin `type` keyword. + - Channel.close() on OPENING channel transitions it to CLOSING instead of + raising ChannelClosed. + - Channel.close() on CLOSING channel raises `ChannelAlreadyClosing`; used to + raise `ChannelClosed`. + - Connection.channel() raises `ConnectionClosed` if connection is not in OPEN + state. + - When performing graceful close on a channel and `Channel.Close` from broker + arrives while waiting for CloseOk, don't release the channel number until + CloseOk arrives to avoid race condition that may lead to a new channel + receiving the CloseOk that was destined for the closing channel. + - The `backpressure_detection` option of `ConnectionParameters` and + `URLParameters` property is DEPRECATED in favor of `Connection.Blocked` and + `Connection.Unblocked`. See `Connection.add_on_connection_blocked_callback`. + +0.10.0 2015-09-02 +----------------- + +`0.10.0 `_ + + - a9bf96d - LibevConnection: Fixed dict chgd size during iteration (Michael Laing) + - 388c55d - SelectConnection: Fixed KeyError exceptions in IOLoop timeout executions (Shinji Suzuki) + - 4780de3 - BlockingConnection: Add support to make BlockingConnection a Context Manager (@reddec) + +0.10.0b2 2015-07-15 +------------------- + + - f72b58f - Fixed failure to purge _ConsumerCancellationEvt from BlockingChannel._pending_events during basic_cancel. (Vitaly Kruglikov) + +0.10.0b1 2015-07-10 +------------------- + +High-level summary of notable changes: + +- Change to 3-Clause BSD License +- Python 3.x support +- Over 150 commits from 19 contributors +- Refactoring of SelectConnection ioloop +- This major release contains certain non-backward-compatible API changes as + well as significant performance improvements in the `BlockingConnection` + adapter. +- Non-backward-compatible changes in `Channel.add_on_return_callback` callback's + signature. +- The `AsyncoreConnection` adapter was retired + +**Details** + +Python 3.x: this release introduces python 3.x support. Tested on Python 3.3 +and 3.4. + +`AsyncoreConnection`: Retired this legacy adapter to reduce maintenance burden; +the recommended replacement is the `SelectConnection` adapter. + +`SelectConnection`: ioloop was refactored for compatibility with other ioloops. + +`Channel.add_on_return_callback`: The callback is now passed the individual +parameters channel, method, properties, and body instead of a tuple of those +values for congruence with other similar callbacks. + +`BlockingConnection`: This adapter underwent a makeover under the hood and +gained significant performance improvements as well as enhanced timer +resolution. It is now implemented as a client of the `SelectConnection` adapter. + +Below is an overview of the `BlockingConnection` and `BlockingChannel` API +changes: + + - Recursion: the new implementation eliminates callback recursion that + sometimes blew out the stack in the legacy implementation (e.g., + publish -> consumer_callback -> publish -> consumer_callback, etc.). While + `BlockingConnection.process_data_events` and `BlockingConnection.sleep` may + still be called from the scope of the blocking adapter's callbacks in order + to process pending I/O, additional callbacks will be suppressed whenever + `BlockingConnection.process_data_events` and `BlockingConnection.sleep` are + nested in any combination; in that case, the callback information will be + bufferred and dispatched once nesting unwinds and control returns to the + level-zero dispatcher. + - `BlockingConnection.connect`: this method was removed in favor of the + constructor as the only way to establish connections; this reduces + maintenance burden, while improving reliability of the adapter. + - `BlockingConnection.process_data_events`: added the optional parameter + `time_limit`. + - `BlockingConnection.add_on_close_callback`: removed; legacy raised + `NotImplementedError`. + - `BlockingConnection.add_on_open_callback`: removed; legacy raised + `NotImplementedError`. + - `BlockingConnection.add_on_open_error_callback`: removed; legacy raised + `NotImplementedError`. + - `BlockingConnection.add_backpressure_callback`: not supported + - `BlockingConnection.set_backpressure_multiplier`: not supported + - `BlockingChannel.add_on_flow_callback`: not supported; per docstring in + channel.py: "Note that newer versions of RabbitMQ will not issue this but + instead use TCP backpressure". + - `BlockingChannel.flow`: not supported + - `BlockingChannel.force_data_events`: removed as it is no longer necessary + following redesign of the adapter. + - Removed the `nowait` parameter from `BlockingChannel` methods, forcing + `nowait=False` (former API default) in the implementation; this is more + suitable for the blocking nature of the adapter and its error-reporting + strategy; this concerns the following methods: `basic_cancel`, + `confirm_delivery`, `exchange_bind`, `exchange_declare`, `exchange_delete`, + `exchange_unbind`, `queue_bind`, `queue_declare`, `queue_delete`, and + `queue_purge`. + - `BlockingChannel.basic_cancel`: returns a sequence instead of None; for a + `no_ack=True` consumer, `basic_cancel` returns a sequence of pending + messages that arrived before broker confirmed the cancellation. + - `BlockingChannel.consume`: added new optional kwargs `arguments` and + `inactivity_timeout`. Also, raises ValueError if the consumer creation + parameters don't match those used to create the existing queue consumer + generator, if any; this happens when you break out of the consume loop, then + call `BlockingChannel.consume` again with different consumer-creation args + without first cancelling the previous queue consumer generator via + `BlockingChannel.cancel`. The legacy implementation would silently resume + consuming from the existing queue consumer generator even if the subsequent + `BlockingChannel.consume` was invoked with a different queue name, etc. + - `BlockingChannel.cancel`: returns 0; the legacy implementation tried to + return the number of requeued messages, but this number was not accurate + as it didn't include the messages returned by the Channel class; this count + is not generally useful, so returning 0 is a reasonable replacement. + - `BlockingChannel.open`: removed in favor of having a single mechanism for + creating a channel (`BlockingConnection.channel`); this reduces maintenance + burden, while improving reliability of the adapter. + - `BlockingChannel.confirm_delivery`: raises UnroutableError when unroutable + messages that were sent prior to this call are returned before we receive + Confirm.Select-ok. + - `BlockingChannel.basic_publish: always returns True when delivery + confirmation is not enabled (publisher-acks = off); the legacy implementation + returned a bool in this case if `mandatory=True` to indicate whether the + message was delivered; however, this was non-deterministic, because + Basic.Return is asynchronous and there is no way to know how long to wait + for it or its absence. The legacy implementation returned None when + publishing with publisher-acks = off and `mandatory=False`. The new + implementation always returns True when publishing while + publisher-acks = off. + - `BlockingChannel.publish`: a new alternate method (vs. `basic_publish`) for + publishing a message with more detailed error reporting via UnroutableError + and NackError exceptions. + - `BlockingChannel.start_consuming`: raises pika.exceptions.RecursionError if + called from the scope of a `BlockingConnection` or `BlockingChannel` + callback. + - `BlockingChannel.get_waiting_message_count`: new method; returns the number + of messages that may be retrieved from the current queue consumer generator + via `BasicChannel.consume` without blocking. + +**Commits** + + - 5aaa753 - Fixed SSL import and removed no_ack=True in favor of explicit AMQP message handling based on deferreds (skftn) + - 7f222c2 - Add checkignore for codeclimate (Gavin M. Roy) + - 4dec370 - Implemented BlockingChannel.flow; Implemented BlockingConnection.add_on_connection_blocked_callback; Implemented BlockingConnection.add_on_connection_unblocked_callback. (Vitaly Kruglikov) + - 4804200 - Implemented blocking adapter acceptance test for exchange-to-exchange binding. Added rudimentary validation of BasicProperties passthru in blocking adapter publish tests. Updated CHANGELOG. (Vitaly Kruglikov) + - 4ec07fd - Fixed sending of data in TwistedProtocolConnection (Vitaly Kruglikov) + - a747fb3 - Remove my copyright from forward_server.py test utility. (Vitaly Kruglikov) + - 94246d2 - Return True from basic_publish when pubacks is off. Implemented more blocking adapter accceptance tests. (Vitaly Kruglikov) + - 3ce013d - PIKA-609 Wait for broker to dispatch all messages to client before cancelling consumer in TestBasicCancelWithNonAckableConsumer and TestBasicCancelWithAckableConsumer (Vitaly Kruglikov) + - 293f778 - Created CHANGELOG entry for release 0.10.0. Fixed up callback documentation for basic_get, basic_consume, and add_on_return_callback. (Vitaly Kruglikov) + - 16d360a - Removed the legacy AsyncoreConnection adapter in favor of the recommended SelectConnection adapter. (Vitaly Kruglikov) + - 240a82c - Defer creation of poller's event loop interrupt socket pair until start is called, because some SelectConnection users (e.g., BlockingConnection adapter) don't use the event loop, and these sockets would just get reported as resource leaks. (Vitaly Kruglikov) + - aed5cae - Added EINTR loops in select_connection pollers. Addressed some pylint findings, including an error or two. Wrap socket.send and socket.recv calls in EINTR loops Use the correct exception for socket.error and select.error and get errno depending on python version. (Vitaly Kruglikov) + - 498f1be - Allow passing exchange, queue and routing_key as text, handle short strings as text in python3 (saarni) + - 9f7f243 - Restored basic_consume, basic_cancel, and add_on_cancel_callback (Vitaly Kruglikov) + - 18c9909 - Reintroduced BlockingConnection.process_data_events. (Vitaly Kruglikov) + - 4b25cb6 - Fixed BlockingConnection/BlockingChannel acceptance and unit tests (Vitaly Kruglikov) + - bfa932f - Facilitate proper connection state after BasicConnection._adapter_disconnect (Vitaly Kruglikov) + - 9a09268 - Fixed BlockingConnection test that was failing with ConnectionClosed error. (Vitaly Kruglikov) + - 5a36934 - Copied synchronous_connection.py from pika-synchronous branch Fixed pylint findings Integrated SynchronousConnection with the new ioloop in SelectConnection Defined dedicated message classes PolledMessage and ConsumerMessage and moved from BlockingChannel to module-global scope. Got rid of nowait args from BlockingChannel public API methods Signal unroutable messages via UnroutableError exception. Signal Nack'ed messages via NackError exception. These expose more information about the failure than legacy basic_publich API. Removed set_timeout and backpressure callback methods Restored legacy `is_open`, etc. property names (Vitaly Kruglikov) + - 6226dc0 - Remove deprecated --use-mirrors (Gavin M. Roy) + - 1a7112f - Raise ConnectionClosed when sending a frame with no connection (#439) (Gavin M. Roy) + - 9040a14 - Make delivery_tag non-optional (#498) (Gavin M. Roy) + - 86aabc2 - Bump version (Gavin M. Roy) + - 562075a - Update a few testing things (Gavin M. Roy) + - 4954d38 - use unicode_type in blocking_connection.py (Antti Haapala) + - 133d6bc - Let Travis install ordereddict for Python 2.6, and ttest 3.3, 3.4 too. (Antti Haapala) + - 0d2287d - Pika Python 3 support (Antti Haapala) + - 3125c79 - SSLWantRead is not supported before python 2.7.9 and 3.3 (Will) + - 9a9c46c - Fixed TestDisconnectDuringConnectionStart: it turns out that depending on callback order, it might get either ProbableAuthenticationError or ProbableAccessDeniedError. (Vitaly Kruglikov) + - cd8c9b0 - A fix the write starvation problem that we see with tornado and pika (Will) + - 8654fbc - SelectConnection - make interrupt socketpair non-blocking (Will) + - 4f3666d - Added copyright in forward_server.py and fixed NameError bug (Vitaly Kruglikov) + - f8ebbbc - ignore docs (Gavin M. Roy) + - a344f78 - Updated codeclimate config (Gavin M. Roy) + - 373c970 - Try and fix pathing issues in codeclimate (Gavin M. Roy) + - 228340d - Ignore codegen (Gavin M. Roy) + - 4db0740 - Add a codeclimate config (Gavin M. Roy) + - 7e989f9 - Slight code re-org, usage comment and better naming of test file. (Will) + - 287be36 - Set up _kqueue member of KQueuePoller before calling super constructor to avoid exception due to missing _kqueue member. Call `self._map_event(event)` instead of `self._map_event(event.filter)`, because `KQueuePoller._map_event()` assumes it's getting an event, not an event filter. (Vitaly Kruglikov) + - 62810fb - Fix issue #412: reset BlockingConnection._read_poller in BlockingConnection._adapter_disconnect() to guard against accidental access to old file descriptor. (Vitaly Kruglikov) + - 03400ce - Rationalise adapter acceptance tests (Will) + - 9414153 - Fix bug selecting non epoll poller (Will) + - 4f063df - Use user heartbeat setting if server proposes none (Pau Gargallo) + - 9d04d6e - Deactivate heartbeats when heartbeat_interval is 0 (Pau Gargallo) + - a52a608 - Bug fix and review comments. (Will) + - e3ebb6f - Fix incorrect x-expires argument in acceptance tests (Will) + - 294904e - Get BlockingConnection into consistent state upon loss of TCP/IP connection with broker and implement acceptance tests for those cases. (Vitaly Kruglikov) + - 7f91a68 - Make SelectConnection behave like an ioloop (Will) + - dc9db2b - Perhaps 5 seconds is too agressive for travis (Gavin M. Roy) + - c23e532 - Lower the stuck test timeout (Gavin M. Roy) + - 1053ebc - Late night bug (Gavin M. Roy) + - cd6c1bf - More BaseConnection._handle_error cleanup (Gavin M. Roy) + - a0ff21c - Fix the test to work with Python 2.6 (Gavin M. Roy) + - 748e8aa - Remove pypy for now (Gavin M. Roy) + - 1c921c1 - Socket close/shutdown cleanup (Gavin M. Roy) + - 5289125 - Formatting update from PR (Gavin M. Roy) + - d235989 - Be more specific when calling getaddrinfo (Gavin M. Roy) + - b5d1b31 - Reflect the method name change in pika.callback (Gavin M. Roy) + - df7d3b7 - Cleanup BlockingConnection in a few places (Gavin M. Roy) + - cd99e1c - Rename method due to use in BlockingConnection (Gavin M. Roy) + - 7e0d1b3 - Use google style with yapf instead of pep8 (Gavin M. Roy) + - 7dc9bab - Refactor socket writing to not use sendall #481 (Gavin M. Roy) + - 4838789 - Dont log the fd #521 (Gavin M. Roy) + - 765107d - Add Connection.Blocked callback registration methods #476 (Gavin M. Roy) + - c15b5c1 - Fix _blocking typo pointed out in #513 (Gavin M. Roy) + - 759ac2c - yapf of codegen (Gavin M. Roy) + - 9dadd77 - yapf cleanup of codegen and spec (Gavin M. Roy) + - ddba7ce - Do not reject consumers with no_ack=True #486 #530 (Gavin M. Roy) + - 4528a1a - yapf reformatting of tests (Gavin M. Roy) + - e7b6d73 - Remove catching AttributError (#531) (Gavin M. Roy) + - 41ea5ea - Update README badges [skip ci] (Gavin M. Roy) + - 6af987b - Add note on contributing (Gavin M. Roy) + - 161fc0d - yapf formatting cleanup (Gavin M. Roy) + - edcb619 - Add PYPY to travis testing (Gavin M. Roy) + - 2225771 - Change the coverage badge (Gavin M. Roy) + - 8f7d451 - Move to codecov from coveralls (Gavin M. Roy) + - b80407e - Add confirm_delivery to example (Andrew Smith) + - 6637212 - Update base_connection.py (bstemshorn) + - 1583537 - #544 get_waiting_message_count() (markcf) + - 0c9be99 - Fix #535: pass expected reply_code and reply_text from method frame to Connection._on_disconnect from Connection._on_connection_closed (Vitaly Kruglikov) + - d11e73f - Propagate ConnectionClosed exception out of BlockingChannel._send_method() and log ConnectionClosed in BlockingConnection._on_connection_closed() (Vitaly Kruglikov) + - 63d2951 - Fix #541 - make sure connection state is properly reset when BlockingConnection._check_state_on_disconnect raises ConnectionClosed. This supplements the previously-merged PR #450 by getting the connection into consistent state. (Vitaly Kruglikov) + - 71bc0eb - Remove unused self.fd attribute from BaseConnection (Vitaly Kruglikov) + - 8c08f93 - PIKA-532 Removed unnecessary params (Vitaly Kruglikov) + - 6052ecf - PIKA-532 Fix bug in BlockingConnection._handle_timeout that was preventing _on_connection_closed from being called when not closing. (Vitaly Kruglikov) + - 562aa15 - pika: callback: Display exception message when callback fails. (Stuart Longland) + - 452995c - Typo fix in connection.py (Andrew) + - 361c0ad - Added some missing yields (Robert Weidlich) + - 0ab5a60 - Added complete example for python twisted service (Robert Weidlich) + - 4429110 - Add deployment and webhooks (Gavin M. Roy) + - 7e50302 - Fix has_content style in codegen (Andrew Grigorev) + - 28c2214 - Fix the trove categorization (Gavin M. Roy) + - de8b545 - Ensure frames can not be interspersed on send (Gavin M. Roy) + - 8fe6bdd - Fix heartbeat behaviour after connection failure. (Kyösti Herrala) + - c123472 - Updating BlockingChannel.basic_get doc (it does not receive a callback like the rest of the adapters) (Roberto Decurnex) + - b5f52fb - Fix number of arguments passed to _on_return callback (Axel Eirola) + - 765139e - Lower default TIMEOUT to 0.01 (bra-fsn) + - 6cc22a5 - Fix confirmation on reconnects (bra-fsn) + - f4faf0a - asynchronous publisher and subscriber examples refactored to follow the StepDown rule (Riccardo Cirimelli) + +0.9.14 - 2014-07-11 +------------------- + +`0.9.14 `_ + + - 57fe43e - fix test to generate a correct range of random ints (ml) + - 0d68dee - fix async watcher for libev_connection (ml) + - 01710ad - Use default username and password if not specified in URLParameters (Sean Dwyer) + - fae328e - documentation typo (Jeff Fein-Worton) + - afbc9e0 - libev_connection: reset_io_watcher (ml) + - 24332a2 - Fix the manifest (Gavin M. Roy) + - acdfdef - Remove useless test (Gavin M. Roy) + - 7918e1a - Skip libev tests if pyev is not installed or if they are being run in pypy (Gavin M. Roy) + - bb583bf - Remove the deprecated test (Gavin M. Roy) + - aecf3f2 - Don't reject a message if the channel is not open (Gavin M. Roy) + - e37f336 - Remove UTF-8 decoding in spec (Gavin M. Roy) + - ddc35a9 - Update the unittest to reflect removal of force binary (Gavin M. Roy) + - fea2476 - PEP8 cleanup (Gavin M. Roy) + - 9b97956 - Remove force_binary (Gavin M. Roy) + - a42dd90 - Whitespace required (Gavin M. Roy) + - 85867ea - Update the content_frame_dispatcher tests to reflect removal of auto-cast utf-8 (Gavin M. Roy) + - 5a4bd5d - Remove unicode casting (Gavin M. Roy) + - efea53d - Remove force binary and unicode casting (Gavin M. Roy) + - e918d15 - Add methods to remove deprecation warnings from asyncore (Gavin M. Roy) + - 117f62d - Add a coveragerc to ignore the auto generated pika.spec (Gavin M. Roy) + - 52f4485 - Remove pypy tests from travis for now (Gavin M. Roy) + - c3aa958 - Update README.rst (Gavin M. Roy) + - 3e2319f - Delete README.md (Gavin M. Roy) + - c12b0f1 - Move to RST (Gavin M. Roy) + - 704f5be - Badging updates (Gavin M. Roy) + - 7ae33ca - Update for coverage info (Gavin M. Roy) + - ae7ca86 - add libev_adapter_tests.py; modify .travis.yml to install libev and pyev (ml) + - f86aba5 - libev_connection: add **kwargs to _handle_event; suppress default_ioloop reuse warning (ml) + - 603f1cf - async_test_base: add necessary args to _on_cconn_closed (ml) + - 3422007 - add libev_adapter_tests.py (ml) + - 6cbab0c - removed relative imports and importing urlparse from urllib.parse for py3+ (a-tal) + - f808464 - libev_connection: add async watcher; add optional parameters to add_timeout (ml) + - c041c80 - Remove ev all together for now (Gavin M. Roy) + - 9408388 - Update the test descriptions and timeout (Gavin M. Roy) + - 1b552e0 - Increase timeout (Gavin M. Roy) + - 69a1f46 - Remove the pyev requirement for 2.6 testing (Gavin M. Roy) + - fe062d2 - Update package name (Gavin M. Roy) + - 611ad0e - Distribute the LICENSE and README.md (#350) (Gavin M. Roy) + - df5e1d8 - Ensure that the entire frame is written using socket.sendall (#349) (Gavin M. Roy) + - 69ec8cf - Move the libev install to before_install (Gavin M. Roy) + - a75f693 - Update test structure (Gavin M. Roy) + - 636b424 - Update things to ignore (Gavin M. Roy) + - b538c68 - Add tox, nose.cfg, update testing config (Gavin M. Roy) + - a0e7063 - add some tests to increase coverage of pika.connection (Charles Law) + - c76d9eb - Address issue #459 (Gavin M. Roy) + - 86ad2db - Raise exception if positional arg for parameters isn't an instance of Parameters (Gavin M. Roy) + - 14d08e1 - Fix for python 2.6 (Gavin M. Roy) + - bd388a3 - Use the first unused channel number addressing #404, #460 (Gavin M. Roy) + - e7676e6 - removing a debug that was left in last commit (James Mutton) + - 6c93b38 - Fixing connection-closed behavior to detect on attempt to publish (James Mutton) + - c3f0356 - Initialize bytes_written in _handle_write() (Jonathan Kirsch) + - 4510e95 - Fix _handle_write() may not send full frame (Jonathan Kirsch) + - 12b793f - fixed Tornado Consumer example to successfully reconnect (Yang Yang) + - f074444 - remove forgotten import of ordereddict (Pedro Abranches) + - 1ba0aea - fix last merge (Pedro Abranches) + - 10490a6 - change timeouts structure to list to maintain scheduling order (Pedro Abranches) + - 7958394 - save timeouts in ordered dict instead of dict (Pedro Abranches) + - d2746bf - URLParameters and ConnectionParameters accept unicode strings (Allard Hoeve) + - 596d145 - previous fix for AttributeError made parent and child class methods identical, remove duplication (James Mutton) + - 42940dd - UrlParameters Docs: fixed amqps scheme examples (Riccardo Cirimelli) + - 43904ff - Dont test this in PyPy due to sort order issue (Gavin M. Roy) + - d7d293e - Don't leave __repr__ sorting up to chance (Gavin M. Roy) + - 848c594 - Add integration test to travis and fix invocation (Gavin M. Roy) + - 2678275 - Add pypy to travis tests (Gavin M. Roy) + - 1877f3d - Also addresses issue #419 (Gavin M. Roy) + - 470c245 - Address issue #419 (Gavin M. Roy) + - ca3cb59 - Address issue #432 (Gavin M. Roy) + - a3ff6f2 - Default frame max should be AMQP FRAME_MAX (Gavin M. Roy) + - ff3d5cb - Remove max consumer tag test due to change in code. (Gavin M. Roy) + - 6045dda - Catch KeyError (#437) to ensure that an exception is not raised in a race condition (Gavin M. Roy) + - 0b4d53a - Address issue #441 (Gavin M. Roy) + - 180e7c4 - Update license and related files (Gavin M. Roy) + - 256ed3d - Added Jython support. (Erik Olof Gunnar Andersson) + - f73c141 - experimental work around for recursion issue. (Erik Olof Gunnar Andersson) + - a623f69 - Prevent #436 by iterating the keys and not the dict (Gavin M. Roy) + - 755fcae - Add support for authentication_failure_close, connection.blocked (Gavin M. Roy) + - c121243 - merge upstream master (Michael Laing) + - a08dc0d - add arg to channel.basic_consume (Pedro Abranches) + - 10b136d - Documentation fix (Anton Ryzhov) + - 9313307 - Fixed minor markup errors. (Jorge Puente Sarrín) + - fb3e3cf - Fix the spelling of UnsupportedAMQPFieldException (Garrett Cooper) + - 03d5da3 - connection.py: Propagate the force_channel keyword parameter to methods involved in channel creation (Michael Laing) + - 7bbcff5 - Documentation fix for basic_publish (JuhaS) + - 01dcea7 - Expose no_ack and exclusive to BlockingChannel.consume (Jeff Tang) + - d39b6aa - Fix BlockingChannel.basic_consume does not block on non-empty queues (Juhyeong Park) + - 6e1d295 - fix for issue 391 and issue 307 (Qi Fan) + - d9ffce9 - Update parameters.rst (cacovsky) + - 6afa41e - Add additional badges (Gavin M. Roy) + - a255925 - Fix return value on dns resolution issue (Laurent Eschenauer) + - 3f7466c - libev_connection: tweak docs (Michael Laing) + - 0aaed93 - libev_connection: Fix varable naming (Michael Laing) + - 0562d08 - libev_connection: Fix globals warning (Michael Laing) + - 22ada59 - libev_connection: use globals to track sigint and sigterm watchers as they are created globally within libev (Michael Laing) + - 2649b31 - Move badge [skip ci] (Gavin M. Roy) + - f70eea1 - Remove pypy and installation attempt of pyev (Gavin M. Roy) + - f32e522 - Conditionally skip external connection adapters if lib is not installed (Gavin M. Roy) + - cce97c5 - Only install pyev on python 2.7 (Gavin M. Roy) + - ff84462 - Add travis ci support (Gavin M. Roy) + - cf971da - lib_evconnection: improve signal handling; add callback (Michael Laing) + - 9adb269 - bugfix in returning a list in Py3k (Alex Chandel) + - c41d5b9 - update exception syntax for Py3k (Alex Chandel) + - c8506f1 - fix _adapter_connect (Michael Laing) + - 67cb660 - Add LibevConnection to README (Michael Laing) + - 1f9e72b - Propagate low-level connection errors to the AMQPConnectionError. (Bjorn Sandberg) + - e1da447 - Avoid race condition in _on_getok on successive basic_get() when clearing out callbacks (Jeff) + - 7a09979 - Add support for upcoming Connection.Blocked/Unblocked (Gavin M. Roy) + - 53cce88 - TwistedChannel correctly handles multi-argument deferreds. (eivanov) + - 66f8ace - Use uuid when creating unique consumer tag (Perttu Ranta-aho) + - 4ee2738 - Limit the growth of Channel._cancelled, use deque instead of list. (Perttu Ranta-aho) + - 0369aed - fix adapter references and tweak docs (Michael Laing) + - 1738c23 - retry select.select() on EINTR (Cenk Alti) + - 1e55357 - libev_connection: reset internal state on reconnect (Michael Laing) + - 708559e - libev adapter (Michael Laing) + - a6b7c8b - Prioritize EPollPoller and KQueuePoller over PollPoller and SelectPoller (Anton Ryzhov) + - 53400d3 - Handle socket errors in PollPoller and EPollPoller Correctly check 'select.poll' availability (Anton Ryzhov) + - a6dc969 - Use dict.keys & items instead of iterkeys & iteritems (Alex Chandel) + - 5c1b0d0 - Use print function syntax, in examples (Alex Chandel) + - ac9f87a - Fixed a typo in the name of the Asyncore Connection adapter (Guruprasad) + - dfbba50 - Fixed bug mentioned in Issue #357 (Erik Andersson) + - c906a2d - Drop additional flags when getting info for the hostnames, log errors (#352) (Gavin M. Roy) + - baf23dd - retry poll() on EINTR (Cenk Alti) + - 7cd8762 - Address ticket #352 catching an error when socket.getprotobyname fails (Gavin M. Roy) + - 6c3ec75 - Prep for 0.9.14 (Gavin M. Roy) + - dae7a99 - Bump to 0.9.14p0 (Gavin M. Roy) + - 620edc7 - Use default port and virtual host if omitted in URLParameters (Issue #342) (Gavin M. Roy) + - 42a8787 - Move the exception handling inside the while loop (Gavin M. Roy) + - 10e0264 - Fix connection back pressure detection issue #347 (Gavin M. Roy) + - 0bfd670 - Fixed mistake in commit 3a19d65. (Erik Andersson) + - da04bc0 - Fixed Unknown state on disconnect error message generated when closing connections. (Erik Andersson) + - 3a19d65 - Alternative solution to fix #345. (Erik Andersson) + - abf9fa8 - switch to sendall to send entire frame (Dustin Koupal) + - 9ce8ce4 - Fixed the async publisher example to work with reconnections (Raphaël De Giusti) + - 511028a - Fix typo in TwistedChannel docstring (cacovsky) + - 8b69e5a - calls self._adapter_disconnect() instead of self.disconnect() which doesn't actually exist #294 (Mark Unsworth) + - 06a5cf8 - add NullHandler to prevent logging warnings (Cenk Alti) + - f404a9a - Fix #337 cannot start ioloop after stop (Ralf Nyren) + +0.9.13 - 2013-05-15 +------------------- + +`0.9.13 `_ + +**Major Changes** + +- IPv6 Support with thanks to Alessandro Tagliapietra for initial prototype +- Officially remove support for <= Python 2.5 even though it was broken already +- Drop pika.simplebuffer.SimpleBuffer in favor of the Python stdlib collections.deque object +- New default object for receiving content is a "bytes" object which is a str wrapper in Python 2, but paves way for Python 3 support +- New "Raw" mode for frame decoding content frames (#334) addresses issues #331, #229 added by Garth Williamson +- Connection and Disconnection logic refactored, allowing for cleaner separation of protocol logic and socket handling logic as well as connection state management +- New "on_open_error_callback" argument in creating connection objects and new Connection.add_on_open_error_callback method +- New Connection.connect method to cleanly allow for reconnection code +- Support for all AMQP field types, using protocol specified signed/unsigned unpacking + +**Backwards Incompatible Changes** + +- Method signature for creating connection objects has new argument "on_open_error_callback" which is positionally before "on_close_callback" +- Internal callback variable names in connection.Connection have been renamed and constants used. If you relied on any of these callbacks outside of their internal use, make sure to check out the new constants. +- Connection._connect method, which was an internal only method is now deprecated and will raise a DeprecationWarning. If you relied on this method, your code needs to change. +- pika.simplebuffer has been removed + +**Bugfixes** + +- BlockingConnection consumer generator does not free buffer when exited (#328) +- Unicode body payloads in the blocking adapter raises exception (#333) +- Support "b" short-short-int AMQP data type (#318) +- Docstring type fix in adapters/select_connection (#316) fix by Rikard Hultén +- IPv6 not supported (#309) +- Stop the HeartbeatChecker when connection is closed (#307) +- Unittest fix for SelectConnection (#336) fix by Erik Andersson +- Handle condition where no connection or socket exists but SelectConnection needs a timeout for retrying a connection (#322) +- TwistedAdapter lagging behind BaseConnection changes (#321) fix by Jan Urbański + +**Other** + +- Refactored documentation +- Added Twisted Adapter example (#314) by nolinksoft + +0.9.12 - 2013-03-18 +------------------- + +`0.9.12 `_ + +**Bugfixes** + +- New timeout id hashing was not unique + +0.9.11 - 2013-03-17 +------------------- + +`0.9.11 `_ + +**Bugfixes** + +- Address inconsistent channel close callback documentation and add the signature + change to the TwistedChannel class (#305) +- Address a missed timeout related internal data structure name change + introduced in the SelectConnection 0.9.10 release. Update all connection + adapters to use same signature and docstring (#306). + +0.9.10 - 2013-03-16 +------------------- + +`0.9.10 `_ + +**Bugfixes** + +- Fix timeout in twisted adapter (Submitted by cellscape) +- Fix blocking_connection poll timer resolution to milliseconds (Submitted by cellscape) +- Fix channel._on_close() without a method frame (Submitted by Richard Boulton) +- Addressed exception on close (Issue #279 - fix by patcpsc) +- 'messages' not initialized in BlockingConnection.cancel() (Issue #289 - fix by Mik Kocikowski) +- Make queue_unbind behave like queue_bind (Issue #277) +- Address closing behavioral issues for connections and channels (Issue #275) +- Pass a Method frame to Channel._on_close in Connection._on_disconnect (Submitted by Jan Urbański) +- Fix channel closed callback signature in the Twisted adapter (Submitted by Jan Urbański) +- Don't stop the IOLoop on connection close for in the Twisted adapter (Submitted by Jan Urbański) +- Update the asynchronous examples to fix reconnecting and have it work +- Warn if the socket was closed such as if RabbitMQ dies without a Close frame +- Fix URLParameters ssl_options (Issue #296) +- Add state to BlockingConnection addressing (Issue #301) +- Encode unicode body content prior to publishing (Issue #282) +- Fix an issue with unicode keys in BasicProperties headers key (Issue #280) +- Change how timeout ids are generated (Issue #254) +- Address post close state issues in Channel (Issue #302) + +** Behavior changes ** + +- Change core connection communication behavior to prefer outbound writes over reads, addressing a recursion issue +- Update connection on close callbacks, changing callback method signature +- Update channel on close callbacks, changing callback method signature +- Give more info in the ChannelClosed exception +- Change the constructor signature for BlockingConnection, block open/close callbacks +- Disable the use of add_on_open_callback/add_on_close_callback methods in BlockingConnection + + +0.9.9 - 2013-01-29 +------------------ + +`0.9.9 `_ + +**Bugfixes** + +- Only remove the tornado_connection.TornadoConnection file descriptor from the IOLoop if it's still open (Issue #221) +- Allow messages with no body (Issue #227) +- Allow for empty routing keys (Issue #224) +- Don't raise an exception when trying to send a frame to a closed connection (Issue #229) +- Only send a Connection.CloseOk if the connection is still open. (Issue #236 - Fix by noleaf) +- Fix timeout threshold in blocking connection - (Issue #232 - Fix by Adam Flynn) +- Fix closing connection while a channel is still open (Issue #230 - Fix by Adam Flynn) +- Fixed misleading warning and exception messages in BaseConnection (Issue #237 - Fix by Tristan Penman) +- Pluralised and altered the wording of the AMQPConnectionError exception (Issue #237 - Fix by Tristan Penman) +- Fixed _adapter_disconnect in TornadoConnection class (Issue #237 - Fix by Tristan Penman) +- Fixing hang when closing connection without any channel in BlockingConnection (Issue #244 - Fix by Ales Teska) +- Remove the process_timeouts() call in SelectConnection (Issue #239) +- Change the string validation to basestring for host connection parameters (Issue #231) +- Add a poller to the BlockingConnection to address latency issues introduced in Pika 0.9.8 (Issue #242) +- reply_code and reply_text is not set in ChannelException (Issue #250) +- Add the missing constraint parameter for Channel._on_return callback processing (Issue #257 - Fix by patcpsc) +- Channel callbacks not being removed from callback manager when channel is closed or deleted (Issue #261) + +0.9.8 - 2012-11-18 +------------------ + +`0.9.8 `_ + +**Bugfixes** + +- Channel.queue_declare/BlockingChannel.queue_declare not setting up callbacks property for empty queue name (Issue #218) +- Channel.queue_bind/BlockingChannel.queue_bind not allowing empty routing key +- Connection._on_connection_closed calling wrong method in Channel (Issue #219) +- Fix tx_commit and tx_rollback bugs in BlockingChannel (Issue #217) + +0.9.7 - 2012-11-11 +------------------ + +`0.9.7 `_ + +**New features** + +- generator based consumer in BlockingChannel (See :doc:`examples/blocking_consumer_generator` for example) + +**Changes** + +- BlockingChannel._send_method will only wait if explicitly told to + +**Bugfixes** + +- Added the exchange "type" parameter back but issue a DeprecationWarning +- Dont require a queue name in Channel.queue_declare() +- Fixed KeyError when processing timeouts (Issue # 215 - Fix by Raphael De Giusti) +- Don't try and close channels when the connection is closed (Issue #216 - Fix by Charles Law) +- Dont raise UnexpectedFrame exceptions, log them instead +- Handle multiple synchronous RPC calls made without waiting for the call result (Issues #192, #204, #211) +- Typo in docs (Issue #207 Fix by Luca Wehrstedt) +- Only sleep on connection failure when retry attempts are > 0 (Issue #200) +- Bypass _rpc method and just send frames for Basic.Ack, Basic.Nack, Basic.Reject (Issue #205) + +0.9.6 - 2012-10-29 +------------------ + +`0.9.6 `_ + +**New features** + +- URLParameters +- BlockingChannel.start_consuming() and BlockingChannel.stop_consuming() +- Delivery Confirmations +- Improved unittests + +**Major bugfix areas** + +- Connection handling +- Blocking functionality in the BlockingConnection +- SSL +- UTF-8 Handling + +**Removals** + +- pika.reconnection_strategies +- pika.channel.ChannelTransport +- pika.log +- pika.template +- examples directory + +0.9.5 - 2011-03-29 +------------------ + +`0.9.5 `_ + +**Changelog** + +- Scope changes with adapter IOLoops and CallbackManager allowing for cleaner, multi-threaded operation +- Add support for Confirm.Select with channel.Channel.confirm_delivery() +- Add examples of delivery confirmation to examples (demo_send_confirmed.py) +- Update uses of log.warn with warning.warn for TCP Back-pressure alerting +- License boilerplate updated to simplify license text in source files +- Increment the timeout in select_connection.SelectPoller reducing CPU utilization +- Bug fix in Heartbeat frame delivery addressing issue #35 +- Remove abuse of pika.log.method_call through a majority of the code +- Rename of key modules: table to data, frames to frame +- Cleanup of frame module and related classes +- Restructure of tests and test runner +- Update functional tests to respect RABBITMQ_HOST, RABBITMQ_PORT environment variables +- Bug fixes to reconnection_strategies module +- Fix the scale of timeout for PollPoller to be specified in milliseconds +- Remove mutable default arguments in RPC calls +- Add data type validation to RPC calls +- Move optional credentials erasing out of connection.Connection into credentials module +- Add support to allow for additional external credential types +- Add a NullHandler to prevent the 'No handlers could be found for logger "pika"' error message when not using pika.log in a client app at all. +- Clean up all examples to make them easier to read and use +- Move documentation into its own repository https://github.com/pika/documentation + +- channel.py + + - Move channel.MAX_CHANNELS constant from connection.CHANNEL_MAX + - Add default value of None to ChannelTransport.rpc + - Validate callback and acceptable replies parameters in ChannelTransport.RPC + - Remove unused connection attribute from Channel + +- connection.py + + - Remove unused import of struct + - Remove direct import of pika.credentials.PlainCredentials + - Change to import pika.credentials + - Move CHANNEL_MAX to channel.MAX_CHANNELS + - Change ConnectionParameters initialization parameter heartbeat to boolean + - Validate all inbound parameter types in ConnectionParameters + - Remove the Connection._erase_credentials stub method in favor of letting the Credentials object deal with that itself. + - Warn if the credentials object intends on erasing the credentials and a reconnection strategy other than NullReconnectionStrategy is specified. + - Change the default types for callback and acceptable_replies in Connection._rpc + - Validate the callback and acceptable_replies data types in Connection._rpc + +- adapters.blocking_connection.BlockingConnection + + - Addition of _adapter_disconnect to blocking_connection.BlockingConnection + - Add timeout methods to BlockingConnection addressing issue #41 + - BlockingConnection didn't allow you register more than one consumer callback because basic_consume was overridden to block immediately. New behavior allows you to do so. + - Removed overriding of base basic_consume and basic_cancel methods. Now uses underlying Channel versions of those methods. + - Added start_consuming() method to BlockingChannel to start the consumption loop. + - Updated stop_consuming() to iterate through all the registered consumers in self._consumers and issue a basic_cancel. diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/examples/asynchronous_consumer_example.py b/NodeRed/NodeRedFiles/pika-0.13.1/examples/asynchronous_consumer_example.py new file mode 100644 index 000000000..58662e32e --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/examples/asynchronous_consumer_example.py @@ -0,0 +1,350 @@ +# -*- coding: utf-8 -*- + +import logging +import pika + +LOG_FORMAT = ('%(levelname) -10s %(asctime)s %(name) -30s %(funcName) ' + '-35s %(lineno) -5d: %(message)s') +LOGGER = logging.getLogger(__name__) + + +class ExampleConsumer(object): + """This is an example consumer that will handle unexpected interactions + with RabbitMQ such as channel and connection closures. + + If RabbitMQ closes the connection, it will reopen it. You should + look at the output, as there are limited reasons why the connection may + be closed, which usually are tied to permission related issues or + socket timeouts. + + If the channel is closed, it will indicate a problem with one of the + commands that were issued and that should surface in the output as well. + + """ + EXCHANGE = 'message' + EXCHANGE_TYPE = 'topic' + QUEUE = 'text' + ROUTING_KEY = 'example.text' + + def __init__(self, amqp_url): + """Create a new instance of the consumer class, passing in the AMQP + URL used to connect to RabbitMQ. + + :param str amqp_url: The AMQP url to connect with + + """ + self._connection = None + self._channel = None + self._closing = False + self._consumer_tag = None + self._url = amqp_url + + def connect(self): + """This method connects to RabbitMQ, returning the connection handle. + When the connection is established, the on_connection_open method + will be invoked by pika. + + :rtype: pika.SelectConnection + + """ + LOGGER.info('Connecting to %s', self._url) + return pika.SelectConnection(pika.URLParameters(self._url), + self.on_connection_open, + stop_ioloop_on_close=False) + + def on_connection_open(self, unused_connection): + """This method is called by pika once the connection to RabbitMQ has + been established. It passes the handle to the connection object in + case we need it, but in this case, we'll just mark it unused. + + :type unused_connection: pika.SelectConnection + + """ + LOGGER.info('Connection opened') + self.add_on_connection_close_callback() + self.open_channel() + + def add_on_connection_close_callback(self): + """This method adds an on close callback that will be invoked by pika + when RabbitMQ closes the connection to the publisher unexpectedly. + + """ + LOGGER.info('Adding connection close callback') + self._connection.add_on_close_callback(self.on_connection_closed) + + def on_connection_closed(self, connection, reply_code, reply_text): + """This method is invoked by pika when the connection to RabbitMQ is + closed unexpectedly. Since it is unexpected, we will reconnect to + RabbitMQ if it disconnects. + + :param pika.connection.Connection connection: The closed connection obj + :param int reply_code: The server provided reply_code if given + :param str reply_text: The server provided reply_text if given + + """ + self._channel = None + if self._closing: + self._connection.ioloop.stop() + else: + LOGGER.warning('Connection closed, reopening in 5 seconds: (%s) %s', + reply_code, reply_text) + self._connection.add_timeout(5, self.reconnect) + + def reconnect(self): + """Will be invoked by the IOLoop timer if the connection is + closed. See the on_connection_closed method. + + """ + # This is the old connection IOLoop instance, stop its ioloop + self._connection.ioloop.stop() + + if not self._closing: + + # Create a new connection + self._connection = self.connect() + + # There is now a new connection, needs a new ioloop to run + self._connection.ioloop.start() + + def open_channel(self): + """Open a new channel with RabbitMQ by issuing the Channel.Open RPC + command. When RabbitMQ responds that the channel is open, the + on_channel_open callback will be invoked by pika. + + """ + LOGGER.info('Creating a new channel') + self._connection.channel(on_open_callback=self.on_channel_open) + + def on_channel_open(self, channel): + """This method is invoked by pika when the channel has been opened. + The channel object is passed in so we can make use of it. + + Since the channel is now open, we'll declare the exchange to use. + + :param pika.channel.Channel channel: The channel object + + """ + LOGGER.info('Channel opened') + self._channel = channel + self.add_on_channel_close_callback() + self.setup_exchange(self.EXCHANGE) + + def add_on_channel_close_callback(self): + """This method tells pika to call the on_channel_closed method if + RabbitMQ unexpectedly closes the channel. + + """ + LOGGER.info('Adding channel close callback') + self._channel.add_on_close_callback(self.on_channel_closed) + + def on_channel_closed(self, channel, reply_code, reply_text): + """Invoked by pika when RabbitMQ unexpectedly closes the channel. + Channels are usually closed if you attempt to do something that + violates the protocol, such as re-declare an exchange or queue with + different parameters. In this case, we'll close the connection + to shutdown the object. + + :param pika.channel.Channel: The closed channel + :param int reply_code: The numeric reason the channel was closed + :param str reply_text: The text reason the channel was closed + + """ + LOGGER.warning('Channel %i was closed: (%s) %s', + channel, reply_code, reply_text) + self._connection.close() + + def setup_exchange(self, exchange_name): + """Setup the exchange on RabbitMQ by invoking the Exchange.Declare RPC + command. When it is complete, the on_exchange_declareok method will + be invoked by pika. + + :param str|unicode exchange_name: The name of the exchange to declare + + """ + LOGGER.info('Declaring exchange %s', exchange_name) + self._channel.exchange_declare(self.on_exchange_declareok, + exchange_name, + self.EXCHANGE_TYPE) + + def on_exchange_declareok(self, unused_frame): + """Invoked by pika when RabbitMQ has finished the Exchange.Declare RPC + command. + + :param pika.Frame.Method unused_frame: Exchange.DeclareOk response frame + + """ + LOGGER.info('Exchange declared') + self.setup_queue(self.QUEUE) + + def setup_queue(self, queue_name): + """Setup the queue on RabbitMQ by invoking the Queue.Declare RPC + command. When it is complete, the on_queue_declareok method will + be invoked by pika. + + :param str|unicode queue_name: The name of the queue to declare. + + """ + LOGGER.info('Declaring queue %s', queue_name) + self._channel.queue_declare(self.on_queue_declareok, queue_name) + + def on_queue_declareok(self, method_frame): + """Method invoked by pika when the Queue.Declare RPC call made in + setup_queue has completed. In this method we will bind the queue + and exchange together with the routing key by issuing the Queue.Bind + RPC command. When this command is complete, the on_bindok method will + be invoked by pika. + + :param pika.frame.Method method_frame: The Queue.DeclareOk frame + + """ + LOGGER.info('Binding %s to %s with %s', + self.EXCHANGE, self.QUEUE, self.ROUTING_KEY) + self._channel.queue_bind(self.on_bindok, self.QUEUE, + self.EXCHANGE, self.ROUTING_KEY) + + def on_bindok(self, unused_frame): + """Invoked by pika when the Queue.Bind method has completed. At this + point we will start consuming messages by calling start_consuming + which will invoke the needed RPC commands to start the process. + + :param pika.frame.Method unused_frame: The Queue.BindOk response frame + + """ + LOGGER.info('Queue bound') + self.start_consuming() + + def start_consuming(self): + """This method sets up the consumer by first calling + add_on_cancel_callback so that the object is notified if RabbitMQ + cancels the consumer. It then issues the Basic.Consume RPC command + which returns the consumer tag that is used to uniquely identify the + consumer with RabbitMQ. We keep the value to use it when we want to + cancel consuming. The on_message method is passed in as a callback pika + will invoke when a message is fully received. + + """ + LOGGER.info('Issuing consumer related RPC commands') + self.add_on_cancel_callback() + self._consumer_tag = self._channel.basic_consume(self.on_message, + self.QUEUE) + + def add_on_cancel_callback(self): + """Add a callback that will be invoked if RabbitMQ cancels the consumer + for some reason. If RabbitMQ does cancel the consumer, + on_consumer_cancelled will be invoked by pika. + + """ + LOGGER.info('Adding consumer cancellation callback') + self._channel.add_on_cancel_callback(self.on_consumer_cancelled) + + def on_consumer_cancelled(self, method_frame): + """Invoked by pika when RabbitMQ sends a Basic.Cancel for a consumer + receiving messages. + + :param pika.frame.Method method_frame: The Basic.Cancel frame + + """ + LOGGER.info('Consumer was cancelled remotely, shutting down: %r', + method_frame) + if self._channel: + self._channel.close() + + def on_message(self, unused_channel, basic_deliver, properties, body): + """Invoked by pika when a message is delivered from RabbitMQ. The + channel is passed for your convenience. The basic_deliver object that + is passed in carries the exchange, routing key, delivery tag and + a redelivered flag for the message. The properties passed in is an + instance of BasicProperties with the message properties and the body + is the message that was sent. + + :param pika.channel.Channel unused_channel: The channel object + :param pika.Spec.Basic.Deliver: basic_deliver method + :param pika.Spec.BasicProperties: properties + :param str|unicode body: The message body + + """ + LOGGER.info('Received message # %s from %s: %s', + basic_deliver.delivery_tag, properties.app_id, body) + self.acknowledge_message(basic_deliver.delivery_tag) + + def acknowledge_message(self, delivery_tag): + """Acknowledge the message delivery from RabbitMQ by sending a + Basic.Ack RPC method for the delivery tag. + + :param int delivery_tag: The delivery tag from the Basic.Deliver frame + + """ + LOGGER.info('Acknowledging message %s', delivery_tag) + self._channel.basic_ack(delivery_tag) + + def stop_consuming(self): + """Tell RabbitMQ that you would like to stop consuming by sending the + Basic.Cancel RPC command. + + """ + if self._channel: + LOGGER.info('Sending a Basic.Cancel RPC command to RabbitMQ') + self._channel.basic_cancel(self.on_cancelok, self._consumer_tag) + + def on_cancelok(self, unused_frame): + """This method is invoked by pika when RabbitMQ acknowledges the + cancellation of a consumer. At this point we will close the channel. + This will invoke the on_channel_closed method once the channel has been + closed, which will in-turn close the connection. + + :param pika.frame.Method unused_frame: The Basic.CancelOk frame + + """ + LOGGER.info('RabbitMQ acknowledged the cancellation of the consumer') + self.close_channel() + + def close_channel(self): + """Call to close the channel with RabbitMQ cleanly by issuing the + Channel.Close RPC command. + + """ + LOGGER.info('Closing the channel') + self._channel.close() + + def run(self): + """Run the example consumer by connecting to RabbitMQ and then + starting the IOLoop to block and allow the SelectConnection to operate. + + """ + self._connection = self.connect() + self._connection.ioloop.start() + + def stop(self): + """Cleanly shutdown the connection to RabbitMQ by stopping the consumer + with RabbitMQ. When RabbitMQ confirms the cancellation, on_cancelok + will be invoked by pika, which will then closing the channel and + connection. The IOLoop is started again because this method is invoked + when CTRL-C is pressed raising a KeyboardInterrupt exception. This + exception stops the IOLoop which needs to be running for pika to + communicate with RabbitMQ. All of the commands issued prior to starting + the IOLoop will be buffered but not processed. + + """ + LOGGER.info('Stopping') + self._closing = True + self.stop_consuming() + self._connection.ioloop.start() + LOGGER.info('Stopped') + + def close_connection(self): + """This method closes the connection to RabbitMQ.""" + LOGGER.info('Closing connection') + self._connection.close() + + +def main(): + logging.basicConfig(level=logging.INFO, format=LOG_FORMAT) + example = ExampleConsumer('amqp://guest:guest@localhost:5672/%2F') + try: + example.run() + except KeyboardInterrupt: + example.stop() + + +if __name__ == '__main__': + main() diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/examples/asynchronous_publisher_example.py b/NodeRed/NodeRedFiles/pika-0.13.1/examples/asynchronous_publisher_example.py new file mode 100644 index 000000000..5ffbc89c3 --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/examples/asynchronous_publisher_example.py @@ -0,0 +1,353 @@ +# -*- coding: utf-8 -*- + +import logging +import pika +import json + +LOG_FORMAT = ('%(levelname) -10s %(asctime)s %(name) -30s %(funcName) ' + '-35s %(lineno) -5d: %(message)s') +LOGGER = logging.getLogger(__name__) + + +class ExamplePublisher(object): + """This is an example publisher that will handle unexpected interactions + with RabbitMQ such as channel and connection closures. + + If RabbitMQ closes the connection, it will reopen it. You should + look at the output, as there are limited reasons why the connection may + be closed, which usually are tied to permission related issues or + socket timeouts. + + It uses delivery confirmations and illustrates one way to keep track of + messages that have been sent and if they've been confirmed by RabbitMQ. + + """ + EXCHANGE = 'message' + EXCHANGE_TYPE = 'topic' + PUBLISH_INTERVAL = 1 + QUEUE = 'text' + ROUTING_KEY = 'example.text' + + def __init__(self, amqp_url): + """Setup the example publisher object, passing in the URL we will use + to connect to RabbitMQ. + + :param str amqp_url: The URL for connecting to RabbitMQ + + """ + self._connection = None + self._channel = None + + self._deliveries = None + self._acked = None + self._nacked = None + self._message_number = None + + self._stopping = False + self._url = amqp_url + + def connect(self): + """This method connects to RabbitMQ, returning the connection handle. + When the connection is established, the on_connection_open method + will be invoked by pika. If you want the reconnection to work, make + sure you set stop_ioloop_on_close to False, which is not the default + behavior of this adapter. + + :rtype: pika.SelectConnection + + """ + LOGGER.info('Connecting to %s', self._url) + return pika.SelectConnection(pika.URLParameters(self._url), + on_open_callback=self.on_connection_open, + on_close_callback=self.on_connection_closed, + stop_ioloop_on_close=False) + + def on_connection_open(self, unused_connection): + """This method is called by pika once the connection to RabbitMQ has + been established. It passes the handle to the connection object in + case we need it, but in this case, we'll just mark it unused. + + :type unused_connection: pika.SelectConnection + + """ + LOGGER.info('Connection opened') + self.open_channel() + + def on_connection_closed(self, connection, reply_code, reply_text): + """This method is invoked by pika when the connection to RabbitMQ is + closed unexpectedly. Since it is unexpected, we will reconnect to + RabbitMQ if it disconnects. + + :param pika.connection.Connection connection: The closed connection obj + :param int reply_code: The server provided reply_code if given + :param str reply_text: The server provided reply_text if given + + """ + self._channel = None + if self._stopping: + self._connection.ioloop.stop() + else: + LOGGER.warning('Connection closed, reopening in 5 seconds: (%s) %s', + reply_code, reply_text) + self._connection.add_timeout(5, self._connection.ioloop.stop) + + def open_channel(self): + """This method will open a new channel with RabbitMQ by issuing the + Channel.Open RPC command. When RabbitMQ confirms the channel is open + by sending the Channel.OpenOK RPC reply, the on_channel_open method + will be invoked. + + """ + LOGGER.info('Creating a new channel') + self._connection.channel(on_open_callback=self.on_channel_open) + + def on_channel_open(self, channel): + """This method is invoked by pika when the channel has been opened. + The channel object is passed in so we can make use of it. + + Since the channel is now open, we'll declare the exchange to use. + + :param pika.channel.Channel channel: The channel object + + """ + LOGGER.info('Channel opened') + self._channel = channel + self.add_on_channel_close_callback() + self.setup_exchange(self.EXCHANGE) + + def add_on_channel_close_callback(self): + """This method tells pika to call the on_channel_closed method if + RabbitMQ unexpectedly closes the channel. + + """ + LOGGER.info('Adding channel close callback') + self._channel.add_on_close_callback(self.on_channel_closed) + + def on_channel_closed(self, channel, reply_code, reply_text): + """Invoked by pika when RabbitMQ unexpectedly closes the channel. + Channels are usually closed if you attempt to do something that + violates the protocol, such as re-declare an exchange or queue with + different parameters. In this case, we'll close the connection + to shutdown the object. + + :param pika.channel.Channel channel: The closed channel + :param int reply_code: The numeric reason the channel was closed + :param str reply_text: The text reason the channel was closed + + """ + LOGGER.warning('Channel was closed: (%s) %s', reply_code, reply_text) + self._channel = None + if not self._stopping: + self._connection.close() + + def setup_exchange(self, exchange_name): + """Setup the exchange on RabbitMQ by invoking the Exchange.Declare RPC + command. When it is complete, the on_exchange_declareok method will + be invoked by pika. + + :param str|unicode exchange_name: The name of the exchange to declare + + """ + LOGGER.info('Declaring exchange %s', exchange_name) + self._channel.exchange_declare(self.on_exchange_declareok, + exchange_name, + self.EXCHANGE_TYPE) + + def on_exchange_declareok(self, unused_frame): + """Invoked by pika when RabbitMQ has finished the Exchange.Declare RPC + command. + + :param pika.Frame.Method unused_frame: Exchange.DeclareOk response frame + + """ + LOGGER.info('Exchange declared') + self.setup_queue(self.QUEUE) + + def setup_queue(self, queue_name): + """Setup the queue on RabbitMQ by invoking the Queue.Declare RPC + command. When it is complete, the on_queue_declareok method will + be invoked by pika. + + :param str|unicode queue_name: The name of the queue to declare. + + """ + LOGGER.info('Declaring queue %s', queue_name) + self._channel.queue_declare(self.on_queue_declareok, queue_name) + + def on_queue_declareok(self, method_frame): + """Method invoked by pika when the Queue.Declare RPC call made in + setup_queue has completed. In this method we will bind the queue + and exchange together with the routing key by issuing the Queue.Bind + RPC command. When this command is complete, the on_bindok method will + be invoked by pika. + + :param pika.frame.Method method_frame: The Queue.DeclareOk frame + + """ + LOGGER.info('Binding %s to %s with %s', + self.EXCHANGE, self.QUEUE, self.ROUTING_KEY) + self._channel.queue_bind(self.on_bindok, self.QUEUE, + self.EXCHANGE, self.ROUTING_KEY) + + def on_bindok(self, unused_frame): + """This method is invoked by pika when it receives the Queue.BindOk + response from RabbitMQ. Since we know we're now setup and bound, it's + time to start publishing.""" + LOGGER.info('Queue bound') + self.start_publishing() + + def start_publishing(self): + """This method will enable delivery confirmations and schedule the + first message to be sent to RabbitMQ + + """ + LOGGER.info('Issuing consumer related RPC commands') + self.enable_delivery_confirmations() + self.schedule_next_message() + + def enable_delivery_confirmations(self): + """Send the Confirm.Select RPC method to RabbitMQ to enable delivery + confirmations on the channel. The only way to turn this off is to close + the channel and create a new one. + + When the message is confirmed from RabbitMQ, the + on_delivery_confirmation method will be invoked passing in a Basic.Ack + or Basic.Nack method from RabbitMQ that will indicate which messages it + is confirming or rejecting. + + """ + LOGGER.info('Issuing Confirm.Select RPC command') + self._channel.confirm_delivery(self.on_delivery_confirmation) + + def on_delivery_confirmation(self, method_frame): + """Invoked by pika when RabbitMQ responds to a Basic.Publish RPC + command, passing in either a Basic.Ack or Basic.Nack frame with + the delivery tag of the message that was published. The delivery tag + is an integer counter indicating the message number that was sent + on the channel via Basic.Publish. Here we're just doing house keeping + to keep track of stats and remove message numbers that we expect + a delivery confirmation of from the list used to keep track of messages + that are pending confirmation. + + :param pika.frame.Method method_frame: Basic.Ack or Basic.Nack frame + + """ + confirmation_type = method_frame.method.NAME.split('.')[1].lower() + LOGGER.info('Received %s for delivery tag: %i', + confirmation_type, + method_frame.method.delivery_tag) + if confirmation_type == 'ack': + self._acked += 1 + elif confirmation_type == 'nack': + self._nacked += 1 + self._deliveries.remove(method_frame.method.delivery_tag) + LOGGER.info('Published %i messages, %i have yet to be confirmed, ' + '%i were acked and %i were nacked', + self._message_number, len(self._deliveries), + self._acked, self._nacked) + + def schedule_next_message(self): + """If we are not closing our connection to RabbitMQ, schedule another + message to be delivered in PUBLISH_INTERVAL seconds. + + """ + LOGGER.info('Scheduling next message for %0.1f seconds', + self.PUBLISH_INTERVAL) + self._connection.add_timeout(self.PUBLISH_INTERVAL, + self.publish_message) + + def publish_message(self): + """If the class is not stopping, publish a message to RabbitMQ, + appending a list of deliveries with the message number that was sent. + This list will be used to check for delivery confirmations in the + on_delivery_confirmations method. + + Once the message has been sent, schedule another message to be sent. + The main reason I put scheduling in was just so you can get a good idea + of how the process is flowing by slowing down and speeding up the + delivery intervals by changing the PUBLISH_INTERVAL constant in the + class. + + """ + if self._channel is None or not self._channel.is_open: + return + + hdrs = {u'مفتاح': u' قيمة', + u'键': u'值', + u'キー': u'値'} + properties = pika.BasicProperties(app_id='example-publisher', + content_type='application/json', + headers=hdrs) + + message = u'مفتاح قيمة 键 值 キー 値' + self._channel.basic_publish(self.EXCHANGE, self.ROUTING_KEY, + json.dumps(message, ensure_ascii=False), + properties) + self._message_number += 1 + self._deliveries.append(self._message_number) + LOGGER.info('Published message # %i', self._message_number) + self.schedule_next_message() + + def run(self): + """Run the example code by connecting and then starting the IOLoop. + + """ + while not self._stopping: + self._connection = None + self._deliveries = [] + self._acked = 0 + self._nacked = 0 + self._message_number = 0 + + try: + self._connection = self.connect() + self._connection.ioloop.start() + except KeyboardInterrupt: + self.stop() + if (self._connection is not None and + not self._connection.is_closed): + # Finish closing + self._connection.ioloop.start() + + LOGGER.info('Stopped') + + def stop(self): + """Stop the example by closing the channel and connection. We + set a flag here so that we stop scheduling new messages to be + published. The IOLoop is started because this method is + invoked by the Try/Catch below when KeyboardInterrupt is caught. + Starting the IOLoop again will allow the publisher to cleanly + disconnect from RabbitMQ. + + """ + LOGGER.info('Stopping') + self._stopping = True + self.close_channel() + self.close_connection() + + def close_channel(self): + """Invoke this command to close the channel with RabbitMQ by sending + the Channel.Close RPC command. + + """ + if self._channel is not None: + LOGGER.info('Closing the channel') + self._channel.close() + + def close_connection(self): + """This method closes the connection to RabbitMQ.""" + if self._connection is not None: + LOGGER.info('Closing connection') + self._connection.close() + + +def main(): + logging.basicConfig(level=logging.DEBUG, format=LOG_FORMAT) + + # Connect to localhost:5672 as guest with the password guest and virtual host "/" (%2F) + example = ExamplePublisher('amqp://guest:guest@localhost:5672/%2F?connection_attempts=3&heartbeat_interval=3600') + example.run() + + +if __name__ == '__main__': + main() diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/examples/basic_consumer_threaded.py b/NodeRed/NodeRedFiles/pika-0.13.1/examples/basic_consumer_threaded.py new file mode 100644 index 000000000..ba521c171 --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/examples/basic_consumer_threaded.py @@ -0,0 +1,68 @@ +import functools +import logging +import pika +import threading +import time + +LOG_FORMAT = ('%(levelname) -10s %(asctime)s %(name) -30s %(funcName) ' + '-35s %(lineno) -5d: %(message)s') +LOGGER = logging.getLogger(__name__) + +logging.basicConfig(level=logging.DEBUG, format=LOG_FORMAT) + +def ack_message(channel, delivery_tag): + """Note that `channel` must be the same pika channel instance via which + the message being ACKed was retrieved (AMQP protocol constraint). + """ + if channel.is_open: + channel.basic_ack(delivery_tag) + else: + # Channel is already closed, so we can't ACK this message; + # log and/or do something that makes sense for your app in this case. + pass + +def do_work(connection, channel, delivery_tag, body): + thread_id = threading.get_ident() + fmt1 = 'Thread id: {} Delivery tag: {} Message body: {}' + LOGGER.info(fmt1.format(thread_id, delivery_tag, body)) + # Sleeping to simulate 10 seconds of work + time.sleep(10) + cb = functools.partial(ack_message, channel, delivery_tag) + connection.add_callback_threadsafe(cb) + +def on_message(channel, method_frame, header_frame, body, args): + (connection, threads) = args + delivery_tag = method_frame.delivery_tag + t = threading.Thread(target=do_work, args=(connection, channel, delivery_tag, body)) + t.start() + threads.append(t) + +credentials = pika.PlainCredentials('guest', 'guest') +# Note: sending a short heartbeat to prove that heartbeats are still +# sent even though the worker simulates long-running work +parameters = pika.ConnectionParameters('localhost', credentials=credentials, heartbeat=5) +connection = pika.BlockingConnection(parameters) + +channel = connection.channel() +channel.exchange_declare(exchange="test_exchange", exchange_type="direct", passive=False, durable=True, auto_delete=False) +channel.queue_declare(queue="standard", auto_delete=True) +channel.queue_bind(queue="standard", exchange="test_exchange", routing_key="standard_key") +# Note: prefetch is set to 1 here as an example only and to keep the number of threads created +# to a reasonable amount. In production you will want to test with different prefetch values +# to find which one provides the best performance and usability for your solution +channel.basic_qos(prefetch_count=1) + +threads = [] +on_message_callback = functools.partial(on_message, args=(connection, threads)) +channel.basic_consume(on_message_callback, 'standard') + +try: + channel.start_consuming() +except KeyboardInterrupt: + channel.stop_consuming() + +# Wait for all to complete +for thread in threads: + thread.join() + +connection.close() diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/examples/confirmation.py b/NodeRed/NodeRedFiles/pika-0.13.1/examples/confirmation.py new file mode 100644 index 000000000..231147044 --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/examples/confirmation.py @@ -0,0 +1,47 @@ +import pika +from pika import spec +import logging + +ITERATIONS = 100 + +logging.basicConfig(level=logging.INFO) + +confirmed = 0 +errors = 0 +published = 0 + +def on_open(connection): + connection.channel(on_channel_open) + + +def on_channel_open(channel): + global published + channel.confirm_delivery(on_delivery_confirmation) + for iteration in xrange(0, ITERATIONS): + channel.basic_publish('test', 'test.confirm', + 'message body value', + pika.BasicProperties(content_type='text/plain', + delivery_mode=1)) + published += 1 + +def on_delivery_confirmation(frame): + global confirmed, errors + if isinstance(frame.method, spec.Basic.Ack): + confirmed += 1 + logging.info('Received confirmation: %r', frame.method) + else: + logging.error('Received negative confirmation: %r', frame.method) + errors += 1 + if (confirmed + errors) == ITERATIONS: + logging.info('All confirmations received, published %i, confirmed %i with %i errors', published, confirmed, errors) + connection.close() + +parameters = pika.URLParameters('amqp://guest:guest@localhost:5672/%2F?connection_attempts=50') +connection = pika.SelectConnection(parameters=parameters, + on_open_callback=on_open) + +try: + connection.ioloop.start() +except KeyboardInterrupt: + connection.close() + connection.ioloop.start() diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/examples/consume.py b/NodeRed/NodeRedFiles/pika-0.13.1/examples/consume.py new file mode 100644 index 000000000..26e4620f6 --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/examples/consume.py @@ -0,0 +1,44 @@ +"""Basic message consumer example""" +import functools +import logging +import pika + +LOG_FORMAT = ('%(levelname) -10s %(asctime)s %(name) -30s %(funcName) ' + '-35s %(lineno) -5d: %(message)s') +LOGGER = logging.getLogger(__name__) + +logging.basicConfig(level=logging.DEBUG, format=LOG_FORMAT) + +def on_message(chan, method_frame, _header_frame, body, userdata=None): + """Called when a message is received. Log message and ack it.""" + LOGGER.info('Userdata: %s Message body: %s', userdata, body) + chan.basic_ack(delivery_tag=method_frame.delivery_tag) + +def main(): + """Main method.""" + credentials = pika.PlainCredentials('guest', 'guest') + parameters = pika.ConnectionParameters('localhost', credentials=credentials) + connection = pika.BlockingConnection(parameters) + + channel = connection.channel() + channel.exchange_declare(exchange="test_exchange", + exchange_type="direct", + passive=False, + durable=True, + auto_delete=False) + channel.queue_declare(queue="standard", auto_delete=True) + channel.queue_bind(queue="standard", exchange="test_exchange", routing_key="standard_key") + channel.basic_qos(prefetch_count=1) + + on_message_callback = functools.partial(on_message, userdata='on_message_userdata') + channel.basic_consume(on_message_callback, 'standard') + + try: + channel.start_consuming() + except KeyboardInterrupt: + channel.stop_consuming() + + connection.close() + +if __name__ == '__main__': + main() diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/examples/consumer_queued.py b/NodeRed/NodeRedFiles/pika-0.13.1/examples/consumer_queued.py new file mode 100644 index 000000000..f0d527f8a --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/examples/consumer_queued.py @@ -0,0 +1,66 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +import pika +import json +import threading + + +buffer = [] +lock = threading.Lock() + +print('pika version: %s' % pika.__version__) + + +connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost')) + +main_channel = connection.channel() +consumer_channel = connection.channel() +bind_channel = connection.channel() + +if pika.__version__=='0.9.5': + main_channel.exchange_declare(exchange='com.micex.sten', type='direct') + main_channel.exchange_declare(exchange='com.micex.lasttrades', type='direct') +else: + main_channel.exchange_declare(exchange='com.micex.sten', exchange_type='direct') + main_channel.exchange_declare(exchange='com.micex.lasttrades', exchange_type='direct') + +queue = main_channel.queue_declare(exclusive=True).method.queue +queue_tickers = main_channel.queue_declare(exclusive=True).method.queue + +main_channel.queue_bind(exchange='com.micex.sten', queue=queue, routing_key='order.stop.create') + + + +def process_buffer(): + if not lock.acquire(False): + print('locked!') + return + try: + while len(buffer): + body = buffer.pop(0) + + ticker = None + if 'ticker' in body['data']['params']['condition']: ticker = body['data']['params']['condition']['ticker'] + if not ticker: continue + + print('got ticker %s, gonna bind it...' % ticker) + bind_channel.queue_bind(exchange='com.micex.lasttrades', queue=queue_tickers, routing_key=str(ticker)) + print('ticker %s binded ok' % ticker) + finally: + lock.release() + + +def callback(ch, method, properties, body): + body = json.loads(body)['order.stop.create'] + buffer.append(body) + process_buffer() + + +consumer_channel.basic_consume(callback, + queue=queue, no_ack=True) + +try: + consumer_channel.start_consuming() +finally: + connection.close() diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/examples/consumer_simple.py b/NodeRed/NodeRedFiles/pika-0.13.1/examples/consumer_simple.py new file mode 100644 index 000000000..6866f7675 --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/examples/consumer_simple.py @@ -0,0 +1,57 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +import pika +import json + + +print('pika version: %s' % pika.__version__) + + +connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost')) + +main_channel = connection.channel() +consumer_channel = connection.channel() +bind_channel = connection.channel() + +if pika.__version__=='0.9.5': + main_channel.exchange_declare(exchange='com.micex.sten', type='direct') + main_channel.exchange_declare(exchange='com.micex.lasttrades', type='direct') +else: + main_channel.exchange_declare(exchange='com.micex.sten', exchange_type='direct') + main_channel.exchange_declare(exchange='com.micex.lasttrades', exchange_type='direct') + +queue = main_channel.queue_declare(exclusive=True).method.queue +queue_tickers = main_channel.queue_declare(exclusive=True).method.queue + +main_channel.queue_bind(exchange='com.micex.sten', queue=queue, routing_key='order.stop.create') + + +def hello(): + print('Hello world') + +connection.add_timeout(5, hello) + + +def callback(ch, method, properties, body): + body = json.loads(body)['order.stop.create'] + + ticker = None + if 'ticker' in body['data']['params']['condition']: ticker = body['data']['params']['condition']['ticker'] + if not ticker: return + + print('got ticker %s, gonna bind it...' % ticker) + bind_channel.queue_bind(exchange='com.micex.lasttrades', queue=queue_tickers, routing_key=str(ticker)) + print('ticker %s binded ok' % ticker) + + +import logging +logging.basicConfig(level=logging.INFO) + +consumer_channel.basic_consume(callback, + queue=queue, no_ack=True) + +try: + consumer_channel.start_consuming() +finally: + connection.close() diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/examples/direct_reply_to.py b/NodeRed/NodeRedFiles/pika-0.13.1/examples/direct_reply_to.py new file mode 100644 index 000000000..43173dc1d --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/examples/direct_reply_to.py @@ -0,0 +1,80 @@ +# -*- coding: utf-8 -*- + +""" +This example demonstrates RabbitMQ's "Direct reply-to" usage via +`pika.BlockingConnection`. See https://www.rabbitmq.com/direct-reply-to.html +for more info about this feature. +""" + +import pika + + +SERVER_QUEUE = 'rpc.server.queue' + + +def main(): + """ Here, Client sends "Marco" to RPC Server, and RPC Server replies with + "Polo". + + NOTE Normally, the server would be running separately from the client, but + in this very simple example both are running in the same thread and sharing + connection and channel. + + """ + with pika.BlockingConnection() as conn: + channel = conn.channel() + + # Set up server + + channel.queue_declare(queue=SERVER_QUEUE, + exclusive=True, + auto_delete=True) + channel.basic_consume(on_server_rx_rpc_request, queue=SERVER_QUEUE) + + + # Set up client + + # NOTE Client must create its consumer and publish RPC requests on the + # same channel to enable the RabbitMQ broker to make the necessary + # associations. + # + # Also, client must create the consumer *before* starting to publish the + # RPC requests. + # + # Client must create its consumer with no_ack=True, because the reply-to + # queue isn't real. + + channel.basic_consume(on_client_rx_reply_from_server, + queue='amq.rabbitmq.reply-to', + no_ack=True) + channel.basic_publish( + exchange='', + routing_key=SERVER_QUEUE, + body='Marco', + properties=pika.BasicProperties(reply_to='amq.rabbitmq.reply-to')) + + channel.start_consuming() + + +def on_server_rx_rpc_request(ch, method_frame, properties, body): + print 'RPC Server got request:', body + + ch.basic_publish('', routing_key=properties.reply_to, body='Polo') + + ch.basic_ack(delivery_tag=method_frame.delivery_tag) + + print 'RPC Server says good bye' + + +def on_client_rx_reply_from_server(ch, method_frame, properties, body): + print 'RPC Client got reply:', body + + # NOTE A real client might want to make additional RPC requests, but in this + # simple example we're closing the channel after getting our first reply + # to force control to return from channel.start_consuming() + print 'RPC Client says bye' + ch.close() + + +if __name__ == '__main__': + main() diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/examples/heartbeat_and_blocked_timeouts.py b/NodeRed/NodeRedFiles/pika-0.13.1/examples/heartbeat_and_blocked_timeouts.py new file mode 100644 index 000000000..3fe9a9956 --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/examples/heartbeat_and_blocked_timeouts.py @@ -0,0 +1,48 @@ +""" +This example demonstrates explicit setting of heartbeat and blocked connection +timeouts. + +Starting with RabbitMQ 3.5.5, the broker's default hearbeat timeout decreased +from 580 seconds to 60 seconds. As a result, applications that perform lengthy +processing in the same thread that also runs their Pika connection may +experience unexpected dropped connections due to heartbeat timeout. Here, we +specify an explicit lower bound for heartbeat timeout. + +When RabbitMQ broker is running out of certain resources, such as memory and +disk space, it may block connections that are performing resource-consuming +operations, such as publishing messages. Once a connection is blocked, RabbiMQ +stops reading from that connection's socket, so no commands from the client will +get through to te broker on that connection until the broker unblocks it. A +blocked connection may last for an indefinite period of time, stalling the +connection and possibly resulting in a hang (e.g., in BlockingConnection) until +the connection is unblocked. Blocked Connectin Timeout is intended to interrupt +(i.e., drop) a connection that has been blocked longer than the given timeout +value. +""" + + +import pika + + +def main(): + + # NOTE: These paramerers work with all Pika connection types + params = pika.ConnectionParameters(heartbeat_interval=600, + blocked_connection_timeout=300) + + conn = pika.BlockingConnection(params) + + chan = conn.channel() + + chan.basic_publish('', 'my-alphabet-queue', "abc") + + # If publish causes the connection to become blocked, then this conn.close() + # would hang until the connection is unblocked, if ever. However, the + # blocked_connection_timeout connection parameter would interrupt the wait, + # resulting in ConnectionClosed exception from BlockingConnection (or the + # on_connection_closed callback call in an asynchronous adapter) + conn.close() + + +if __name__ == '__main__': + main() diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/examples/producer.py b/NodeRed/NodeRedFiles/pika-0.13.1/examples/producer.py new file mode 100644 index 000000000..11bc7e87b --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/examples/producer.py @@ -0,0 +1,42 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +import pika +import json +import random + +print('pika version: %s' % pika.__version__) + +connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost')) +main_channel = connection.channel() + +if pika.__version__=='0.9.5': + main_channel.exchange_declare(exchange='com.micex.sten', type='direct') + main_channel.exchange_declare(exchange='com.micex.lasttrades', type='direct') +else: + main_channel.exchange_declare(exchange='com.micex.sten', exchange_type='direct') + main_channel.exchange_declare(exchange='com.micex.lasttrades', exchange_type='direct') + +tickers = {'MXSE.EQBR.LKOH': (1933, 1940), + 'MXSE.EQBR.MSNG': (1.35, 1.45), + 'MXSE.EQBR.SBER': (90, 92), + 'MXSE.EQNE.GAZP': (156, 162), + 'MXSE.EQNE.PLZL': (1025, 1040), + 'MXSE.EQNL.VTBR': (0.05, 0.06)} + + +def getticker(): return list(tickers.keys())[random.randrange(0,len(tickers)-1)] + +_COUNT_ = 10 + +for i in range(0,_COUNT_): + ticker = getticker() + msg = {'order.stop.create':{'data':{'params':{'condition':{'ticker':ticker}}}}} + main_channel.basic_publish(exchange='com.micex.sten', + routing_key='order.stop.create', + body=json.dumps(msg), + properties=pika.BasicProperties(content_type='application/json') + ) + print('send ticker %s' % ticker) + +connection.close() diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/examples/publish.py b/NodeRed/NodeRedFiles/pika-0.13.1/examples/publish.py new file mode 100644 index 000000000..d31ad9068 --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/examples/publish.py @@ -0,0 +1,32 @@ +import pika +import logging + +logging.basicConfig(level=logging.DEBUG) + +credentials = pika.PlainCredentials('guest', 'guest') +parameters = pika.ConnectionParameters('localhost', credentials=credentials) +connection = pika.BlockingConnection(parameters) +channel = connection.channel() +channel.exchange_declare(exchange="test_exchange", exchange_type="direct", + passive=False, durable=True, auto_delete=False) + +print("Sending message to create a queue") +channel.basic_publish('test_exchange', 'standard_key', 'queue:group', + pika.BasicProperties(content_type='text/plain', + delivery_mode=1)) + +connection.sleep(5) + +print("Sending text message to group") +channel.basic_publish('test_exchange', 'group_key', 'Message to group_key', + pika.BasicProperties(content_type='text/plain', + delivery_mode=1)) + +connection.sleep(5) + +print("Sending text message") +channel.basic_publish('test_exchange', 'standard_key', 'Message to standard_key', + pika.BasicProperties(content_type='text/plain', + delivery_mode=1)) + +connection.close() diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/examples/send.py b/NodeRed/NodeRedFiles/pika-0.13.1/examples/send.py new file mode 100644 index 000000000..57098f8f9 --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/examples/send.py @@ -0,0 +1,41 @@ +import pika +import time +import logging + +logging.basicConfig(level=logging.DEBUG) + +ITERATIONS = 100 + +connection = pika.BlockingConnection(pika.URLParameters('amqp://guest:guest@localhost:5672/%2F?heartbeat_interval=1')) +channel = connection.channel() + +def closeit(): + print('Close it') + connection.close() + +connection.add_timeout(5, closeit) + +connection.sleep(100) + +""" +channel.confirm_delivery() +start_time = time.time() + +for x in range(0, ITERATIONS): + if not channel.basic_publish(exchange='test', + routing_key='', + body='Test 123', + properties=pika.BasicProperties(content_type='text/plain', + app_id='test', + delivery_mode=1)): + print('Delivery not confirmed') + else: + print('Confirmed delivery') + +channel.close() +connection.close() + +duration = time.time() - start_time +print("Published %i messages in %.4f seconds (%.2f messages per second)" % (ITERATIONS, duration, (ITERATIONS/duration))) + +""" diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/examples/twisted_service.py b/NodeRed/NodeRedFiles/pika-0.13.1/examples/twisted_service.py new file mode 100644 index 000000000..235f1e897 --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/examples/twisted_service.py @@ -0,0 +1,209 @@ +""" +# -*- coding:utf-8 -*- +# based on: +# - txamqp-helpers by Dan Siemon (March 2010) +# http://git.coverfire.com/?p=txamqp-twistd.git;a=tree +# - Post by Brian Chandler +# https://groups.google.com/forum/#!topic/pika-python/o_deVmGondk +# - Pika Documentation +# https://pika.readthedocs.io/en/latest/examples/twisted_example.html + + +Fire up this test application via `twistd -ny twisted_service.py` + +The application will answer to requests to exchange "foobar" and any of the +routing_key values: "request1", "request2", or "request3" +with messages to the same exchange, but with routing_key "response" + +When a routing_key of "task" is used on the exchange "foobar", +the application can asynchronously run a maximum of 2 tasks at once +as defined by PREFETCH_COUNT +""" + +import pika +from pika import spec +from pika import exceptions +from pika.adapters import twisted_connection + +from twisted.internet import protocol +from twisted.application import internet +from twisted.application import service +from twisted.internet.defer import inlineCallbacks +from twisted.internet import ssl, defer, task +from twisted.python import log +from twisted.internet import reactor + +PREFETCH_COUNT = 2 + +class PikaService(service.MultiService): + name = 'amqp' + + def __init__(self, parameter): + service.MultiService.__init__(self) + self.parameters = parameter + + def startService(self): + self.connect() + service.MultiService.startService(self) + + def getFactory(self): + if len(self.services) > 0: + return self.services[0].factory + + def connect(self): + f = PikaFactory(self.parameters) + if self.parameters.ssl: + s = ssl.ClientContextFactory() + serv = internet.SSLClient(host=self.parameters.host, port=self.parameters.port, factory=f, contextFactory=s) + else: + serv = internet.TCPClient(host=self.parameters.host, port=self.parameters.port, factory=f) + serv.factory = f + f.service = serv + name = '%s%s:%d' % ('ssl:' if self.parameters.ssl else '', self.parameters.host, self.parameters.port) + serv.__repr__ = lambda : '' % name + serv.setName(name) + serv.parent = self + self.addService(serv) + + +class PikaProtocol(twisted_connection.TwistedProtocolConnection): + connected = False + name = 'AMQP:Protocol' + + @inlineCallbacks + def connected(self, connection): + self.channel = yield connection.channel() + yield self.channel.basic_qos(prefetch_count=PREFETCH_COUNT) + self.connected = True + for (exchange, routing_key, callback,) in self.factory.read_list: + yield self.setup_read(exchange, routing_key, callback) + + self.send() + + @inlineCallbacks + def read(self, exchange, routing_key, callback): + """Add an exchange to the list of exchanges to read from.""" + if self.connected: + yield self.setup_read(exchange, routing_key, callback) + + @inlineCallbacks + def setup_read(self, exchange, routing_key, callback): + """This function does the work to read from an exchange.""" + if not exchange == '': + yield self.channel.exchange_declare(exchange=exchange, exchange_type='topic', durable=True, auto_delete=False) + + yield self.channel.queue_declare(queue=routing_key, durable=True) + yield self.channel.queue_bind(queue=routing_key, exchange=exchange, routing_key=routing_key) + + (queue, consumer_tag,) = yield self.channel.basic_consume(queue=routing_key, no_ack=False) + d = queue.get() + d.addCallback(self._read_item, queue, callback) + d.addErrback(self._read_item_err) + + def _read_item(self, item, queue, callback): + """Callback function which is called when an item is read.""" + d = queue.get() + d.addCallback(self._read_item, queue, callback) + d.addErrback(self._read_item_err) + (channel, deliver, props, msg,) = item + + log.msg('%s (%s): %s' % (deliver.exchange, deliver.routing_key, repr(msg)), system='Pika:<=') + d = defer.maybeDeferred(callback, item) + d.addCallbacks( + lambda _: channel.basic_ack(deliver.delivery_tag), + lambda _: channel.basic_nack(deliver.delivery_tag) + ) + + def _read_item_err(self, error): + print(error) + + def send(self): + """If connected, send all waiting messages.""" + if self.connected: + while len(self.factory.queued_messages) > 0: + (exchange, r_key, message,) = self.factory.queued_messages.pop(0) + self.send_message(exchange, r_key, message) + + @inlineCallbacks + def send_message(self, exchange, routing_key, msg): + """Send a single message.""" + log.msg('%s (%s): %s' % (exchange, routing_key, repr(msg)), system='Pika:=>') + yield self.channel.exchange_declare(exchange=exchange, exchange_type='topic', durable=True, auto_delete=False) + prop = spec.BasicProperties(delivery_mode=2) + try: + yield self.channel.basic_publish(exchange=exchange, routing_key=routing_key, body=msg, properties=prop) + except Exception as error: + log.msg('Error while sending message: %s' % error, system=self.name) + + +class PikaFactory(protocol.ReconnectingClientFactory): + name = 'AMQP:Factory' + + def __init__(self, parameters): + self.parameters = parameters + self.client = None + self.queued_messages = [] + self.read_list = [] + + def startedConnecting(self, connector): + log.msg('Started to connect.', system=self.name) + + def buildProtocol(self, addr): + self.resetDelay() + log.msg('Connected', system=self.name) + self.client = PikaProtocol(self.parameters) + self.client.factory = self + self.client.ready.addCallback(self.client.connected) + return self.client + + def clientConnectionLost(self, connector, reason): + log.msg('Lost connection. Reason: %s' % reason, system=self.name) + protocol.ReconnectingClientFactory.clientConnectionLost(self, connector, reason) + + def clientConnectionFailed(self, connector, reason): + log.msg('Connection failed. Reason: %s' % reason, system=self.name) + protocol.ReconnectingClientFactory.clientConnectionFailed(self, connector, reason) + + def send_message(self, exchange = None, routing_key = None, message = None): + self.queued_messages.append((exchange, routing_key, message)) + if self.client is not None: + self.client.send() + + def read_messages(self, exchange, routing_key, callback): + """Configure an exchange to be read from.""" + self.read_list.append((exchange, routing_key, callback)) + if self.client is not None: + self.client.read(exchange, routing_key, callback) + + +application = service.Application("pikaapplication") + +ps = PikaService(pika.ConnectionParameters(host="localhost", virtual_host="/", credentials=pika.PlainCredentials("guest", "guest"))) +ps.setServiceParent(application) + + +class TestService(service.Service): + + def task(self, msg): + """ + Method for a time consuming task. + + This function must return a deferred. If it is successfull, + a `basic.ack` will be sent to AMQP. If the task was not completed a + `basic.nack` will be sent. In this example it will always return + successfully after a 2 second pause. + """ + return task.deferLater(reactor, 2, lambda: log.msg("task completed")) + + def respond(self, msg): + self.amqp.send_message('foobar', 'response', msg[3]) + + def startService(self): + self.amqp = self.parent.getServiceNamed("amqp").getFactory() + self.amqp.read_messages("foobar", "request1", self.respond) + self.amqp.read_messages("foobar", "request2", self.respond) + self.amqp.read_messages("foobar", "request3", self.respond) + self.amqp.read_messages("foobar", "task", self.task) + +ts = TestService() +ts.setServiceParent(application) diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/pika/__init__.py b/NodeRed/NodeRedFiles/pika-0.13.1/pika/__init__.py new file mode 100644 index 000000000..f21dc8b67 --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/pika/__init__.py @@ -0,0 +1,17 @@ +__version__ = '0.13.1' + +import logging +from logging import NullHandler + +# Add NullHandler to prevent logging warnings +logging.getLogger(__name__).addHandler(NullHandler()) + +from pika.connection import ConnectionParameters +from pika.connection import URLParameters +from pika.connection import SSLOptions +from pika.credentials import PlainCredentials +from pika.spec import BasicProperties + +from pika.adapters import BaseConnection +from pika.adapters import BlockingConnection +from pika.adapters import SelectConnection diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/pika/adapters/__init__.py b/NodeRed/NodeRedFiles/pika-0.13.1/pika/adapters/__init__.py new file mode 100644 index 000000000..236a98246 --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/pika/adapters/__init__.py @@ -0,0 +1,21 @@ +""" +Connection Adapters +=================== + +Pika provides multiple adapters to connect to RabbitMQ: + +- adapters.asyncio_connection.AsyncioConnection: Native Python3 AsyncIO use +- adapters.blocking_connection.BlockingConnection: Enables blocking, + synchronous operation on top of library for simple uses. +- adapters.select_connection.SelectConnection: A native event based connection + adapter that implements select, kqueue, poll and epoll. +- adapters.tornado_connection.TornadoConnection: Connection adapter for use + with the Tornado web framework. +- adapters.twisted_connection.TwistedConnection: Connection adapter for use + with the Twisted framework + +""" +from pika.adapters.base_connection import BaseConnection +from pika.adapters.blocking_connection import BlockingConnection +from pika.adapters.select_connection import SelectConnection +from pika.adapters.select_connection import IOLoop diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/pika/adapters/asyncio_connection.py b/NodeRed/NodeRedFiles/pika-0.13.1/pika/adapters/asyncio_connection.py new file mode 100644 index 000000000..57cb2d443 --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/pika/adapters/asyncio_connection.py @@ -0,0 +1,254 @@ +"""Use pika with the Asyncio EventLoop""" +import asyncio +from functools import partial + +from pika.adapters import base_connection + + +class IOLoopAdapter: + def __init__(self, loop): + """ + Basic adapter for asyncio event loop + + :type loop: asyncio.AbstractEventLoop + :param loop: Asyncio Loop + + """ + self.loop = loop + + self.handlers = {} + self.readers = set() + self.writers = set() + + def close(self): + """Release ioloop's resources. + + This method is intended to be called by the application or test code + only after the ioloop's outermost `start()` call returns. After calling + `close()`, no other interaction with the closed instance of ioloop + should be performed. + + """ + self.loop.close() + + def add_timeout(self, deadline, callback_method): + """Add the callback_method to the EventLoop timer to fire after deadline + seconds. Returns a Handle to the timeout. + + :param int deadline: The number of seconds to wait to call callback + :param method callback_method: The callback method + :rtype: asyncio.Handle + + """ + return self.loop.call_later(deadline, callback_method) + + @staticmethod + def remove_timeout(handle): + """ + Cancel asyncio.Handle + + :type handle: asyncio.Handle + :rtype: bool + """ + return handle.cancel() + + def add_callback_threadsafe(self, callback): + """Requests a call to the given function as soon as possible in the + context of this IOLoop's thread. + + NOTE: This is the only thread-safe method offered by the IOLoop adapter. + All other manipulations of the IOLoop adapter and its parent connection + must be performed from the connection's thread. + + For example, a thread may request a call to the + `channel.basic_ack` method of a connection that is running in a + different thread via + + ``` + connection.add_callback_threadsafe( + functools.partial(channel.basic_ack, delivery_tag=...)) + ``` + + :param method callback: The callback method; must be callable. + + """ + self.loop.call_soon_threadsafe(callback) + + def add_handler(self, fd, cb, event_state): + """ Registers the given handler to receive the given events for ``fd``. + + The ``fd`` argument is an integer file descriptor. + + The ``event_state`` argument is a bitwise or of the constants + ``base_connection.BaseConnection.READ``, ``base_connection.BaseConnection.WRITE``, + and ``base_connection.BaseConnection.ERROR``. + + """ + + if fd in self.handlers: + raise ValueError("fd {} added twice".format(fd)) + self.handlers[fd] = cb + + if event_state & base_connection.BaseConnection.READ: + self.loop.add_reader( + fd, + partial( + cb, + fd=fd, + events=base_connection.BaseConnection.READ + ) + ) + self.readers.add(fd) + + if event_state & base_connection.BaseConnection.WRITE: + self.loop.add_writer( + fd, + partial( + cb, + fd=fd, + events=base_connection.BaseConnection.WRITE + ) + ) + self.writers.add(fd) + + def remove_handler(self, fd): + """ Stop listening for events on ``fd``. """ + + if fd not in self.handlers: + return + + if fd in self.readers: + self.loop.remove_reader(fd) + self.readers.remove(fd) + + if fd in self.writers: + self.loop.remove_writer(fd) + self.writers.remove(fd) + + del self.handlers[fd] + + def update_handler(self, fd, event_state): + if event_state & base_connection.BaseConnection.READ: + if fd not in self.readers: + self.loop.add_reader( + fd, + partial( + self.handlers[fd], + fd=fd, + events=base_connection.BaseConnection.READ + ) + ) + self.readers.add(fd) + else: + if fd in self.readers: + self.loop.remove_reader(fd) + self.readers.remove(fd) + + if event_state & base_connection.BaseConnection.WRITE: + if fd not in self.writers: + self.loop.add_writer( + fd, + partial( + self.handlers[fd], + fd=fd, + events=base_connection.BaseConnection.WRITE + ) + ) + self.writers.add(fd) + else: + if fd in self.writers: + self.loop.remove_writer(fd) + self.writers.remove(fd) + + + def start(self): + """ Start Event Loop """ + if self.loop.is_running(): + return + + self.loop.run_forever() + + def stop(self): + """ Stop Event Loop """ + if self.loop.is_closed(): + return + + self.loop.stop() + + +class AsyncioConnection(base_connection.BaseConnection): + """ The AsyncioConnection runs on the Asyncio EventLoop. + + :param pika.connection.Parameters parameters: Connection parameters + :param on_open_callback: The method to call when the connection is open + :type on_open_callback: method + :param on_open_error_callback: Method to call if the connection cant be opened + :type on_open_error_callback: method + :param asyncio.AbstractEventLoop loop: By default asyncio.get_event_loop() + + """ + def __init__(self, + parameters=None, + on_open_callback=None, + on_open_error_callback=None, + on_close_callback=None, + stop_ioloop_on_close=False, + custom_ioloop=None): + """ Create a new instance of the AsyncioConnection class, connecting + to RabbitMQ automatically + + :param pika.connection.Parameters parameters: Connection parameters + :param on_open_callback: The method to call when the connection is open + :type on_open_callback: method + :param on_open_error_callback: Method to call if the connection cant be opened + :type on_open_error_callback: method + :param asyncio.AbstractEventLoop loop: By default asyncio.get_event_loop() + + """ + self.sleep_counter = 0 + self.loop = custom_ioloop or asyncio.get_event_loop() + self.ioloop = IOLoopAdapter(self.loop) + + super().__init__( + parameters, on_open_callback, + on_open_error_callback, + on_close_callback, self.ioloop, + stop_ioloop_on_close=stop_ioloop_on_close, + ) + + def _adapter_connect(self): + """Connect to the remote socket, adding the socket to the EventLoop if + connected. + + :rtype: bool + + """ + error = super()._adapter_connect() + + if not error: + self.ioloop.add_handler( + self.socket.fileno(), + self._handle_events, + self.event_state, + ) + + return error + + def _adapter_disconnect(self): + """Disconnect from the RabbitMQ broker""" + + if self.socket: + self.ioloop.remove_handler( + self.socket.fileno() + ) + + super()._adapter_disconnect() + + def _handle_disconnect(self): + # No other way to handle exceptions.ProbableAuthenticationError + try: + super()._handle_disconnect() + super()._handle_write() + except Exception as e: + # FIXME: Pass None or other constant instead "-1" + self._on_disconnect(-1, e) diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/pika/adapters/base_connection.py b/NodeRed/NodeRedFiles/pika-0.13.1/pika/adapters/base_connection.py new file mode 100644 index 000000000..60078e5e3 --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/pika/adapters/base_connection.py @@ -0,0 +1,582 @@ +"""Base class extended by connection adapters. This extends the +connection.Connection class to encapsulate connection behavior but still +isolate socket and low level communication. + +""" +import errno +import logging +import socket +import ssl + +import pika.compat +import pika.tcp_socket_opts + +from pika import __version__ +from pika import connection +from pika.compat import SOCKET_ERROR +from pika.compat import SOL_TCP + +LOGGER = logging.getLogger(__name__) + + +class BaseConnection(connection.Connection): + """BaseConnection class that should be extended by connection adapters""" + + # Use epoll's constants to keep life easy + READ = 0x0001 + WRITE = 0x0004 + ERROR = 0x0008 + + ERRORS_TO_ABORT = [ + errno.EBADF, errno.ECONNABORTED, errno.EPIPE, errno.ETIMEDOUT + ] + ERRORS_TO_IGNORE = [errno.EWOULDBLOCK, errno.EAGAIN, errno.EINTR] + DO_HANDSHAKE = True + WARN_ABOUT_IOLOOP = False + + def __init__(self, + parameters=None, + on_open_callback=None, + on_open_error_callback=None, + on_close_callback=None, + ioloop=None, + stop_ioloop_on_close=True): + """Create a new instance of the Connection object. + + :param pika.connection.Parameters parameters: Connection parameters + :param method on_open_callback: Method to call on connection open + :param method on_open_error_callback: Called if the connection can't + be established: on_open_error_callback(connection, str|exception) + :param method on_close_callback: Called when the connection is closed: + on_close_callback(connection, reason_code, reason_text) + :param object ioloop: IOLoop object to use + :param bool stop_ioloop_on_close: Call ioloop.stop() if disconnected + :raises: RuntimeError + :raises: ValueError + + """ + if parameters and not isinstance(parameters, connection.Parameters): + raise ValueError( + 'Expected instance of Parameters, not %r' % (parameters,)) + + # Let the developer know we could not import SSL + if parameters and parameters.ssl and not ssl: + raise RuntimeError("SSL specified but it is not available") + self.base_events = self.READ | self.ERROR + self.event_state = self.base_events + self.ioloop = ioloop + self.socket = None + self.stop_ioloop_on_close = stop_ioloop_on_close + self.write_buffer = None + super(BaseConnection, + self).__init__(parameters, on_open_callback, + on_open_error_callback, on_close_callback) + + def __repr__(self): + + def get_socket_repr(sock): + """Return socket info suitable for use in repr""" + if sock is None: + return None + + sockname = None + peername = None + try: + sockname = sock.getsockname() + except SOCKET_ERROR: + # closed? + pass + else: + try: + peername = sock.getpeername() + except SOCKET_ERROR: + # not connected? + pass + + return '%s->%s' % (sockname, peername) + + return ('<%s %s socket=%s params=%s>' % + (self.__class__.__name__, + self._STATE_NAMES[self.connection_state], + get_socket_repr(self.socket), self.params)) + + def add_timeout(self, deadline, callback_method): + """Add the callback_method to the IOLoop timer to fire after deadline + seconds. Returns a handle to the timeout + + :param int deadline: The number of seconds to wait to call callback + :param method callback_method: The callback method + :rtype: str + + """ + return self.ioloop.add_timeout(deadline, callback_method) + + def close(self, reply_code=200, reply_text='Normal shutdown'): + """Disconnect from RabbitMQ. If there are any open channels, it will + attempt to close them prior to fully disconnecting. Channels which + have active consumers will attempt to send a Basic.Cancel to RabbitMQ + to cleanly stop the delivery of messages prior to closing the channel. + + :param int reply_code: The code number for the close + :param str reply_text: The text reason for the close + + """ + try: + super(BaseConnection, self).close(reply_code, reply_text) + finally: + if self.is_closed: + self._handle_ioloop_stop() + + def remove_timeout(self, timeout_id): + """Remove the timeout from the IOLoop by the ID returned from + add_timeout. + + :rtype: str + + """ + self.ioloop.remove_timeout(timeout_id) + + def add_callback_threadsafe(self, callback): + """Requests a call to the given function as soon as possible in the + context of this connection's IOLoop thread. + + NOTE: This is the only thread-safe method offered by the connection. All + other manipulations of the connection must be performed from the + connection's thread. + + For example, a thread may request a call to the + `channel.basic_ack` method of a connection that is running in a + different thread via + + ``` + connection.add_callback_threadsafe( + functools.partial(channel.basic_ack, delivery_tag=...)) + ``` + + :param method callback: The callback method; must be callable. + + """ + if not callable(callback): + raise TypeError( + 'callback must be a callable, but got %r' % (callback,)) + + self.ioloop.add_callback_threadsafe(callback) + + def _adapter_connect(self): + """Connect to the RabbitMQ broker, returning True if connected. + + :returns: error string or exception instance on error; None on success + + """ + # Get the addresses for the socket, supporting IPv4 & IPv6 + while True: + try: + addresses = self._getaddrinfo( + self.params.host, self.params.port, 0, socket.SOCK_STREAM, + socket.IPPROTO_TCP) + break + except SOCKET_ERROR as error: + if error.errno == errno.EINTR: + continue + + LOGGER.critical('Could not get addresses to use: %s (%s)', + error, self.params.host) + return error + + # If the socket is created and connected, continue on + error = "No socket addresses available" + for sock_addr in addresses: + error = self._create_and_connect_to_socket(sock_addr) + if not error: + # Make the socket non-blocking after the connect + self.socket.setblocking(0) + return None + self._cleanup_socket() + + # Failed to connect + return error + + def _adapter_disconnect(self): + """Invoked if the connection is being told to disconnect""" + try: + self._cleanup_socket() + finally: + self._handle_ioloop_stop() + + def _cleanup_socket(self): + """Close the socket cleanly""" + if self.socket: + try: + self.socket.shutdown(socket.SHUT_RDWR) + except SOCKET_ERROR: + pass + self.socket.close() + self.socket = None + + def _create_and_connect_to_socket(self, sock_addr_tuple): + """Create socket and connect to it, using SSL if enabled. + + :returns: error string on failure; None on success + """ + self.socket = self._create_tcp_connection_socket( + sock_addr_tuple[0], sock_addr_tuple[1], sock_addr_tuple[2]) + self.socket.setsockopt(SOL_TCP, socket.TCP_NODELAY, 1) + self.socket.settimeout(self.params.socket_timeout) + pika.tcp_socket_opts.set_sock_opts(self.params.tcp_options, self.socket) + + # Wrap socket if using SSL + if self.params.ssl: + self.socket = self._wrap_socket(self.socket) + ssl_text = " with SSL" + else: + ssl_text = "" + + LOGGER.info('Pika version %s connecting to %s:%s%s', + __version__, + sock_addr_tuple[4][0], + sock_addr_tuple[4][1], ssl_text) + + # Connect to the socket + try: + self.socket.connect(sock_addr_tuple[4]) + except socket.timeout: + error = 'Connection to %s:%s failed: timeout' % ( + sock_addr_tuple[4][0], sock_addr_tuple[4][1]) + LOGGER.error(error) + return error + except SOCKET_ERROR as error: + error = 'Connection to %s:%s failed: %s' % (sock_addr_tuple[4][0], + sock_addr_tuple[4][1], + error) + LOGGER.error(error) + return error + + # Handle SSL Connection Negotiation + if self.params.ssl and self.DO_HANDSHAKE: + try: + self._do_ssl_handshake() + except ssl.SSLError as error: + error = 'SSL connection to %s:%s failed: %s' % ( + sock_addr_tuple[4][0], sock_addr_tuple[4][1], error) + LOGGER.error(error) + return error + # Made it this far + return None + + @staticmethod + def _create_tcp_connection_socket(sock_family, sock_type, sock_proto): + """ Create TCP/IP stream socket for AMQP connection + + :param int sock_family: socket family + :param int sock_type: socket type + :param int sock_proto: socket protocol number + + NOTE We break this out to make it easier to patch in mock tests + """ + return socket.socket(sock_family, sock_type, sock_proto) + + def _do_ssl_handshake(self): + """Perform SSL handshaking, copied from python stdlib test_ssl.py. + + """ + if not self.DO_HANDSHAKE: + return + while True: + try: + self.socket.do_handshake() + break + # TODO should be using SSLWantReadError, etc. directly + except ssl.SSLError as err: + # TODO these exc are for non-blocking sockets, but ours isn't + # at this stage, so it's not clear why we have this. + if err.args[0] == ssl.SSL_ERROR_WANT_READ: + self.event_state = self.READ + elif err.args[0] == ssl.SSL_ERROR_WANT_WRITE: + self.event_state = self.WRITE + else: + raise + self._manage_event_state() + + @staticmethod + def _getaddrinfo(host, port, family, socktype, proto): + """Wrap `socket.getaddrinfo` to make it easier to patch for unit tests + """ + return socket.getaddrinfo(host, port, family, socktype, proto) + + @staticmethod + def _get_error_code(error_value): + """Get the error code from the error_value accounting for Python + version differences. + + :rtype: int + + """ + if not error_value: + return None + + return error_value.errno + + def _flush_outbound(self): + """Have the state manager schedule the necessary I/O. + """ + # NOTE: We don't call _handle_write() from this context, because pika + # code was not designed to be writing to (or reading from) the socket + # from any methods, except from ioloop handler callbacks. Many methods + # in pika core and adapters do not deal gracefully with connection + # errors occurring in their context; e.g., Connection.channel (pika + # issue #659), Connection._on_connection_tune (if connection loss is + # detected in _send_connection_tune_ok, before _send_connection_open is + # called), etc., etc., etc. + self._manage_event_state() + + def _handle_ioloop_stop(self): + """Invoked when the connection is closed to determine if the IOLoop + should be stopped or not. + + """ + if self.stop_ioloop_on_close and self.ioloop: + self.ioloop.stop() + elif self.WARN_ABOUT_IOLOOP: + LOGGER.warning('Connection is closed but not stopping IOLoop') + + def _handle_error(self, error_value): + """Internal error handling method. Here we expect a socket error + coming in and will handle different socket errors differently. + + :param int|object error_value: The inbound error + + """ + # TODO doesn't seem right: docstring defines error_value as int|object, + # but _get_error_code expects a falsie or an exception-like object + error_code = self._get_error_code(error_value) + + if not error_code: + LOGGER.critical("Tried to handle an error where no error existed") + return + + # Ok errors, just continue what we were doing before + if error_code in self.ERRORS_TO_IGNORE: + LOGGER.debug("Ignoring %s", error_code) + return + + # Socket is no longer connected, abort + elif error_code in self.ERRORS_TO_ABORT: + LOGGER.error("Fatal Socket Error: %r", error_value) + + elif self.params.ssl and isinstance(error_value, ssl.SSLError): + + if error_value.args[0] == ssl.SSL_ERROR_WANT_READ: + # TODO doesn't seem right: this logic updates event state, but + # the logic at the bottom unconditionaly disconnects anyway. + self.event_state = self.READ + elif error_value.args[0] == ssl.SSL_ERROR_WANT_WRITE: + self.event_state = self.WRITE + else: + LOGGER.error("SSL Socket error: %r", error_value) + + else: + # Haven't run into this one yet, log it. + LOGGER.error("Socket Error: %s", error_code) + + # Disconnect from our IOLoop and let Connection know what's up + self._on_terminate(connection.InternalCloseReasons.SOCKET_ERROR, + repr(error_value)) + + def _handle_timeout(self): + """Handle a socket timeout in read or write. + We don't do anything in the non-blocking handlers because we + only have the socket in a blocking state during connect.""" + LOGGER.warning("Unexpected socket timeout") + + def _handle_events(self, fd, events, error=None, write_only=False): + """Handle IO/Event loop events, processing them. + + :param int fd: The file descriptor for the events + :param int events: Events from the IO/Event loop + :param int error: Was an error specified; TODO none of the current + adapters appear to be able to pass the `error` arg - is it needed? + :param bool write_only: Only handle write events + + """ + if not self.socket: + LOGGER.error('Received events on closed socket: %r', fd) + return + + if self.socket and (events & self.WRITE): + self._handle_write() + self._manage_event_state() + + if self.socket and not write_only and (events & self.READ): + self._handle_read() + + if (self.socket and write_only and (events & self.READ) and + (events & self.ERROR)): + error_msg = ('BAD libc: Write-Only but Read+Error. ' + 'Assume socket disconnected.') + LOGGER.error(error_msg) + self._on_terminate(connection.InternalCloseReasons.SOCKET_ERROR, + error_msg) + + if self.socket and (events & self.ERROR): + LOGGER.error('Error event %r, %r', events, error) + self._handle_error(error) + + def _handle_read(self): + """Read from the socket and call our on_data_available with the data.""" + try: + while True: + try: + if self.params.ssl: + data = self.socket.read(self._buffer_size) + else: + data = self.socket.recv(self._buffer_size) + + break + except SOCKET_ERROR as error: + if error.errno == errno.EINTR: + continue + else: + raise + + except socket.timeout: + self._handle_timeout() + return 0 + + except ssl.SSLError as error: + if error.args[0] == ssl.SSL_ERROR_WANT_READ: + # ssl wants more data but there is nothing currently + # available in the socket, wait for it to become readable. + return 0 + return self._handle_error(error) + + except SOCKET_ERROR as error: + if error.errno in (errno.EAGAIN, errno.EWOULDBLOCK): + return 0 + return self._handle_error(error) + + # Empty data, should disconnect + if not data or data == 0: + LOGGER.error('Read empty data, calling disconnect') + return self._on_terminate( + connection.InternalCloseReasons.SOCKET_ERROR, "EOF") + + # Pass the data into our top level frame dispatching method + self._on_data_available(data) + return len(data) + + def _handle_write(self): + """Try and write as much as we can, if we get blocked requeue + what's left""" + total_bytes_sent = 0 + try: + while self.outbound_buffer: + frame = self.outbound_buffer.popleft() + while True: + try: + num_bytes_sent = self.socket.send(frame) + break + except SOCKET_ERROR as error: + if error.errno == errno.EINTR: + continue + else: + raise + + total_bytes_sent += num_bytes_sent + if num_bytes_sent < len(frame): + LOGGER.debug("Partial write, requeing remaining data") + self.outbound_buffer.appendleft(frame[num_bytes_sent:]) + break + + except socket.timeout: + # Will only come here if the socket is blocking + LOGGER.debug("socket timeout, requeuing frame") + self.outbound_buffer.appendleft(frame) + self._handle_timeout() + + except ssl.SSLError as error: + if error.args[0] == ssl.SSL_ERROR_WANT_WRITE: + # In Python 3.5+, SSLSocket.send raises this if the socket is + # not currently able to write. Handle this just like an + # EWOULDBLOCK socket error. + LOGGER.debug("Would block, requeuing frame") + self.outbound_buffer.appendleft(frame) + else: + return self._handle_error(error) + + except SOCKET_ERROR as error: + if error.errno in (errno.EAGAIN, errno.EWOULDBLOCK): + LOGGER.debug("Would block, requeuing frame") + self.outbound_buffer.appendleft(frame) + else: + return self._handle_error(error) + + return total_bytes_sent + + def _init_connection_state(self): + """Initialize or reset all of our internal state variables for a given + connection. If we disconnect and reconnect, all of our state needs to + be wiped. + + """ + super(BaseConnection, self)._init_connection_state() + self.base_events = self.READ | self.ERROR + self.event_state = self.base_events + self.socket = None + + def _manage_event_state(self): + """Manage the bitmask for reading/writing/error which is used by the + io/event handler to specify when there is an event such as a read or + write. + + """ + if self.outbound_buffer: + if not self.event_state & self.WRITE: + self.event_state |= self.WRITE + self.ioloop.update_handler(self.socket.fileno(), + self.event_state) + elif self.event_state & self.WRITE: + self.event_state = self.base_events + self.ioloop.update_handler(self.socket.fileno(), self.event_state) + + def _wrap_socket(self, sock): + """Wrap the socket for connecting over SSL. This allows the user to use + a dict for the usual SSL options or an SSLOptions object for more + advanced control. + + :rtype: ssl.SSLSocket + + """ + ssl_options = self.params.ssl_options or {} + # our wrapped return sock + ssl_sock = None + + if isinstance(ssl_options, connection.SSLOptions): + context = ssl.SSLContext(ssl_options.ssl_version) + context.verify_mode = ssl_options.verify_mode + if ssl_options.certfile is not None: + context.load_cert_chain( + certfile=ssl_options.certfile, + keyfile=ssl_options.keyfile, + password=ssl_options.key_password) + + # only one of either cafile or capath have to defined + if ssl_options.cafile is not None or ssl_options.capath is not None: + context.load_verify_locations( + cafile=ssl_options.cafile, + capath=ssl_options.capath, + cadata=ssl_options.cadata) + + if ssl_options.ciphers is not None: + context.set_ciphers(ssl_options.ciphers) + + ssl_sock = context.wrap_socket( + sock, + server_side=ssl_options.server_side, + do_handshake_on_connect=ssl_options.do_handshake_on_connect, + suppress_ragged_eofs=ssl_options.suppress_ragged_eofs, + server_hostname=ssl_options.server_hostname) + else: + ssl_sock = ssl.wrap_socket( + sock, do_handshake_on_connect=self.DO_HANDSHAKE, **ssl_options) + + return ssl_sock diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/pika/adapters/blocking_connection.py b/NodeRed/NodeRedFiles/pika-0.13.1/pika/adapters/blocking_connection.py new file mode 100644 index 000000000..9acf9c927 --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/pika/adapters/blocking_connection.py @@ -0,0 +1,2616 @@ +"""The blocking connection adapter module implements blocking semantics on top +of Pika's core AMQP driver. While most of the asynchronous expectations are +removed when using the blocking connection adapter, it attempts to remain true +to the asynchronous RPC nature of the AMQP protocol, supporting server sent +RPC commands. + +The user facing classes in the module consist of the +:py:class:`~pika.adapters.blocking_connection.BlockingConnection` +and the :class:`~pika.adapters.blocking_connection.BlockingChannel` +classes. + +""" +# Suppress too-many-lines +# pylint: disable=C0302 + +# Disable "access to protected member warnings: this wrapper implementation is +# a friend of those instances +# pylint: disable=W0212 + +from collections import namedtuple, deque +import contextlib +import functools +import logging +import time + +import pika.channel +from pika import compat +from pika import exceptions +import pika.spec +# NOTE: import SelectConnection after others to avoid circular depenency +from pika.adapters.select_connection import SelectConnection + + +LOGGER = logging.getLogger(__name__) + + +class _CallbackResult(object): + """ CallbackResult is a non-thread-safe implementation for receiving + callback results; INTERNAL USE ONLY! + """ + __slots__ = ('_value_class', '_ready', '_values') + def __init__(self, value_class=None): + """ + :param callable value_class: only needed if the CallbackResult + instance will be used with + `set_value_once` and `append_element`. + *args and **kwargs of the value setter + methods will be passed to this class. + + """ + self._value_class = value_class + self._ready = None + self._values = None + self.reset() + + def reset(self): + """Reset value, but not _value_class""" + self._ready = False + self._values = None + + def __bool__(self): + """ Called by python runtime to implement truth value testing and the + built-in operation bool(); NOTE: python 3.x + """ + return self.is_ready() + + # python 2.x version of __bool__ + __nonzero__ = __bool__ + + def __enter__(self): + """ Entry into context manager that automatically resets the object + on exit; this usage pattern helps garbage-collection by eliminating + potential circular references. + """ + return self + + def __exit__(self, *args, **kwargs): + """Reset value""" + self.reset() + + def is_ready(self): + """ + :returns: True if the object is in a signaled state + """ + return self._ready + + @property + def ready(self): + """True if the object is in a signaled state""" + return self._ready + + def signal_once(self, *_args, **_kwargs): + """ Set as ready + + :raises AssertionError: if result was already signalled + """ + assert not self._ready, '_CallbackResult was already set' + self._ready = True + + def set_value_once(self, *args, **kwargs): + """ Set as ready with value; the value may be retrieved via the `value` + property getter + + :raises AssertionError: if result was already set + """ + self.signal_once() + try: + self._values = (self._value_class(*args, **kwargs),) + except Exception: + LOGGER.error( + "set_value_once failed: value_class=%r; args=%r; kwargs=%r", + self._value_class, args, kwargs) + raise + + def append_element(self, *args, **kwargs): + """Append an element to values""" + assert not self._ready or isinstance(self._values, list), ( + '_CallbackResult state is incompatible with append_element: ' + 'ready=%r; values=%r' % (self._ready, self._values)) + + try: + value = self._value_class(*args, **kwargs) + except Exception: + LOGGER.error( + "append_element failed: value_class=%r; args=%r; kwargs=%r", + self._value_class, args, kwargs) + raise + + if self._values is None: + self._values = [value] + else: + self._values.append(value) + + self._ready = True + + + @property + def value(self): + """ + :returns: a reference to the value that was set via `set_value_once` + :raises AssertionError: if result was not set or value is incompatible + with `set_value_once` + """ + assert self._ready, '_CallbackResult was not set' + assert isinstance(self._values, tuple) and len(self._values) == 1, ( + '_CallbackResult value is incompatible with set_value_once: %r' + % (self._values,)) + + return self._values[0] + + + @property + def elements(self): + """ + :returns: a reference to the list containing one or more elements that + were added via `append_element` + :raises AssertionError: if result was not set or value is incompatible + with `append_element` + """ + assert self._ready, '_CallbackResult was not set' + assert isinstance(self._values, list) and self._values, ( + '_CallbackResult value is incompatible with append_element: %r' + % (self._values,)) + + return self._values + + +class _IoloopTimerContext(object): + """Context manager for registering and safely unregistering a + SelectConnection ioloop-based timer + """ + + def __init__(self, duration, connection): + """ + :param float duration: non-negative timer duration in seconds + :param SelectConnection connection: + """ + assert hasattr(connection, 'add_timeout'), connection + self._duration = duration + self._connection = connection + self._callback_result = _CallbackResult() + self._timer_id = None + + def __enter__(self): + """Register a timer""" + self._timer_id = self._connection.add_timeout( + self._duration, + self._callback_result.signal_once) + return self + + def __exit__(self, *_args, **_kwargs): + """Unregister timer if it hasn't fired yet""" + if not self._callback_result: + self._connection.remove_timeout(self._timer_id) + + def is_ready(self): + """ + :returns: True if timer has fired, False otherwise + """ + return self._callback_result.is_ready() + + +class _TimerEvt(object): + """Represents a timer created via `BlockingConnection.add_timeout`""" + __slots__ = ('timer_id', '_callback') + + def __init__(self, callback): + """ + :param callback: see callback_method in `BlockingConnection.add_timeout` + """ + self._callback = callback + + # Will be set to timer id returned from the underlying implementation's + # `add_timeout` method + self.timer_id = None + + def __repr__(self): + return '<%s timer_id=%s callback=%s>' % (self.__class__.__name__, + self.timer_id, self._callback) + + def dispatch(self): + """Dispatch the user's callback method""" + self._callback() + + +class _ConnectionBlockedUnblockedEvtBase(object): + """Base class for `_ConnectionBlockedEvt` and `_ConnectionUnblockedEvt`""" + __slots__ = ('_callback', '_method_frame') + + def __init__(self, callback, method_frame): + """ + :param callback: see callback_method parameter in + `BlockingConnection.add_on_connection_blocked_callback` and + `BlockingConnection.add_on_connection_unblocked_callback` + :param pika.frame.Method method_frame: with method_frame.method of type + `pika.spec.Connection.Blocked` or `pika.spec.Connection.Unblocked` + """ + self._callback = callback + self._method_frame = method_frame + + def __repr__(self): + return '<%s callback=%s, frame=%s>' % (self.__class__.__name__, + self._callback, + self._method_frame) + + def dispatch(self): + """Dispatch the user's callback method""" + self._callback(self._method_frame) + + +class _ConnectionBlockedEvt(_ConnectionBlockedUnblockedEvtBase): + """Represents a Connection.Blocked notification from RabbitMQ broker`""" + pass + + +class _ConnectionUnblockedEvt(_ConnectionBlockedUnblockedEvtBase): + """Represents a Connection.Unblocked notification from RabbitMQ broker`""" + pass + + +class BlockingConnection(object): + """The BlockingConnection creates a layer on top of Pika's asynchronous core + providing methods that will block until their expected response has + returned. Due to the asynchronous nature of the `Basic.Deliver` and + `Basic.Return` calls from RabbitMQ to your application, you can still + implement continuation-passing style asynchronous methods if you'd like to + receive messages from RabbitMQ using + :meth:`basic_consume ` or if you want to be + notified of a delivery failure when using + :meth:`basic_publish `. + + For more information about communicating with the blocking_connection + adapter, be sure to check out the + :class:`BlockingChannel ` class which implements the + :class:`Channel ` based communication for the + blocking_connection adapter. + + To prevent recursion/reentrancy, the blocking connection and channel + implementations queue asynchronously-delivered events received + in nested context (e.g., while waiting for `BlockingConnection.channel` or + `BlockingChannel.queue_declare` to complete), dispatching them synchronously + once nesting returns to the desired context. This concerns all callbacks, + such as those registered via `BlockingConnection.add_timeout`, + `BlockingConnection.add_on_connection_blocked_callback`, + `BlockingConnection.add_on_connection_unblocked_callback`, + `BlockingChannel.basic_consume`, etc. + + Blocked Connection deadlock avoidance: when RabbitMQ becomes low on + resources, it emits Connection.Blocked (AMQP extension) to the client + connection when client makes a resource-consuming request on that connection + or its channel (e.g., `Basic.Publish`); subsequently, RabbitMQ suspsends + processing requests from that connection until the affected resources are + restored. See http://www.rabbitmq.com/connection-blocked.html. This + may impact `BlockingConnection` and `BlockingChannel` operations in a + way that users might not be expecting. For example, if the user dispatches + `BlockingChannel.basic_publish` in non-publisher-confirmation mode while + RabbitMQ is in this low-resource state followed by a synchronous request + (e.g., `BlockingConnection.channel`, `BlockingChannel.consume`, + `BlockingChannel.basic_consume`, etc.), the synchronous request will block + indefinitely (until Connection.Unblocked) waiting for RabbitMQ to reply. If + the blocked state persists for a long time, the blocking operation will + appear to hang. In this state, `BlockingConnection` instance and its + channels will not dispatch user callbacks. SOLUTION: To break this potential + deadlock, applications may configure the `blocked_connection_timeout` + connection parameter when instantiating `BlockingConnection`. Upon blocked + connection timeout, this adapter will raise ConnectionClosed exception with + first exception arg of + `pika.connection.InternalCloseReasons.BLOCKED_CONNECTION_TIMEOUT`. See + `pika.connection.ConnectionParameters` documentation to learn more about + `blocked_connection_timeout` configuration. + + """ + # Connection-opened callback args + _OnOpenedArgs = namedtuple('BlockingConnection__OnOpenedArgs', + 'connection') + + # Connection-establishment error callback args + _OnOpenErrorArgs = namedtuple('BlockingConnection__OnOpenErrorArgs', + 'connection error') + + # Connection-closing callback args + _OnClosedArgs = namedtuple('BlockingConnection__OnClosedArgs', + 'connection reason_code reason_text') + + # Channel-opened callback args + _OnChannelOpenedArgs = namedtuple( + 'BlockingConnection__OnChannelOpenedArgs', + 'channel') + + def __init__(self, parameters=None, _impl_class=None): + """Create a new instance of the Connection object. + + :param pika.connection.Parameters parameters: Connection parameters + :param _impl_class: for tests/debugging only; implementation class; + None=default + + :raises RuntimeError: + + """ + # Used by the _acquire_event_dispatch decorator; when already greater + # than 0, event dispatch is already acquired higher up the call stack + self._event_dispatch_suspend_depth = 0 + + # Connection-specific events that are ready for dispatch: _TimerEvt, + # _ConnectionBlockedEvt, _ConnectionUnblockedEvt + self._ready_events = deque() + + # Channel numbers of channels that are requesting a call to their + # BlockingChannel._dispatch_events method; See + # `_request_channel_dispatch` + self._channels_pending_dispatch = set() + + # Receives on_open_callback args from Connection + self._opened_result = _CallbackResult(self._OnOpenedArgs) + + # Receives on_open_error_callback args from Connection + self._open_error_result = _CallbackResult(self._OnOpenErrorArgs) + + # Receives on_close_callback args from Connection + self._closed_result = _CallbackResult(self._OnClosedArgs) + + # Set to True when when user calls close() on the connection + # NOTE: this is a workaround to detect socket error because + # on_close_callback passes reason_code=0 when called due to socket error + self._user_initiated_close = False + + impl_class = _impl_class or SelectConnection + self._impl = impl_class( + parameters=parameters, + on_open_callback=self._opened_result.set_value_once, + on_open_error_callback=self._open_error_result.set_value_once, + on_close_callback=self._closed_result.set_value_once, + stop_ioloop_on_close=False) + + self._impl.ioloop.activate_poller() + + self._process_io_for_connection_setup() + + def __repr__(self): + return '<%s impl=%r>' % (self.__class__.__name__, self._impl) + + def _cleanup(self): + """Clean up members that might inhibit garbage collection""" + self._impl.ioloop.close() + self._ready_events.clear() + self._opened_result.reset() + self._open_error_result.reset() + self._closed_result.reset() + + @contextlib.contextmanager + def _acquire_event_dispatch(self): + """ Context manager that controls access to event dispatcher for + preventing reentrancy. + + The "as" value is True if the managed code block owns the event + dispatcher and False if caller higher up in the call stack already owns + it. Only managed code that gets ownership (got True) is permitted to + dispatch + """ + try: + # __enter__ part + self._event_dispatch_suspend_depth += 1 + yield self._event_dispatch_suspend_depth == 1 + finally: + # __exit__ part + self._event_dispatch_suspend_depth -= 1 + + def _process_io_for_connection_setup(self): + """ Perform follow-up processing for connection setup request: flush + connection output and process input while waiting for connection-open + or connection-error. + + :raises AMQPConnectionError: on connection open error + """ + if not self._open_error_result.ready: + self._flush_output(self._opened_result.is_ready, + self._open_error_result.is_ready) + + if self._open_error_result.ready: + try: + exception_or_message = self._open_error_result.value.error + if isinstance(exception_or_message, Exception): + raise exception_or_message + raise exceptions.AMQPConnectionError(exception_or_message) + finally: + self._cleanup() + + assert self._opened_result.ready + assert self._opened_result.value.connection is self._impl + + def _flush_output(self, *waiters): + """ Flush output and process input while waiting for any of the given + callbacks to return true. The wait is aborted upon connection-close. + Otherwise, processing continues until the output is flushed AND at least + one of the callbacks returns true. If there are no callbacks, then + processing ends when all output is flushed. + + :param waiters: sequence of zero or more callables taking no args and + returning true when it's time to stop processing. + Their results are OR'ed together. + """ + if self.is_closed: + raise exceptions.ConnectionClosed() + + # Conditions for terminating the processing loop: + # connection closed + # OR + # empty outbound buffer and no waiters + # OR + # empty outbound buffer and any waiter is ready + is_done = (lambda: + self._closed_result.ready or + (not self._impl.outbound_buffer and + (not waiters or any(ready() for ready in waiters)))) + + # Process I/O until our completion condition is satisified + while not is_done(): + self._impl.ioloop.poll() + self._impl.ioloop.process_timeouts() + + if self._open_error_result.ready or self._closed_result.ready: + try: + if not self._user_initiated_close: + if self._open_error_result.ready: + maybe_exception = self._open_error_result.value.error + LOGGER.error('Connection open failed - %r', + maybe_exception) + if isinstance(maybe_exception, Exception): + raise maybe_exception + else: + raise exceptions.ConnectionClosed(maybe_exception) + else: + result = self._closed_result.value + LOGGER.error('Connection close detected; result=%r', + result) + raise exceptions.ConnectionClosed(result.reason_code, + result.reason_text) + else: + LOGGER.info('Connection closed; result=%r', + self._closed_result.value) + finally: + self._cleanup() + + def _request_channel_dispatch(self, channel_number): + """Called by BlockingChannel instances to request a call to their + _dispatch_events method or to terminate `process_data_events`; + BlockingConnection will honor these requests from a safe context. + + :param int channel_number: positive channel number to request a call + to the channel's `_dispatch_events`; a negative channel number to + request termination of `process_data_events` + """ + self._channels_pending_dispatch.add(channel_number) + + def _dispatch_channel_events(self): + """Invoke the `_dispatch_events` method on open channels that requested + it + """ + if not self._channels_pending_dispatch: + return + + with self._acquire_event_dispatch() as dispatch_acquired: + if not dispatch_acquired: + # Nested dispatch or dispatch blocked higher in call stack + return + + candidates = list(self._channels_pending_dispatch) + self._channels_pending_dispatch.clear() + + for channel_number in candidates: + if channel_number < 0: + # This was meant to terminate process_data_events + continue + + try: + impl_channel = self._impl._channels[channel_number] + except KeyError: + continue + + if impl_channel.is_open: + impl_channel._get_cookie()._dispatch_events() + + def _on_timer_ready(self, evt): + """Handle expiry of a timer that was registered via `add_timeout` + + :param _TimerEvt evt: + + """ + self._ready_events.append(evt) + + def _on_threadsafe_callback(self, user_callback): + """Handle callback that was registered via `add_callback_threadsafe`. + + :param user_callback: callback passed to `add_callback_threadsafe` by + the application. + + """ + # Turn it into a 0-delay timeout to take advantage of our existing logic + # that deals with reentrancy + self.add_timeout(0, user_callback) + + + def _on_connection_blocked(self, user_callback, method_frame): + """Handle Connection.Blocked notification from RabbitMQ broker + + :param callable user_callback: callback_method passed to + `add_on_connection_blocked_callback` + :param pika.frame.Method method_frame: method frame having `method` + member of type `pika.spec.Connection.Blocked` + """ + self._ready_events.append( + _ConnectionBlockedEvt(user_callback, method_frame)) + + def _on_connection_unblocked(self, user_callback, method_frame): + """Handle Connection.Unblocked notification from RabbitMQ broker + + :param callable user_callback: callback_method passed to + `add_on_connection_unblocked_callback` + :param pika.frame.Method method_frame: method frame having `method` + member of type `pika.spec.Connection.Blocked` + """ + self._ready_events.append( + _ConnectionUnblockedEvt(user_callback, method_frame)) + + def _dispatch_connection_events(self): + """Dispatch ready connection events""" + if not self._ready_events: + return + + with self._acquire_event_dispatch() as dispatch_acquired: + if not dispatch_acquired: + # Nested dispatch or dispatch blocked higher in call stack + return + + # Limit dispatch to the number of currently ready events to avoid + # getting stuck in this loop + for _ in compat.xrange(len(self._ready_events)): + try: + evt = self._ready_events.popleft() + except IndexError: + # Some events (e.g., timers) must have been cancelled + break + + evt.dispatch() + + def add_on_connection_blocked_callback(self, callback_method): + """Add a callback to be notified when RabbitMQ has sent a + `Connection.Blocked` frame indicating that RabbitMQ is low on + resources. Publishers can use this to voluntarily suspend publishing, + instead of relying on back pressure throttling. The callback + will be passed the `Connection.Blocked` method frame. + + See also `ConnectionParameters.blocked_connection_timeout`. + + :param method callback_method: Callback to call on `Connection.Blocked`, + having the signature `callback_method(pika.frame.Method)`, where the + method frame's `method` member is of type + `pika.spec.Connection.Blocked` + + """ + self._impl.add_on_connection_blocked_callback( + functools.partial(self._on_connection_blocked, callback_method)) + + def add_on_connection_unblocked_callback(self, callback_method): + """Add a callback to be notified when RabbitMQ has sent a + `Connection.Unblocked` frame letting publishers know it's ok + to start publishing again. The callback will be passed the + `Connection.Unblocked` method frame. + + :param method callback_method: Callback to call on + `Connection.Unblocked`, having the signature + `callback_method(pika.frame.Method)`, where the method frame's + `method` member is of type `pika.spec.Connection.Unblocked` + + """ + self._impl.add_on_connection_unblocked_callback( + functools.partial(self._on_connection_unblocked, callback_method)) + + def add_timeout(self, deadline, callback_method): + """Create a single-shot timer to fire after deadline seconds. Do not + confuse with Tornado's timeout where you pass in the time you want to + have your callback called. Only pass in the seconds until it's to be + called. + + NOTE: the timer callbacks are dispatched only in the scope of + specially-designated methods: see + `BlockingConnection.process_data_events` and + `BlockingChannel.start_consuming`. + + :param float deadline: The number of seconds to wait to call callback + :param callable callback_method: The callback method with the signature + callback_method() + + :returns: opaque timer id + + """ + if not callable(callback_method): + raise ValueError( + 'callback_method parameter must be callable, but got %r' + % (callback_method,)) + + evt = _TimerEvt(callback=callback_method) + timer_id = self._impl.add_timeout( + deadline, + functools.partial(self._on_timer_ready, evt)) + evt.timer_id = timer_id + + return timer_id + + def add_callback_threadsafe(self, callback): + """Requests a call to the given function as soon as possible in the + context of this connection's thread. + + NOTE: This is the only thread-safe method in `BlockingConnection`. All + other manipulations of `BlockingConnection` must be performed from the + connection's thread. + + For example, a thread may request a call to the + `BlockingChannel.basic_ack` method of a `BlockingConnection` that is + running in a different thread via + + ``` + connection.add_callback_threadsafe( + functools.partial(channel.basic_ack, delivery_tag=...)) + ``` + + NOTE: if you know that the requester is running on the same thread as + the connection it is more efficient to use the + `BlockingConnection.add_timeout()` method with a deadline of 0. + + :param method callback: The callback method; must be callable + + """ + self._impl.add_callback_threadsafe( + functools.partial(self._on_threadsafe_callback, callback)) + + def remove_timeout(self, timeout_id): + """Remove a timer if it's still in the timeout stack + + :param timeout_id: The opaque timer id to remove + + """ + # Remove from the impl's timeout stack + self._impl.remove_timeout(timeout_id) + + # Remove from ready events, if the timer fired already + for i, evt in enumerate(self._ready_events): + if isinstance(evt, _TimerEvt) and evt.timer_id == timeout_id: + index_to_remove = i + break + else: + # Not found + return + + del self._ready_events[index_to_remove] + + def close(self, reply_code=200, reply_text='Normal shutdown'): + """Disconnect from RabbitMQ. If there are any open channels, it will + attempt to close them prior to fully disconnecting. Channels which + have active consumers will attempt to send a Basic.Cancel to RabbitMQ + to cleanly stop the delivery of messages prior to closing the channel. + + :param int reply_code: The code number for the close + :param str reply_text: The text reason for the close + + """ + if self.is_closed: + LOGGER.debug('Close called on closed connection (%s): %s', + reply_code, reply_text) + return + + LOGGER.info('Closing connection (%s): %s', reply_code, reply_text) + + self._user_initiated_close = True + + # Close channels that remain opened + for impl_channel in pika.compat.dictvalues(self._impl._channels): + channel = impl_channel._get_cookie() + if channel.is_open: + try: + channel.close(reply_code, reply_text) + except exceptions.ChannelClosed as exc: + # Log and suppress broker-closed channel + LOGGER.warning('Got ChannelClosed while closing channel ' + 'from connection.close: %r', exc) + + # Close the connection + self._impl.close(reply_code, reply_text) + + self._flush_output(self._closed_result.is_ready) + + def process_data_events(self, time_limit=0): + """Will make sure that data events are processed. Dispatches timer and + channel callbacks if not called from the scope of BlockingConnection or + BlockingChannel callback. Your app can block on this method. + + :param float time_limit: suggested upper bound on processing time in + seconds. The actual blocking time depends on the granularity of the + underlying ioloop. Zero means return as soon as possible. None means + there is no limit on processing time and the function will block + until I/O produces actionable events. Defaults to 0 for backward + compatibility. This parameter is NEW in pika 0.10.0. + """ + with self._acquire_event_dispatch() as dispatch_acquired: + # Check if we can actually process pending events + common_terminator = lambda: bool(dispatch_acquired and + (self._channels_pending_dispatch or self._ready_events)) + if time_limit is None: + self._flush_output(common_terminator) + else: + with _IoloopTimerContext(time_limit, self._impl) as timer: + self._flush_output(timer.is_ready, common_terminator) + + if self._ready_events: + self._dispatch_connection_events() + + if self._channels_pending_dispatch: + self._dispatch_channel_events() + + def sleep(self, duration): + """A safer way to sleep than calling time.sleep() directly that would + keep the adapter from ignoring frames sent from the broker. The + connection will "sleep" or block the number of seconds specified in + duration in small intervals. + + :param float duration: The time to sleep in seconds + + """ + assert duration >= 0, duration + + deadline = time.time() + duration + time_limit = duration + # Process events at least once + while True: + self.process_data_events(time_limit) + time_limit = deadline - time.time() + if time_limit <= 0: + break + + def channel(self, channel_number=None): + """Create a new channel with the next available channel number or pass + in a channel number to use. Must be non-zero if you would like to + specify but it is recommended that you let Pika manage the channel + numbers. + + :rtype: pika.adapters.blocking_connection.BlockingChannel + """ + with _CallbackResult(self._OnChannelOpenedArgs) as opened_args: + impl_channel = self._impl.channel( + on_open_callback=opened_args.set_value_once, + channel_number=channel_number) + + # Create our proxy channel + channel = BlockingChannel(impl_channel, self) + + # Link implementation channel with our proxy channel + impl_channel._set_cookie(channel) + + # Drive I/O until Channel.Open-ok + channel._flush_output(opened_args.is_ready) + + return channel + + def __enter__(self): + # Prepare `with` context + return self + + def __exit__(self, exc_type, value, traceback): + # Close connection after `with` context + self.close() + + # + # Connections state properties + # + + @property + def is_closed(self): + """ + Returns a boolean reporting the current connection state. + """ + return self._impl.is_closed + + @property + def is_closing(self): + """ + Returns True if connection is in the process of closing due to + client-initiated `close` request, but closing is not yet complete. + """ + return self._impl.is_closing + + @property + def is_open(self): + """ + Returns a boolean reporting the current connection state. + """ + return self._impl.is_open + + # + # Properties that reflect server capabilities for the current connection + # + + @property + def basic_nack_supported(self): + """Specifies if the server supports basic.nack on the active connection. + + :rtype: bool + + """ + return self._impl.basic_nack + + @property + def consumer_cancel_notify_supported(self): + """Specifies if the server supports consumer cancel notification on the + active connection. + + :rtype: bool + + """ + return self._impl.consumer_cancel_notify + + @property + def exchange_exchange_bindings_supported(self): + """Specifies if the active connection supports exchange to exchange + bindings. + + :rtype: bool + + """ + return self._impl.exchange_exchange_bindings + + @property + def publisher_confirms_supported(self): + """Specifies if the active connection can use publisher confirmations. + + :rtype: bool + + """ + return self._impl.publisher_confirms + + # Legacy property names for backward compatibility + basic_nack = basic_nack_supported + consumer_cancel_notify = consumer_cancel_notify_supported + exchange_exchange_bindings = exchange_exchange_bindings_supported + publisher_confirms = publisher_confirms_supported + + +class _ChannelPendingEvt(object): + """Base class for BlockingChannel pending events""" + pass + + +class _ConsumerDeliveryEvt(_ChannelPendingEvt): + """This event represents consumer message delivery `Basic.Deliver`; it + contains method, properties, and body of the delivered message. + """ + + __slots__ = ('method', 'properties', 'body') + + def __init__(self, method, properties, body): + """ + :param spec.Basic.Deliver method: NOTE: consumer_tag and delivery_tag + are valid only within source channel + :param spec.BasicProperties properties: message properties + :param body: message body; empty string if no body + :type body: str or unicode + """ + self.method = method + self.properties = properties + self.body = body + + +class _ConsumerCancellationEvt(_ChannelPendingEvt): + """This event represents server-initiated consumer cancellation delivered to + client via Basic.Cancel. After receiving Basic.Cancel, there will be no + further deliveries for the consumer identified by `consumer_tag` in + `Basic.Cancel` + """ + + __slots__ = ('method_frame',) + + def __init__(self, method_frame): + """ + :param pika.frame.Method method_frame: method frame with method of type + `spec.Basic.Cancel` + """ + self.method_frame = method_frame + + def __repr__(self): + return '<%s method_frame=%r>' % (self.__class__.__name__, + self.method_frame) + + @property + def method(self): + """method of type spec.Basic.Cancel""" + return self.method_frame.method + + +class _ReturnedMessageEvt(_ChannelPendingEvt): + """This event represents a message returned by broker via `Basic.Return`""" + + __slots__ = ('callback', 'channel', 'method', 'properties', 'body') + + def __init__(self, callback, channel, method, properties, body): + """ + :param callable callback: user's callback, having the signature + callback(channel, method, properties, body), where + channel: pika.Channel + method: pika.spec.Basic.Return + properties: pika.spec.BasicProperties + body: str, unicode, or bytes (python 3.x) + + :param pika.Channel channel: + :param pika.spec.Basic.Return method: + :param pika.spec.BasicProperties properties: + :param body: str, unicode, or bytes (python 3.x) + """ + self.callback = callback + self.channel = channel + self.method = method + self.properties = properties + self.body = body + + def __repr__(self): + return ('<%s callback=%r channel=%r method=%r properties=%r ' + 'body=%.300r>') % (self.__class__.__name__, self.callback, + self.channel, self.method, self.properties, + self.body) + + def dispatch(self): + """Dispatch user's callback""" + self.callback(self.channel, self.method, self.properties, self.body) + + +class ReturnedMessage(object): + """Represents a message returned via Basic.Return in publish-acknowledgments + mode + """ + + __slots__ = ('method', 'properties', 'body') + + def __init__(self, method, properties, body): + """ + :param spec.Basic.Return method: + :param spec.BasicProperties properties: message properties + :param body: message body; empty string if no body + :type body: str or unicode + """ + self.method = method + self.properties = properties + self.body = body + + +class _ConsumerInfo(object): + """Information about an active consumer""" + + __slots__ = ('consumer_tag', 'no_ack', 'consumer_cb', + 'alternate_event_sink', 'state') + + # Consumer states + SETTING_UP = 1 + ACTIVE = 2 + TEARING_DOWN = 3 + CANCELLED_BY_BROKER = 4 + + def __init__(self, consumer_tag, no_ack, consumer_cb=None, + alternate_event_sink=None): + """ + NOTE: exactly one of consumer_cb/alternate_event_sink musts be non-None. + + :param str consumer_tag: + :param bool no_ack: the no-ack value for the consumer + :param callable consumer_cb: The function for dispatching messages to + user, having the signature: + consumer_callback(channel, method, properties, body) + channel: BlockingChannel + method: spec.Basic.Deliver + properties: spec.BasicProperties + body: str or unicode + :param callable alternate_event_sink: if specified, _ConsumerDeliveryEvt + and _ConsumerCancellationEvt objects will be diverted to this + callback instead of being deposited in the channel's + `_pending_events` container. Signature: + alternate_event_sink(evt) + """ + assert (consumer_cb is None) != (alternate_event_sink is None), ( + 'exactly one of consumer_cb/alternate_event_sink must be non-None', + consumer_cb, alternate_event_sink) + self.consumer_tag = consumer_tag + self.no_ack = no_ack + self.consumer_cb = consumer_cb + self.alternate_event_sink = alternate_event_sink + self.state = self.SETTING_UP + + @property + def setting_up(self): + """True if in SETTING_UP state""" + return self.state == self.SETTING_UP + + @property + def active(self): + """True if in ACTIVE state""" + return self.state == self.ACTIVE + + @property + def tearing_down(self): + """True if in TEARING_DOWN state""" + return self.state == self.TEARING_DOWN + + @property + def cancelled_by_broker(self): + """True if in CANCELLED_BY_BROKER state""" + return self.state == self.CANCELLED_BY_BROKER + + +class _QueueConsumerGeneratorInfo(object): + """Container for information about the active queue consumer generator """ + __slots__ = ('params', 'consumer_tag', 'pending_events') + + def __init__(self, params, consumer_tag): + """ + :params tuple params: a three-tuple (queue, no_ack, exclusive) that were + used to create the queue consumer + :param str consumer_tag: consumer tag + """ + self.params = params + self.consumer_tag = consumer_tag + #self.messages = deque() + + # Holds pending events of types _ConsumerDeliveryEvt and + # _ConsumerCancellationEvt + self.pending_events = deque() + + def __repr__(self): + return '<%s params=%r consumer_tag=%r>' % ( + self.__class__.__name__, self.params, self.consumer_tag) + + +class BlockingChannel(object): + """The BlockingChannel implements blocking semantics for most things that + one would use callback-passing-style for with the + :py:class:`~pika.channel.Channel` class. In addition, + the `BlockingChannel` class implements a :term:`generator` that allows + you to :doc:`consume messages ` + without using callbacks. + + Example of creating a BlockingChannel:: + + import pika + + # Create our connection object + connection = pika.BlockingConnection() + + # The returned object will be a synchronous channel + channel = connection.channel() + + """ + + # Used as value_class with _CallbackResult for receiving Basic.GetOk args + _RxMessageArgs = namedtuple( + 'BlockingChannel__RxMessageArgs', + [ + 'channel', # implementation pika.Channel instance + 'method', # Basic.GetOk + 'properties', # pika.spec.BasicProperties + 'body' # str, unicode, or bytes (python 3.x) + ]) + + + # For use as value_class with any _CallbackResult that expects method_frame + # as the only arg + _MethodFrameCallbackResultArgs = namedtuple( + 'BlockingChannel__MethodFrameCallbackResultArgs', + 'method_frame') + + # Broker's basic-ack/basic-nack args when delivery confirmation is enabled; + # may concern a single or multiple messages + _OnMessageConfirmationReportArgs = namedtuple( + 'BlockingChannel__OnMessageConfirmationReportArgs', + 'method_frame') + + # Parameters for broker-initiated Channel.Close request: reply_code + # holds the broker's non-zero error code and reply_text holds the + # corresponding error message text. + _OnChannelClosedByBrokerArgs = namedtuple( + 'BlockingChannel__OnChannelClosedByBrokerArgs', + 'method_frame') + + # For use as value_class with _CallbackResult expecting Channel.Flow + # confirmation. + _FlowOkCallbackResultArgs = namedtuple( + 'BlockingChannel__FlowOkCallbackResultArgs', + 'active' # True if broker will start or continue sending; False if not + ) + + _CONSUMER_CANCELLED_CB_KEY = 'blocking_channel_consumer_cancelled' + + def __init__(self, channel_impl, connection): + """Create a new instance of the Channel + + :param channel_impl: Channel implementation object as returned from + SelectConnection.channel() + :param BlockingConnection connection: The connection object + + """ + self._impl = channel_impl + self._connection = connection + + # A mapping of consumer tags to _ConsumerInfo for active consumers + self._consumer_infos = dict() + + # Queue consumer generator generator info of type + # _QueueConsumerGeneratorInfo created by BlockingChannel.consume + self._queue_consumer_generator = None + + # Whether RabbitMQ delivery confirmation has been enabled + self._delivery_confirmation = False + + # Receives message delivery confirmation report (Basic.ack or + # Basic.nack) from broker when delivery confirmations are enabled + self._message_confirmation_result = _CallbackResult( + self._OnMessageConfirmationReportArgs) + + # deque of pending events: _ConsumerDeliveryEvt and + # _ConsumerCancellationEvt objects that will be returned by + # `BlockingChannel.get_event()` + self._pending_events = deque() + + # Holds a ReturnedMessage object representing a message received via + # Basic.Return in publisher-acknowledgments mode. + self._puback_return = None + + # Receives Basic.ConsumeOk reply from server + self._basic_consume_ok_result = _CallbackResult() + + # Receives the broker-inititated Channel.Close parameters + self._channel_closed_by_broker_result = _CallbackResult( + self._OnChannelClosedByBrokerArgs) + + # Receives args from Basic.GetEmpty response + # http://www.rabbitmq.com/amqp-0-9-1-reference.html#basic.get + self._basic_getempty_result = _CallbackResult( + self._MethodFrameCallbackResultArgs) + + self._impl.add_on_cancel_callback(self._on_consumer_cancelled_by_broker) + + self._impl.add_callback( + self._basic_consume_ok_result.signal_once, + replies=[pika.spec.Basic.ConsumeOk], + one_shot=False) + + self._impl.add_callback( + self._on_channel_closed, + replies=[pika.spec.Channel.Close], + one_shot=True) + + self._impl.add_callback( + self._basic_getempty_result.set_value_once, + replies=[pika.spec.Basic.GetEmpty], + one_shot=False) + + LOGGER.info("Created channel=%s", self.channel_number) + + def __int__(self): + """Return the channel object as its channel number + + NOTE: inherited from legacy BlockingConnection; might be error-prone; + use `channel_number` property instead. + + :rtype: int + + """ + return self.channel_number + + def __repr__(self): + return '<%s impl=%r>' % (self.__class__.__name__, self._impl) + + def __enter__(self): + return self + + def __exit__(self, exc_type, value, traceback): + try: + self.close() + except exceptions.ChannelClosed: + pass + + def _cleanup(self): + """Clean up members that might inhibit garbage collection""" + self._message_confirmation_result.reset() + self._pending_events = deque() + self._consumer_infos = dict() + + @property + def channel_number(self): + """Channel number""" + return self._impl.channel_number + + @property + def connection(self): + """The channel's BlockingConnection instance""" + return self._connection + + @property + def is_closed(self): + """Returns True if the channel is closed. + + :rtype: bool + + """ + return self._impl.is_closed + + @property + def is_closing(self): + """Returns True if client-initiated closing of the channel is in + progress. + + :rtype: bool + + """ + return self._impl.is_closing + + @property + def is_open(self): + """Returns True if the channel is open. + + :rtype: bool + + """ + return self._impl.is_open + + _ALWAYS_READY_WAITERS = ((lambda: True), ) + + def _flush_output(self, *waiters): + """ Flush output and process input while waiting for any of the given + callbacks to return true. The wait is aborted upon channel-close or + connection-close. + Otherwise, processing continues until the output is flushed AND at least + one of the callbacks returns true. If there are no callbacks, then + processing ends when all output is flushed. + + :param waiters: sequence of zero or more callables taking no args and + returning true when it's time to stop processing. + Their results are OR'ed together. + """ + if self.is_closed: + raise exceptions.ChannelClosed() + + if not waiters: + waiters = self._ALWAYS_READY_WAITERS + + self._connection._flush_output( + self._channel_closed_by_broker_result.is_ready, + *waiters) + + if self._channel_closed_by_broker_result: + # Channel was force-closed by broker + self._cleanup() + method = ( + self._channel_closed_by_broker_result.value.method_frame.method) + raise exceptions.ChannelClosed(method.reply_code, method.reply_text) + + def _on_puback_message_returned(self, channel, method, properties, body): + """Called as the result of Basic.Return from broker in + publisher-acknowledgements mode. Saves the info as a ReturnedMessage + instance in self._puback_return. + + :param pika.Channel channel: our self._impl channel + :param pika.spec.Basic.Return method: + :param pika.spec.BasicProperties properties: message properties + :param body: returned message body; empty string if no body + :type body: str, unicode + + """ + assert channel is self._impl, ( + channel.channel_number, self.channel_number) + + assert isinstance(method, pika.spec.Basic.Return), method + assert isinstance(properties, pika.spec.BasicProperties), ( + properties) + + LOGGER.warning( + "Published message was returned: _delivery_confirmation=%s; " + "channel=%s; method=%r; properties=%r; body_size=%d; " + "body_prefix=%.255r", self._delivery_confirmation, + channel.channel_number, method, properties, + len(body) if body is not None else None, body) + + self._puback_return = ReturnedMessage(method, properties, body) + + + def _add_pending_event(self, evt): + """Append an event to the channel's list of events that are ready for + dispatch to user and signal our connection that this channel is ready + for event dispatch + + :param _ChannelPendingEvt evt: an event derived from _ChannelPendingEvt + """ + self._pending_events.append(evt) + self.connection._request_channel_dispatch(self.channel_number) + + + def _on_channel_closed(self, method_frame): + """Called by impl when a channel is closed by the broker + via Channel.Close + + :param pika.Channel channel: channel closed by the + `spec.Channel.Close` method + :param int reply_code: The reply code sent via Channel.Close + :param str reply_text: The reply text sent via Channel.Close + + """ + LOGGER.debug('_on_channel_closed_by_broker %s', method_frame) + self._channel_closed_by_broker_result.set_value_once(method_frame) + channel_number = method_frame.channel_number + self.connection._request_channel_dispatch(-channel_number) + self._cleanup() + method = method_frame.method + raise exceptions.ChannelClosed(method.reply_code, + method.reply_text) + + def _on_consumer_cancelled_by_broker(self, method_frame): + """Called by impl when broker cancels consumer via Basic.Cancel. + + This is a RabbitMQ-specific feature. The circumstances include deletion + of queue being consumed as well as failure of a HA node responsible for + the queue being consumed. + + :param pika.frame.Method method_frame: method frame with the + `spec.Basic.Cancel` method + + """ + evt = _ConsumerCancellationEvt(method_frame) + + consumer = self._consumer_infos[method_frame.method.consumer_tag] + + # Don't interfere with client-initiated cancellation flow + if not consumer.tearing_down: + consumer.state = _ConsumerInfo.CANCELLED_BY_BROKER + + if consumer.alternate_event_sink is not None: + consumer.alternate_event_sink(evt) + else: + self._add_pending_event(evt) + + def _on_consumer_message_delivery(self, _channel, method, properties, body): + """Called by impl when a message is delivered for a consumer + + :param Channel channel: The implementation channel object + :param spec.Basic.Deliver method: + :param pika.spec.BasicProperties properties: message properties + :param body: delivered message body; empty string if no body + :type body: str, unicode, or bytes (python 3.x) + + """ + evt = _ConsumerDeliveryEvt(method, properties, body) + + consumer = self._consumer_infos[method.consumer_tag] + + if consumer.alternate_event_sink is not None: + consumer.alternate_event_sink(evt) + else: + self._add_pending_event(evt) + + def _on_consumer_generator_event(self, evt): + """Sink for the queue consumer generator's consumer events; append the + event to queue consumer generator's pending events buffer. + + :param evt: an object of type _ConsumerDeliveryEvt or + _ConsumerCancellationEvt + """ + self._queue_consumer_generator.pending_events.append(evt) + # Schedule termination of connection.process_data_events using a + # negative channel number + self.connection._request_channel_dispatch(-self.channel_number) + + def _cancel_all_consumers(self): + """Cancel all consumers. + + NOTE: pending non-ackable messages will be lost; pending ackable + messages will be rejected. + + """ + if self._consumer_infos: + LOGGER.debug('Cancelling %i consumers', len(self._consumer_infos)) + + if self._queue_consumer_generator is not None: + # Cancel queue consumer generator + self.cancel() + + # Cancel consumers created via basic_consume + for consumer_tag in pika.compat.dictkeys(self._consumer_infos): + self.basic_cancel(consumer_tag) + + def _dispatch_events(self): + """Called by BlockingConnection to dispatch pending events. + + `BlockingChannel` schedules this callback via + `BlockingConnection._request_channel_dispatch` + """ + while self._pending_events: + evt = self._pending_events.popleft() + + if type(evt) is _ConsumerDeliveryEvt: + consumer_info = self._consumer_infos[evt.method.consumer_tag] + consumer_info.consumer_cb(self, evt.method, evt.properties, + evt.body) + + elif type(evt) is _ConsumerCancellationEvt: + del self._consumer_infos[evt.method_frame.method.consumer_tag] + + self._impl.callbacks.process(self.channel_number, + self._CONSUMER_CANCELLED_CB_KEY, + self, + evt.method_frame) + else: + evt.dispatch() + + + def close(self, reply_code=0, reply_text="Normal shutdown"): + """Will invoke a clean shutdown of the channel with the AMQP Broker. + + :param int reply_code: The reply code to close the channel with + :param str reply_text: The reply text to close the channel with + + """ + LOGGER.debug('Channel.close(%s, %s)', reply_code, reply_text) + + # Cancel remaining consumers + self._cancel_all_consumers() + + # Close the channel + try: + with _CallbackResult() as close_ok_result: + self._impl.add_callback(callback=close_ok_result.signal_once, + replies=[pika.spec.Channel.CloseOk], + one_shot=True) + + self._impl.close(reply_code=reply_code, reply_text=reply_text) + self._flush_output(close_ok_result.is_ready) + finally: + self._cleanup() + + def flow(self, active): + """Turn Channel flow control off and on. + + NOTE: RabbitMQ doesn't support active=False; per + https://www.rabbitmq.com/specification.html: "active=false is not + supported by the server. Limiting prefetch with basic.qos provides much + better control" + + For more information, please reference: + + http://www.rabbitmq.com/amqp-0-9-1-reference.html#channel.flow + + :param bool active: Turn flow on (True) or off (False) + + :returns: True if broker will start or continue sending; False if not + :rtype: bool + + """ + with _CallbackResult(self._FlowOkCallbackResultArgs) as flow_ok_result: + self._impl.flow(callback=flow_ok_result.set_value_once, + active=active) + self._flush_output(flow_ok_result.is_ready) + return flow_ok_result.value.active + + def add_on_cancel_callback(self, callback): + """Pass a callback function that will be called when Basic.Cancel + is sent by the broker. The callback function should receive a method + frame parameter. + + :param callable callback: a callable for handling broker's Basic.Cancel + notification with the call signature: callback(method_frame) + where method_frame is of type `pika.frame.Method` with method of + type `spec.Basic.Cancel` + + """ + self._impl.callbacks.add(self.channel_number, + self._CONSUMER_CANCELLED_CB_KEY, + callback, + one_shot=False) + + def add_on_return_callback(self, callback): + """Pass a callback function that will be called when a published + message is rejected and returned by the server via `Basic.Return`. + + :param callable callback: The method to call on callback with the + signature callback(channel, method, properties, body), where + channel: pika.Channel + method: pika.spec.Basic.Return + properties: pika.spec.BasicProperties + body: str, unicode, or bytes (python 3.x) + + """ + self._impl.add_on_return_callback( + lambda _channel, method, properties, body: ( + self._add_pending_event( + _ReturnedMessageEvt( + callback, self, method, properties, body)))) + + def basic_consume(self, + consumer_callback, + queue, + no_ack=False, + exclusive=False, + consumer_tag=None, + arguments=None): + """Sends the AMQP command Basic.Consume to the broker and binds messages + for the consumer_tag to the consumer callback. If you do not pass in + a consumer_tag, one will be automatically generated for you. Returns + the consumer tag. + + NOTE: the consumer callbacks are dispatched only in the scope of + specially-designated methods: see + `BlockingConnection.process_data_events` and + `BlockingChannel.start_consuming`. + + For more information about Basic.Consume, see: + http://www.rabbitmq.com/amqp-0-9-1-reference.html#basic.consume + + :param callable consumer_callback: The function for dispatching messages + to user, having the signature: + consumer_callback(channel, method, properties, body) + channel: BlockingChannel + method: spec.Basic.Deliver + properties: spec.BasicProperties + body: str or unicode + :param queue: The queue to consume from + :type queue: str or unicode + :param bool no_ack: Tell the broker to not expect a response (i.e., + no ack/nack) + :param bool exclusive: Don't allow other consumers on the queue + :param consumer_tag: You may specify your own consumer tag; if left + empty, a consumer tag will be generated automatically + :type consumer_tag: str or unicode + :param dict arguments: Custom key/value pair arguments for the consumer + :returns: consumer tag + :rtype: str + + :raises pika.exceptions.DuplicateConsumerTag: if consumer with given + consumer_tag is already present. + + """ + if not callable(consumer_callback): + raise ValueError('consumer callback must be callable; got %r' + % consumer_callback) + + return self._basic_consume_impl( + queue=queue, + no_ack=no_ack, + exclusive=exclusive, + consumer_tag=consumer_tag, + arguments=arguments, + consumer_callback=consumer_callback) + + def _basic_consume_impl(self, + queue, + no_ack, + exclusive, + consumer_tag, + arguments=None, + consumer_callback=None, + alternate_event_sink=None): + """The low-level implementation used by `basic_consume` and `consume`. + See `basic_consume` docstring for more info. + + NOTE: exactly one of consumer_callback/alternate_event_sink musts be + non-None. + + This method has one additional parameter alternate_event_sink over the + args described in `basic_consume`. + + :param callable alternate_event_sink: if specified, _ConsumerDeliveryEvt + and _ConsumerCancellationEvt objects will be diverted to this + callback instead of being deposited in the channel's + `_pending_events` container. Signature: + alternate_event_sink(evt) + + :raises pika.exceptions.DuplicateConsumerTag: if consumer with given + consumer_tag is already present. + + """ + if (consumer_callback is None) == (alternate_event_sink is None): + raise ValueError( + ('exactly one of consumer_callback/alternate_event_sink must ' + 'be non-None', consumer_callback, alternate_event_sink)) + + if not consumer_tag: + # Need a consumer tag to register consumer info before sending + # request to broker, because I/O might dispatch incoming messages + # immediately following Basic.Consume-ok before _flush_output + # returns + consumer_tag = self._impl._generate_consumer_tag() + + if consumer_tag in self._consumer_infos: + raise exceptions.DuplicateConsumerTag(consumer_tag) + + # Create new consumer + self._consumer_infos[consumer_tag] = _ConsumerInfo( + consumer_tag, + no_ack=no_ack, + consumer_cb=consumer_callback, + alternate_event_sink=alternate_event_sink) + + try: + with self._basic_consume_ok_result as ok_result: + tag = self._impl.basic_consume( + consumer_callback=self._on_consumer_message_delivery, + queue=queue, + no_ack=no_ack, + exclusive=exclusive, + consumer_tag=consumer_tag, + arguments=arguments) + + assert tag == consumer_tag, (tag, consumer_tag) + + self._flush_output(ok_result.is_ready) + except Exception: + # If channel was closed, self._consumer_infos will be empty + if consumer_tag in self._consumer_infos: + del self._consumer_infos[consumer_tag] + # Schedule termination of connection.process_data_events using a + # negative channel number + self.connection._request_channel_dispatch(-self.channel_number) + raise + + # NOTE: Consumer could get cancelled by broker immediately after opening + # (e.g., queue getting deleted externally) + if self._consumer_infos[consumer_tag].setting_up: + self._consumer_infos[consumer_tag].state = _ConsumerInfo.ACTIVE + + return consumer_tag + + def basic_cancel(self, consumer_tag): + """This method cancels a consumer. This does not affect already + delivered messages, but it does mean the server will not send any more + messages for that consumer. The client may receive an arbitrary number + of messages in between sending the cancel method and receiving the + cancel-ok reply. + + NOTE: When cancelling a no_ack=False consumer, this implementation + automatically Nacks and suppresses any incoming messages that have not + yet been dispatched to the consumer's callback. However, when cancelling + a no_ack=True consumer, this method will return any pending messages + that arrived before broker confirmed the cancellation. + + :param str consumer_tag: Identifier for the consumer; the result of + passing a consumer_tag that was created on another channel is + undefined (bad things will happen) + + :returns: (NEW IN pika 0.10.0) empty sequence for a no_ack=False + consumer; for a no_ack=True consumer, returns a (possibly empty) + sequence of pending messages that arrived before broker confirmed + the cancellation (this is done instead of via consumer's callback in + order to prevent reentrancy/recursion. Each message is four-tuple: + (channel, method, properties, body) + channel: BlockingChannel + method: spec.Basic.Deliver + properties: spec.BasicProperties + body: str or unicode + """ + try: + consumer_info = self._consumer_infos[consumer_tag] + except KeyError: + LOGGER.warning( + "User is attempting to cancel an unknown consumer=%s; " + "already cancelled by user or broker?", consumer_tag) + return [] + + try: + # Assertion failure here is most likely due to reentrance + assert consumer_info.active or consumer_info.cancelled_by_broker, ( + consumer_info.state) + + # Assertion failure here signals disconnect between consumer state + # in BlockingChannel and Channel + assert (consumer_info.cancelled_by_broker or + consumer_tag in self._impl._consumers), consumer_tag + + no_ack = consumer_info.no_ack + + consumer_info.state = _ConsumerInfo.TEARING_DOWN + + with _CallbackResult() as cancel_ok_result: + # Nack pending messages for no_ack=False consumer + if not no_ack: + pending_messages = self._remove_pending_deliveries( + consumer_tag) + if pending_messages: + # NOTE: we use impl's basic_reject to avoid the + # possibility of redelivery before basic_cancel takes + # control of nacking. + # NOTE: we can't use basic_nack with the multiple option + # to avoid nacking messages already held by our client. + for message in pending_messages: + self._impl.basic_reject(message.method.delivery_tag, + requeue=True) + + # Cancel the consumer; impl takes care of rejecting any + # additional deliveries that arrive for a no_ack=False + # consumer + self._impl.basic_cancel( + callback=cancel_ok_result.signal_once, + consumer_tag=consumer_tag, + nowait=False) + + # Flush output and wait for Basic.Cancel-ok or + # broker-initiated Basic.Cancel + self._flush_output( + cancel_ok_result.is_ready, + lambda: consumer_tag not in self._impl._consumers) + + if no_ack: + # Return pending messages for no_ack=True consumer + return [ + (evt.method, evt.properties, evt.body) + for evt in self._remove_pending_deliveries(consumer_tag)] + else: + # impl takes care of rejecting any incoming deliveries during + # cancellation + messages = self._remove_pending_deliveries(consumer_tag) + assert not messages, messages + + return [] + finally: + # NOTE: The entry could be purged if channel or connection closes + if consumer_tag in self._consumer_infos: + del self._consumer_infos[consumer_tag] + # Schedule termination of connection.process_data_events using a + # negative channel number + self.connection._request_channel_dispatch(-self.channel_number) + + def _remove_pending_deliveries(self, consumer_tag): + """Extract _ConsumerDeliveryEvt objects destined for the given consumer + from pending events, discarding the _ConsumerCancellationEvt, if any + + :param str consumer_tag: + + :returns: a (possibly empty) sequence of _ConsumerDeliveryEvt destined + for the given consumer tag + """ + remaining_events = deque() + unprocessed_messages = [] + while self._pending_events: + evt = self._pending_events.popleft() + if type(evt) is _ConsumerDeliveryEvt: + if evt.method.consumer_tag == consumer_tag: + unprocessed_messages.append(evt) + continue + if type(evt) is _ConsumerCancellationEvt: + if evt.method_frame.method.consumer_tag == consumer_tag: + # A broker-initiated Basic.Cancel must have arrived + # before our cancel request completed + continue + + remaining_events.append(evt) + + self._pending_events = remaining_events + + return unprocessed_messages + + def start_consuming(self): + """Processes I/O events and dispatches timers and `basic_consume` + callbacks until all consumers are cancelled. + + NOTE: this blocking function may not be called from the scope of a + pika callback, because dispatching `basic_consume` callbacks from this + context would constitute recursion. + + :raises pika.exceptions.RecursionError: if called from the scope of a + `BlockingConnection` or `BlockingChannel` callback + + """ + # Check if called from the scope of an event dispatch callback + with self.connection._acquire_event_dispatch() as dispatch_allowed: + if not dispatch_allowed: + raise exceptions.RecursionError( + 'start_consuming may not be called from the scope of ' + 'another BlockingConnection or BlockingChannel callback') + + # Process events as long as consumers exist on this channel + while self._consumer_infos: + self.connection.process_data_events(time_limit=None) + + def stop_consuming(self, consumer_tag=None): + """ Cancels all consumers, signalling the `start_consuming` loop to + exit. + + NOTE: pending non-ackable messages will be lost; pending ackable + messages will be rejected. + + """ + if consumer_tag: + self.basic_cancel(consumer_tag) + else: + self._cancel_all_consumers() + + def consume(self, queue, no_ack=False, + exclusive=False, arguments=None, + inactivity_timeout=None): + """Blocking consumption of a queue instead of via a callback. This + method is a generator that yields each message as a tuple of method, + properties, and body. The active generator iterator terminates when the + consumer is cancelled by client via `BlockingChannel.cancel()` or by + broker. + + Example: + + for method, properties, body in channel.consume('queue'): + print body + channel.basic_ack(method.delivery_tag) + + You should call `BlockingChannel.cancel()` when you escape out of the + generator loop. + + If you don't cancel this consumer, then next call on the same channel + to `consume()` with the exact same (queue, no_ack, exclusive) parameters + will resume the existing consumer generator; however, calling with + different parameters will result in an exception. + + :param queue: The queue name to consume + :type queue: str or unicode + :param bool no_ack: Tell the broker to not expect a ack/nack response + :param bool exclusive: Don't allow other consumers on the queue + :param dict arguments: Custom key/value pair arguments for the consumer + :param float inactivity_timeout: if a number is given (in + seconds), will cause the method to yield (None, None, None) after the + given period of inactivity; this permits for pseudo-regular maintenance + activities to be carried out by the user while waiting for messages + to arrive. If None is given (default), then the method blocks until + the next event arrives. NOTE that timing granularity is limited by + the timer resolution of the underlying implementation. + NEW in pika 0.10.0. + + :yields: tuple(spec.Basic.Deliver, spec.BasicProperties, str or unicode) + + :raises ValueError: if consumer-creation parameters don't match those + of the existing queue consumer generator, if any. + NEW in pika 0.10.0 + """ + params = (queue, no_ack, exclusive) + + if self._queue_consumer_generator is not None: + if params != self._queue_consumer_generator.params: + raise ValueError( + 'Consume with different params not allowed on existing ' + 'queue consumer generator; previous params: %r; ' + 'new params: %r' + % (self._queue_consumer_generator.params, + (queue, no_ack, exclusive))) + else: + LOGGER.debug('Creating new queue consumer generator; params: %r', + params) + # Need a consumer tag to register consumer info before sending + # request to broker, because I/O might pick up incoming messages + # in addition to Basic.Consume-ok + consumer_tag = self._impl._generate_consumer_tag() + + self._queue_consumer_generator = _QueueConsumerGeneratorInfo( + params, + consumer_tag) + + try: + self._basic_consume_impl( + queue=queue, + no_ack=no_ack, + exclusive=exclusive, + consumer_tag=consumer_tag, + arguments=arguments, + alternate_event_sink=self._on_consumer_generator_event) + except Exception: + self._queue_consumer_generator = None + raise + + LOGGER.info('Created new queue consumer generator %r', + self._queue_consumer_generator) + + while self._queue_consumer_generator is not None: + if self._queue_consumer_generator.pending_events: + evt = self._queue_consumer_generator.pending_events.popleft() + if type(evt) is _ConsumerCancellationEvt: + # Consumer was cancelled by broker + self._queue_consumer_generator = None + break + else: + yield (evt.method, evt.properties, evt.body) + continue + + # Wait for a message to arrive + if inactivity_timeout is None: + self.connection.process_data_events(time_limit=None) + continue + + # Wait with inactivity timeout + wait_start_time = time.time() + wait_deadline = wait_start_time + inactivity_timeout + delta = inactivity_timeout + + while (self._queue_consumer_generator is not None and + not self._queue_consumer_generator.pending_events): + self.connection.process_data_events(time_limit=delta) + + if not self._queue_consumer_generator: + # Consumer was cancelled by client + break + + if self._queue_consumer_generator.pending_events: + # Got message(s) + break + + delta = wait_deadline - time.time() + if delta <= 0.0: + # Signal inactivity timeout + yield (None, None, None) + break + + def get_waiting_message_count(self): + """Returns the number of messages that may be retrieved from the current + queue consumer generator via `BlockingChannel.consume` without blocking. + NEW in pika 0.10.0 + + :rtype: int + """ + if self._queue_consumer_generator is not None: + pending_events = self._queue_consumer_generator.pending_events + count = len(pending_events) + if count and type(pending_events[-1]) is _ConsumerCancellationEvt: + count -= 1 + else: + count = 0 + + return count + + def cancel(self): + """Cancel the queue consumer created by `BlockingChannel.consume`, + rejecting all pending ackable messages. + + NOTE: If you're looking to cancel a consumer issued with + BlockingChannel.basic_consume then you should call + BlockingChannel.basic_cancel. + + :return int: The number of messages requeued by Basic.Nack. + NEW in 0.10.0: returns 0 + + """ + if self._queue_consumer_generator is None: + LOGGER.warning('cancel: queue consumer generator is inactive ' + '(already cancelled by client or broker?)') + return 0 + + try: + _, no_ack, _ = self._queue_consumer_generator.params + if not no_ack: + # Reject messages held by queue consumer generator; NOTE: we + # can't use basic_nack with the multiple option to avoid nacking + # messages already held by our client. + pending_events = self._queue_consumer_generator.pending_events + for _ in compat.xrange(self.get_waiting_message_count()): + evt = pending_events.popleft() + self._impl.basic_reject(evt.method.delivery_tag, + requeue=True) + + self.basic_cancel(self._queue_consumer_generator.consumer_tag) + finally: + self._queue_consumer_generator = None + + # Return 0 for compatibility with legacy implementation; the number of + # nacked messages is not meaningful since only messages consumed with + # no_ack=False may be nacked, and those arriving after calling + # basic_cancel will be rejected automatically by impl channel, so we'll + # never know how many of those were nacked. + return 0 + + def basic_ack(self, delivery_tag=0, multiple=False): + """Acknowledge one or more messages. When sent by the client, this + method acknowledges one or more messages delivered via the Deliver or + Get-Ok methods. When sent by server, this method acknowledges one or + more messages published with the Publish method on a channel in + confirm mode. The acknowledgement can be for a single message or a + set of messages up to and including a specific message. + + :param int delivery-tag: The server-assigned delivery tag + :param bool multiple: If set to True, the delivery tag is treated as + "up to and including", so that multiple messages + can be acknowledged with a single method. If set + to False, the delivery tag refers to a single + message. If the multiple field is 1, and the + delivery tag is zero, this indicates + acknowledgement of all outstanding messages. + """ + self._impl.basic_ack(delivery_tag=delivery_tag, multiple=multiple) + self._flush_output() + + def basic_nack(self, delivery_tag=None, multiple=False, requeue=True): + """This method allows a client to reject one or more incoming messages. + It can be used to interrupt and cancel large incoming messages, or + return untreatable messages to their original queue. + + :param int delivery-tag: The server-assigned delivery tag + :param bool multiple: If set to True, the delivery tag is treated as + "up to and including", so that multiple messages + can be acknowledged with a single method. If set + to False, the delivery tag refers to a single + message. If the multiple field is 1, and the + delivery tag is zero, this indicates + acknowledgement of all outstanding messages. + :param bool requeue: If requeue is true, the server will attempt to + requeue the message. If requeue is false or the + requeue attempt fails the messages are discarded or + dead-lettered. + + """ + self._impl.basic_nack(delivery_tag=delivery_tag, multiple=multiple, + requeue=requeue) + self._flush_output() + + def basic_get(self, queue=None, no_ack=False): + """Get a single message from the AMQP broker. Returns a sequence with + the method frame, message properties, and body. + + :param queue: Name of queue to get a message from + :type queue: str or unicode + :param bool no_ack: Tell the broker to not expect a reply + :returns: a three-tuple; (None, None, None) if the queue was empty; + otherwise (method, properties, body); NOTE: body may be None + :rtype: (None, None, None)|(spec.Basic.GetOk, + spec.BasicProperties, + str or unicode or None) + """ + assert not self._basic_getempty_result + # NOTE: nested with for python 2.6 compatibility + with _CallbackResult(self._RxMessageArgs) as get_ok_result: + with self._basic_getempty_result: + self._impl.basic_get(callback=get_ok_result.set_value_once, + queue=queue, + no_ack=no_ack) + self._flush_output(get_ok_result.is_ready, + self._basic_getempty_result.is_ready) + if get_ok_result: + evt = get_ok_result.value + return evt.method, evt.properties, evt.body + else: + assert self._basic_getempty_result, ( + "wait completed without GetOk and GetEmpty") + return None, None, None + + def basic_publish(self, exchange, routing_key, body, + properties=None, mandatory=False, immediate=False): + """Publish to the channel with the given exchange, routing key and body. + Returns a boolean value indicating the success of the operation. + + This is the legacy BlockingChannel method for publishing. See also + `BlockingChannel.publish` that provides more information about failures. + + For more information on basic_publish and what the parameters do, see: + + http://www.rabbitmq.com/amqp-0-9-1-reference.html#basic.publish + + NOTE: mandatory and immediate may be enabled even without delivery + confirmation, but in the absence of delivery confirmation the + synchronous implementation has no way to know how long to wait for + the Basic.Return or lack thereof. + + :param exchange: The exchange to publish to + :type exchange: str or unicode + :param routing_key: The routing key to bind on + :type routing_key: str or unicode + :param body: The message body; empty string if no body + :type body: str or unicode + :param pika.spec.BasicProperties properties: message properties + :param bool mandatory: The mandatory flag + :param bool immediate: The immediate flag + + :returns: True if delivery confirmation is not enabled (NEW in pika + 0.10.0); otherwise returns False if the message could not be + delivered (Basic.nack and/or Basic.Return) and True if the message + was delivered (Basic.ack and no Basic.Return) + """ + try: + self.publish(exchange, routing_key, body, properties, + mandatory, immediate) + except (exceptions.NackError, exceptions.UnroutableError): + return False + else: + return True + + def publish(self, exchange, routing_key, body, + properties=None, mandatory=False, immediate=False): + """Publish to the channel with the given exchange, routing key, and + body. Unlike the legacy `BlockingChannel.basic_publish`, this method + provides more information about failures via exceptions. + + For more information on basic_publish and what the parameters do, see: + + http://www.rabbitmq.com/amqp-0-9-1-reference.html#basic.publish + + NOTE: mandatory and immediate may be enabled even without delivery + confirmation, but in the absence of delivery confirmation the + synchronous implementation has no way to know how long to wait for + the Basic.Return. + + :param exchange: The exchange to publish to + :type exchange: str or unicode + :param routing_key: The routing key to bind on + :type routing_key: str or unicode + :param body: The message body; empty string if no body + :type body: str or unicode + :param pika.spec.BasicProperties properties: message properties + :param bool mandatory: The mandatory flag + :param bool immediate: The immediate flag + + :raises UnroutableError: raised when a message published in + publisher-acknowledgments mode (see + `BlockingChannel.confirm_delivery`) is returned via `Basic.Return` + followed by `Basic.Ack`. + :raises NackError: raised when a message published in + publisher-acknowledgements mode is Nack'ed by the broker. See + `BlockingChannel.confirm_delivery`. + + """ + if self._delivery_confirmation: + # In publisher-acknowledgments mode + with self._message_confirmation_result: + self._impl.basic_publish(exchange=exchange, + routing_key=routing_key, + body=body, + properties=properties, + mandatory=mandatory, + immediate=immediate) + + self._flush_output(self._message_confirmation_result.is_ready) + conf_method = (self._message_confirmation_result.value + .method_frame + .method) + + if isinstance(conf_method, pika.spec.Basic.Nack): + # Broker was unable to process the message due to internal + # error + LOGGER.warning( + "Message was Nack'ed by broker: nack=%r; channel=%s; " + "exchange=%s; routing_key=%s; mandatory=%r; " + "immediate=%r", conf_method, self.channel_number, + exchange, routing_key, mandatory, immediate) + if self._puback_return is not None: + returned_messages = [self._puback_return] + self._puback_return = None + else: + returned_messages = [] + raise exceptions.NackError(returned_messages) + + else: + assert isinstance(conf_method, pika.spec.Basic.Ack), ( + conf_method) + + if self._puback_return is not None: + # Unroutable message was returned + messages = [self._puback_return] + self._puback_return = None + raise exceptions.UnroutableError(messages) + else: + # In non-publisher-acknowledgments mode + self._impl.basic_publish(exchange=exchange, + routing_key=routing_key, + body=body, + properties=properties, + mandatory=mandatory, + immediate=immediate) + self._flush_output() + + def basic_qos(self, prefetch_size=0, prefetch_count=0, all_channels=False): + """Specify quality of service. This method requests a specific quality + of service. The QoS can be specified for the current channel or for all + channels on the connection. The client can request that messages be sent + in advance so that when the client finishes processing a message, the + following message is already held locally, rather than needing to be + sent down the channel. Prefetching gives a performance improvement. + + :param int prefetch_size: This field specifies the prefetch window + size. The server will send a message in + advance if it is equal to or smaller in size + than the available prefetch size (and also + falls into other prefetch limits). May be set + to zero, meaning "no specific limit", + although other prefetch limits may still + apply. The prefetch-size is ignored if the + no-ack option is set in the consumer. + :param int prefetch_count: Specifies a prefetch window in terms of whole + messages. This field may be used in + combination with the prefetch-size field; a + message will only be sent in advance if both + prefetch windows (and those at the channel + and connection level) allow it. The + prefetch-count is ignored if the no-ack + option is set in the consumer. + :param bool all_channels: Should the QoS apply to all channels + + """ + with _CallbackResult() as qos_ok_result: + self._impl.basic_qos(callback=qos_ok_result.signal_once, + prefetch_size=prefetch_size, + prefetch_count=prefetch_count, + all_channels=all_channels) + self._flush_output(qos_ok_result.is_ready) + + def basic_recover(self, requeue=False): + """This method asks the server to redeliver all unacknowledged messages + on a specified channel. Zero or more messages may be redelivered. This + method replaces the asynchronous Recover. + + :param bool requeue: If False, the message will be redelivered to the + original recipient. If True, the server will + attempt to requeue the message, potentially then + delivering it to an alternative subscriber. + + """ + with _CallbackResult() as recover_ok_result: + self._impl.basic_recover(callback=recover_ok_result.signal_once, + requeue=requeue) + self._flush_output(recover_ok_result.is_ready) + + def basic_reject(self, delivery_tag=None, requeue=True): + """Reject an incoming message. This method allows a client to reject a + message. It can be used to interrupt and cancel large incoming messages, + or return untreatable messages to their original queue. + + :param int delivery-tag: The server-assigned delivery tag + :param bool requeue: If requeue is true, the server will attempt to + requeue the message. If requeue is false or the + requeue attempt fails the messages are discarded or + dead-lettered. + + """ + self._impl.basic_reject(delivery_tag=delivery_tag, requeue=requeue) + self._flush_output() + + def confirm_delivery(self): + """Turn on RabbitMQ-proprietary Confirm mode in the channel. + + For more information see: + http://www.rabbitmq.com/extensions.html#confirms + """ + if self._delivery_confirmation: + LOGGER.error('confirm_delivery: confirmation was already enabled ' + 'on channel=%s', self.channel_number) + return + + with _CallbackResult() as select_ok_result: + self._impl.add_callback(callback=select_ok_result.signal_once, + replies=[pika.spec.Confirm.SelectOk], + one_shot=True) + + self._impl.confirm_delivery( + callback=self._message_confirmation_result.set_value_once, + nowait=False) + + self._flush_output(select_ok_result.is_ready) + + self._delivery_confirmation = True + + # Unroutable messages returned after this point will be in the context + # of publisher acknowledgments + self._impl.add_on_return_callback(self._on_puback_message_returned) + + def exchange_declare(self, exchange=None, + exchange_type='direct', passive=False, durable=False, + auto_delete=False, internal=False, + arguments=None): + """This method creates an exchange if it does not already exist, and if + the exchange exists, verifies that it is of the correct and expected + class. + + If passive set, the server will reply with Declare-Ok if the exchange + already exists with the same name, and raise an error if not and if the + exchange does not already exist, the server MUST raise a channel + exception with reply code 404 (not found). + + :param exchange: The exchange name consists of a non-empty sequence of + these characters: letters, digits, hyphen, underscore, + period, or colon. + :type exchange: str or unicode + :param str exchange_type: The exchange type to use + :param bool passive: Perform a declare or just check to see if it exists + :param bool durable: Survive a reboot of RabbitMQ + :param bool auto_delete: Remove when no more queues are bound to it + :param bool internal: Can only be published to by other exchanges + :param dict arguments: Custom key/value pair arguments for the exchange + + :returns: Method frame from the Exchange.Declare-ok response + :rtype: `pika.frame.Method` having `method` attribute of type + `spec.Exchange.DeclareOk` + + """ + with _CallbackResult( + self._MethodFrameCallbackResultArgs) as declare_ok_result: + self._impl.exchange_declare( + callback=declare_ok_result.set_value_once, + exchange=exchange, + exchange_type=exchange_type, + passive=passive, + durable=durable, + auto_delete=auto_delete, + internal=internal, + nowait=False, + arguments=arguments) + + self._flush_output(declare_ok_result.is_ready) + return declare_ok_result.value.method_frame + + def exchange_delete(self, exchange=None, if_unused=False): + """Delete the exchange. + + :param exchange: The exchange name + :type exchange: str or unicode + :param bool if_unused: only delete if the exchange is unused + + :returns: Method frame from the Exchange.Delete-ok response + :rtype: `pika.frame.Method` having `method` attribute of type + `spec.Exchange.DeleteOk` + + """ + with _CallbackResult( + self._MethodFrameCallbackResultArgs) as delete_ok_result: + self._impl.exchange_delete( + callback=delete_ok_result.set_value_once, + exchange=exchange, + if_unused=if_unused, + nowait=False) + + self._flush_output(delete_ok_result.is_ready) + return delete_ok_result.value.method_frame + + def exchange_bind(self, destination=None, source=None, routing_key='', + arguments=None): + """Bind an exchange to another exchange. + + :param destination: The destination exchange to bind + :type destination: str or unicode + :param source: The source exchange to bind to + :type source: str or unicode + :param routing_key: The routing key to bind on + :type routing_key: str or unicode + :param dict arguments: Custom key/value pair arguments for the binding + + :returns: Method frame from the Exchange.Bind-ok response + :rtype: `pika.frame.Method` having `method` attribute of type + `spec.Exchange.BindOk` + + """ + with _CallbackResult(self._MethodFrameCallbackResultArgs) as \ + bind_ok_result: + self._impl.exchange_bind( + callback=bind_ok_result.set_value_once, + destination=destination, + source=source, + routing_key=routing_key, + nowait=False, + arguments=arguments) + + self._flush_output(bind_ok_result.is_ready) + return bind_ok_result.value.method_frame + + def exchange_unbind(self, destination=None, source=None, routing_key='', + arguments=None): + """Unbind an exchange from another exchange. + + :param destination: The destination exchange to unbind + :type destination: str or unicode + :param source: The source exchange to unbind from + :type source: str or unicode + :param routing_key: The routing key to unbind + :type routing_key: str or unicode + :param dict arguments: Custom key/value pair arguments for the binding + + :returns: Method frame from the Exchange.Unbind-ok response + :rtype: `pika.frame.Method` having `method` attribute of type + `spec.Exchange.UnbindOk` + + """ + with _CallbackResult( + self._MethodFrameCallbackResultArgs) as unbind_ok_result: + self._impl.exchange_unbind( + callback=unbind_ok_result.set_value_once, + destination=destination, + source=source, + routing_key=routing_key, + nowait=False, + arguments=arguments) + + self._flush_output(unbind_ok_result.is_ready) + return unbind_ok_result.value.method_frame + + def queue_declare(self, queue='', passive=False, durable=False, + exclusive=False, auto_delete=False, + arguments=None): + """Declare queue, create if needed. This method creates or checks a + queue. When creating a new queue the client can specify various + properties that control the durability of the queue and its contents, + and the level of sharing for the queue. + + Leave the queue name empty for a auto-named queue in RabbitMQ + + :param queue: The queue name + :type queue: str or unicode; if empty string, the broker will create a + unique queue name; + :param bool passive: Only check to see if the queue exists and raise + `ChannelClosed` if it doesn't; + :param bool durable: Survive reboots of the broker + :param bool exclusive: Only allow access by the current connection + :param bool auto_delete: Delete after consumer cancels or disconnects + :param dict arguments: Custom key/value arguments for the queue + + :returns: Method frame from the Queue.Declare-ok response + :rtype: `pika.frame.Method` having `method` attribute of type + `spec.Queue.DeclareOk` + + """ + with _CallbackResult(self._MethodFrameCallbackResultArgs) as \ + declare_ok_result: + self._impl.queue_declare( + callback=declare_ok_result.set_value_once, + queue=queue, + passive=passive, + durable=durable, + exclusive=exclusive, + auto_delete=auto_delete, + nowait=False, + arguments=arguments) + + self._flush_output(declare_ok_result.is_ready) + return declare_ok_result.value.method_frame + + def queue_delete(self, queue='', if_unused=False, if_empty=False): + """Delete a queue from the broker. + + :param queue: The queue to delete + :type queue: str or unicode + :param bool if_unused: only delete if it's unused + :param bool if_empty: only delete if the queue is empty + + :returns: Method frame from the Queue.Delete-ok response + :rtype: `pika.frame.Method` having `method` attribute of type + `spec.Queue.DeleteOk` + + """ + with _CallbackResult(self._MethodFrameCallbackResultArgs) as \ + delete_ok_result: + self._impl.queue_delete(callback=delete_ok_result.set_value_once, + queue=queue, + if_unused=if_unused, + if_empty=if_empty, + nowait=False) + + self._flush_output(delete_ok_result.is_ready) + return delete_ok_result.value.method_frame + + def queue_purge(self, queue=''): + """Purge all of the messages from the specified queue + + :param queue: The queue to purge + :type queue: str or unicode + + :returns: Method frame from the Queue.Purge-ok response + :rtype: `pika.frame.Method` having `method` attribute of type + `spec.Queue.PurgeOk` + + """ + with _CallbackResult(self._MethodFrameCallbackResultArgs) as \ + purge_ok_result: + self._impl.queue_purge(callback=purge_ok_result.set_value_once, + queue=queue, + nowait=False) + + self._flush_output(purge_ok_result.is_ready) + return purge_ok_result.value.method_frame + + def queue_bind(self, queue, exchange, routing_key=None, + arguments=None): + """Bind the queue to the specified exchange + + :param queue: The queue to bind to the exchange + :type queue: str or unicode + :param exchange: The source exchange to bind to + :type exchange: str or unicode + :param routing_key: The routing key to bind on + :type routing_key: str or unicode + :param dict arguments: Custom key/value pair arguments for the binding + + :returns: Method frame from the Queue.Bind-ok response + :rtype: `pika.frame.Method` having `method` attribute of type + `spec.Queue.BindOk` + + """ + with _CallbackResult( + self._MethodFrameCallbackResultArgs) as bind_ok_result: + self._impl.queue_bind(callback=bind_ok_result.set_value_once, + queue=queue, + exchange=exchange, + routing_key=routing_key, + nowait=False, + arguments=arguments) + + self._flush_output(bind_ok_result.is_ready) + return bind_ok_result.value.method_frame + + def queue_unbind(self, queue='', exchange=None, routing_key=None, + arguments=None): + """Unbind a queue from an exchange. + + :param queue: The queue to unbind from the exchange + :type queue: str or unicode + :param exchange: The source exchange to bind from + :type exchange: str or unicode + :param routing_key: The routing key to unbind + :type routing_key: str or unicode + :param dict arguments: Custom key/value pair arguments for the binding + + :returns: Method frame from the Queue.Unbind-ok response + :rtype: `pika.frame.Method` having `method` attribute of type + `spec.Queue.UnbindOk` + + """ + with _CallbackResult(self._MethodFrameCallbackResultArgs) as \ + unbind_ok_result: + self._impl.queue_unbind(callback=unbind_ok_result.set_value_once, + queue=queue, + exchange=exchange, + routing_key=routing_key, + arguments=arguments) + self._flush_output(unbind_ok_result.is_ready) + return unbind_ok_result.value.method_frame + + def tx_select(self): + """Select standard transaction mode. This method sets the channel to use + standard transactions. The client must use this method at least once on + a channel before using the Commit or Rollback methods. + + :returns: Method frame from the Tx.Select-ok response + :rtype: `pika.frame.Method` having `method` attribute of type + `spec.Tx.SelectOk` + + """ + with _CallbackResult(self._MethodFrameCallbackResultArgs) as \ + select_ok_result: + self._impl.tx_select(select_ok_result.set_value_once) + + self._flush_output(select_ok_result.is_ready) + return select_ok_result.value.method_frame + + def tx_commit(self): + """Commit a transaction. + + :returns: Method frame from the Tx.Commit-ok response + :rtype: `pika.frame.Method` having `method` attribute of type + `spec.Tx.CommitOk` + + """ + with _CallbackResult(self._MethodFrameCallbackResultArgs) as \ + commit_ok_result: + self._impl.tx_commit(commit_ok_result.set_value_once) + + self._flush_output(commit_ok_result.is_ready) + return commit_ok_result.value.method_frame + + def tx_rollback(self): + """Rollback a transaction. + + :returns: Method frame from the Tx.Commit-ok response + :rtype: `pika.frame.Method` having `method` attribute of type + `spec.Tx.CommitOk` + + """ + with _CallbackResult(self._MethodFrameCallbackResultArgs) as \ + rollback_ok_result: + self._impl.tx_rollback(rollback_ok_result.set_value_once) + + self._flush_output(rollback_ok_result.is_ready) + return rollback_ok_result.value.method_frame diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/pika/adapters/select_connection.py b/NodeRed/NodeRedFiles/pika-0.13.1/pika/adapters/select_connection.py new file mode 100644 index 000000000..29d856989 --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/pika/adapters/select_connection.py @@ -0,0 +1,1178 @@ +"""A connection adapter that tries to use the best polling method for the +platform pika is running on. + +""" +import abc +import collections +import errno +import functools +import heapq +import logging +import select +import time +import threading + +import pika.compat + +from pika.adapters.base_connection import BaseConnection + +LOGGER = logging.getLogger(__name__) + +# One of select, epoll, kqueue or poll +SELECT_TYPE = None + +# Use epoll's constants to keep life easy +READ = 0x0001 +WRITE = 0x0004 +ERROR = 0x0008 + +# Reason for this unconventional dict initialization is the fact that on some +# platforms select.error is an aliases for OSError. We don't want the lambda +# for select.error to win over one for OSError. +_SELECT_ERROR_CHECKERS = {} +if pika.compat.PY3: + #InterruptedError is undefined in PY2 + #pylint: disable=E0602 + _SELECT_ERROR_CHECKERS[InterruptedError] = lambda e: True +_SELECT_ERROR_CHECKERS[select.error] = lambda e: e.args[0] == errno.EINTR +_SELECT_ERROR_CHECKERS[IOError] = lambda e: e.errno == errno.EINTR +_SELECT_ERROR_CHECKERS[OSError] = lambda e: e.errno == errno.EINTR + +# We can reduce the number of elements in the list by looking at super-sub +# class relationship because only the most generic ones needs to be caught. +# For now the optimization is left out. +# Following is better but still incomplete. +#_SELECT_ERRORS = tuple(filter(lambda e: not isinstance(e, OSError), +# _SELECT_ERROR_CHECKERS.keys()) +# + [OSError]) +_SELECT_ERRORS = tuple(_SELECT_ERROR_CHECKERS.keys()) + + +def _is_resumable(exc): + ''' Check if caught exception represents EINTR error. + :param exc: exception; must be one of classes in _SELECT_ERRORS ''' + checker = _SELECT_ERROR_CHECKERS.get(exc.__class__, None) + if checker is not None: + return checker(exc) + else: + return False + + +class SelectConnection(BaseConnection): + """An asynchronous connection adapter that attempts to use the fastest + event loop adapter for the given platform. + + """ + + def __init__( + self, # pylint: disable=R0913 + parameters=None, + on_open_callback=None, + on_open_error_callback=None, + on_close_callback=None, + stop_ioloop_on_close=True, + custom_ioloop=None): + """Create a new instance of the Connection object. + + :param pika.connection.Parameters parameters: Connection parameters + :param method on_open_callback: Method to call on connection open + :param method on_open_error_callback: Called if the connection can't + be established: on_open_error_callback(connection, str|exception) + :param method on_close_callback: Called when the connection is closed: + on_close_callback(connection, reason_code, reason_text) + :param bool stop_ioloop_on_close: Call ioloop.stop() if disconnected + :param custom_ioloop: Override using the global IOLoop in Tornado + :raises: RuntimeError + + """ + ioloop = custom_ioloop or IOLoop() + super(SelectConnection, self).__init__( + parameters, on_open_callback, on_open_error_callback, + on_close_callback, ioloop, stop_ioloop_on_close) + + def _adapter_connect(self): + """Connect to the RabbitMQ broker, returning True on success, False + on failure. + + :rtype: bool + + """ + error = super(SelectConnection, self)._adapter_connect() + if not error: + self.ioloop.add_handler(self.socket.fileno(), self._handle_events, + self.event_state) + return error + + def _adapter_disconnect(self): + """Disconnect from the RabbitMQ broker""" + if self.socket: + self.ioloop.remove_handler(self.socket.fileno()) + super(SelectConnection, self)._adapter_disconnect() + + +@functools.total_ordering +class _Timeout(object): + """Represents a timeout""" + + __slots__ = ('deadline', 'callback',) + + def __init__(self, deadline, callback): + """ + :param float deadline: timer expiration as non-negative epoch number + :param callable callback: callback to call when timeout expires + :raises ValueError, TypeError: + """ + + if deadline < 0: + raise ValueError( + 'deadline must be non-negative epoch number, but got %r' % + (deadline,)) + + if not callable(callback): + raise TypeError( + 'callback must be a callable, but got %r' % (callback,)) + + self.deadline = deadline + self.callback = callback + + def __eq__(self, other): + """NOTE: not supporting sort stability""" + return self.deadline == other.deadline + + def __lt__(self, other): + """NOTE: not supporting sort stability""" + return self.deadline < other.deadline + + def __le__(self, other): + """NOTE: not supporting sort stability""" + return self.deadline <= other.deadline + + +class _Timer(object): + """Manage timeouts for use in ioloop""" + + # Cancellation count threshold for triggering garbage collection of + # cancelled timers + _GC_CANCELLATION_THRESHOLD = 1024 + + def __init__(self): + self._timeout_heap = [] + + # Number of canceled timeouts on heap; for scheduling garbage + # collection of canceled timeouts + self._num_cancellations = 0 + + def close(self): + """Release resources. Don't use the `_Timer` instance after closing + it + """ + # Eliminate potential reference cycles to aid garbage-collection + if self._timeout_heap is not None: + for timeout in self._timeout_heap: + timeout.callback = None + self._timeout_heap = None + + def call_later(self, delay, callback): + """Schedule a one-shot timeout given delay seconds. + + NOTE: you may cancel the timer before dispatch of the callback. Timer + Manager cancels the timer upon dispatch of the callback. + + :param float delay: Non-negative number of seconds from now until + expiration + :param method callback: The callback method, having the signature + `callback()` + + :rtype: _Timeout + :raises ValueError, TypeError + + """ + if delay < 0: + raise ValueError( + 'call_later: delay must be non-negative, but got %r' + % (delay,)) + + now = time.time() + + timeout = _Timeout(now + delay, callback) + + heapq.heappush(self._timeout_heap, timeout) + + LOGGER.debug('call_later: added timeout %r with deadline=%r and ' + 'callback=%r; now=%s; delay=%s', timeout, timeout.deadline, + timeout.callback, now, delay) + + return timeout + + def remove_timeout(self, timeout): + """Cancel the timeout + + :param _Timeout timeout: The timer to cancel + + """ + # NOTE removing from the heap is difficult, so we just deactivate the + # timeout and garbage-collect it at a later time; see discussion + # in http://docs.python.org/library/heapq.html + if timeout.callback is None: + LOGGER.warning( + 'remove_timeout: timeout was already removed or called %r', + timeout) + else: + LOGGER.debug('remove_timeout: removing timeout %r with deadline=%r ' + 'and callback=%r', timeout, timeout.deadline, + timeout.callback) + timeout.callback = None + self._num_cancellations += 1 + + def get_remaining_interval(self): + """Get the interval to the next timeout expiration + + :returns: non-negative number of seconds until next timer expiration; + None if there are no timers + :rtype: float + + """ + if self._timeout_heap: + interval = max(0, self._timeout_heap[0].deadline - time.time()) + else: + interval = None + + return interval + + def process_timeouts(self): + """Process pending timeouts, invoking callbacks for those whose time has + come + + """ + if self._timeout_heap: + now = time.time() + + # Remove ready timeouts from the heap now to prevent IO starvation + # from timeouts added during callback processing + ready_timeouts = [] + + while self._timeout_heap and self._timeout_heap[0].deadline <= now: + timeout = heapq.heappop(self._timeout_heap) + if timeout.callback is not None: + ready_timeouts.append(timeout) + else: + self._num_cancellations -= 1 + + # Invoke ready timeout callbacks + for timeout in ready_timeouts: + if timeout.callback is None: + # Must have been canceled from a prior callback + self._num_cancellations -= 1 + continue + + timeout.callback() + timeout.callback = None + + # Garbage-collect canceled timeouts if they exceed threshold + if (self._num_cancellations >= self._GC_CANCELLATION_THRESHOLD and + self._num_cancellations > (len(self._timeout_heap) >> 1)): + self._num_cancellations = 0 + self._timeout_heap = [t for t in self._timeout_heap + if t.callback is not None] + heapq.heapify(self._timeout_heap) + + +class IOLoop(object): + """Singleton wrapper that decides which type of poller to use, creates an + instance of it in start_poller and keeps the invoking application in a + blocking state by calling the pollers start method. Poller should keep + looping until IOLoop.instance().stop() is called or there is a socket + error. + + Passes through all operations to the loaded poller object. + + """ + + def __init__(self): + self._timer = _Timer() + + # Callbacks requested via `add_callback` + self._callbacks = collections.deque() + + self._poller = self._get_poller(self._get_remaining_interval, + self.process_timeouts) + + def close(self): + """Release IOLoop's resources. + + `IOLoop.close` is intended to be called by the application or test code + only after `IOLoop.start()` returns. After calling `close()`, no other + interaction with the closed instance of `IOLoop` should be performed. + + """ + if self._callbacks is not None: + self._poller.close() + self._timer.close() + self._callbacks = None + + @staticmethod + def _get_poller(get_wait_seconds, process_timeouts): + """Determine the best poller to use for this environment and instantiate + it. + + :param get_wait_seconds: Function for getting the maximum number of + seconds to wait for IO for use by the poller + :param process_timeouts: Function for processing timeouts for use by the + poller + + :returns: the instantiated poller instance supporting `_PollerBase` API + """ + + poller = None + + kwargs = dict(get_wait_seconds=get_wait_seconds, + process_timeouts=process_timeouts) + + if hasattr(select, 'epoll'): + if not SELECT_TYPE or SELECT_TYPE == 'epoll': + LOGGER.debug('Using EPollPoller') + poller = EPollPoller(**kwargs) + + if not poller and hasattr(select, 'kqueue'): + if not SELECT_TYPE or SELECT_TYPE == 'kqueue': + LOGGER.debug('Using KQueuePoller') + poller = KQueuePoller(**kwargs) + + if (not poller and hasattr(select, 'poll') and + hasattr(select.poll(), 'modify')): # pylint: disable=E1101 + if not SELECT_TYPE or SELECT_TYPE == 'poll': + LOGGER.debug('Using PollPoller') + poller = PollPoller(**kwargs) + + if not poller: + LOGGER.debug('Using SelectPoller') + poller = SelectPoller(**kwargs) + + return poller + + def add_timeout(self, deadline, callback_method): + """[API] Add the callback_method to the IOLoop timer to fire after + deadline seconds. Returns a handle to the timeout. Do not confuse with + Tornado's timeout where you pass in the time you want to have your + callback called. Only pass in the seconds until it's to be called. + + :param int deadline: The number of seconds to wait to call callback + :param method callback_method: The callback method + :rtype: str + + """ + return self._timer.call_later(deadline, callback_method) + + def remove_timeout(self, timeout_id): + """[API] Remove a timeout + + :param str timeout_id: The timeout id to remove + + """ + self._timer.remove_timeout(timeout_id) + + def add_callback_threadsafe(self, callback): + """Requests a call to the given function as soon as possible in the + context of this IOLoop's thread. + + NOTE: This is the only thread-safe method in IOLoop. All other + manipulations of IOLoop must be performed from the IOLoop's thread. + + For example, a thread may request a call to the `stop` method of an + ioloop that is running in a different thread via + `ioloop.add_callback_threadsafe(ioloop.stop)` + + NOTE: if you know that the requester is running on the same thread as + the connection it is more efficient to use the + `call_later()` method with a delay of 0. + + :param method callback: The callback method + + """ + if not callable(callback): + raise TypeError( + 'callback must be a callable, but got %r' % (callback,)) + + # NOTE: `deque.append` is atomic + self._callbacks.append(callback) + + # Wake up the IOLoop which may be running in another thread + self._poller.wake_threadsafe() + + LOGGER.debug('add_callback_threadsafe: added callback=%r', callback) + + def process_timeouts(self): + """[Extension] Process pending callbacks and timeouts, invoking those + whose time has come. Internal use only. + + """ + # Avoid I/O starvation by postponing new callbacks to the next iteration + for _ in pika.compat.xrange(len(self._callbacks)): + self._callbacks.popleft()() + + self._timer.process_timeouts() + + def _get_remaining_interval(self): + """Get the remaining interval to the next callback or timeout + expiration. + + :returns: non-negative number of seconds until next callback or timer + expiration; None if there are no callbacks and timers + :rtype: float + + """ + if self._callbacks: + return 0 + + return self._timer.get_remaining_interval() + + def add_handler(self, fileno, handler, events): + """[API] Add a new fileno to the set to be monitored + + :param int fileno: The file descriptor + :param method handler: What is called when an event happens + :param int events: The event mask using READ, WRITE, ERROR + + """ + self._poller.add_handler(fileno, handler, events) + + def update_handler(self, fileno, events): + """[API] Set the events to the current events + + :param int fileno: The file descriptor + :param int events: The event mask using READ, WRITE, ERROR + + """ + self._poller.update_handler(fileno, events) + + def remove_handler(self, fileno): + """[API] Remove a file descriptor from the set + + :param int fileno: The file descriptor + + """ + self._poller.remove_handler(fileno) + + def start(self): + """[API] Start the main poller loop. It will loop until requested to + exit. See `IOLoop.stop`. + + """ + self._poller.start() + + def stop(self): + """[API] Request exit from the ioloop. The loop is NOT guaranteed to + stop before this method returns. + + To invoke `stop()` safely from a thread other than this IOLoop's thread, + call it via `add_callback_threadsafe`; e.g., + + `ioloop.add_callback_threadsafe(ioloop.stop)` + + """ + self._poller.stop() + + def activate_poller(self): + """[Extension] Activate the poller + + """ + self._thread_id = threading.current_thread().ident + self._poller.activate_poller() + + def deactivate_poller(self): + """[Extension] Deactivate the poller + + """ + self._poller.deactivate_poller() + + def poll(self): + """[Extension] Wait for events of interest on registered file + descriptors until an event of interest occurs or next timer deadline or + `_PollerBase._MAX_POLL_TIMEOUT`, whichever is sooner, and dispatch the + corresponding event handlers. + + """ + self._poller.poll() + + +_AbstractBase = abc.ABCMeta('_AbstractBase', (object,), {}) + + +class _PollerBase(_AbstractBase): # pylint: disable=R0902 + """Base class for select-based IOLoop implementations""" + + # Drop out of the poll loop every _MAX_POLL_TIMEOUT secs as a worst case; + # this is only a backstop value; we will run timeouts when they are + # scheduled. + _MAX_POLL_TIMEOUT = 5 + + # if the poller uses MS override with 1000 + POLL_TIMEOUT_MULT = 1 + + def __init__(self, get_wait_seconds, process_timeouts): + """ + :param get_wait_seconds: Function for getting the maximum number of + seconds to wait for IO for use by the poller + :param process_timeouts: Function for processing timeouts for use by the + poller + + """ + self._get_wait_seconds = get_wait_seconds + self._process_timeouts = process_timeouts + + # We guard access to the waking file descriptors to avoid races from + # closing them while another thread is calling our `wake()` method. + self._waking_mutex = threading.Lock() + + # fd-to-handler function mappings + self._fd_handlers = dict() + + # event-to-fdset mappings + self._fd_events = {READ: set(), WRITE: set(), ERROR: set()} + + self._processing_fd_event_map = {} + + # Reentrancy tracker of the `start` method + self._start_nesting_levels = 0 + + self._stopping = False + + # Create ioloop-interrupt socket pair and register read handler. + self._r_interrupt, self._w_interrupt = self._get_interrupt_pair() + self.add_handler(self._r_interrupt.fileno(), self._read_interrupt, READ) + + def close(self): + """Release poller's resources. + + `close()` is intended to be called after the poller's `start()` method + returns. After calling `close()`, no other interaction with the closed + poller instance should be performed. + + """ + # Unregister and close ioloop-interrupt socket pair; mutual exclusion is + # necessary to avoid race condition with `wake_threadsafe` executing in + # another thread's context + assert self._start_nesting_levels == 0, \ + 'Cannot call close() before start() unwinds.' + + with self._waking_mutex: + if self._w_interrupt is not None: + self.remove_handler(self._r_interrupt.fileno()) # pylint: disable=E1101 + self._r_interrupt.close() + self._r_interrupt = None + self._w_interrupt.close() + self._w_interrupt = None + + self.deactivate_poller() + + self._fd_handlers = None + self._fd_events = None + self._processing_fd_event_map = None + + def wake_threadsafe(self): + """Wake up the poller as soon as possible. As the name indicates, this + method is thread-safe. + + """ + with self._waking_mutex: + if self._w_interrupt is None: + return + + try: + # Send byte to interrupt the poll loop, use send() instead of + # os.write for Windows compatibility + self._w_interrupt.send(b'X') + except pika.compat.SOCKET_ERROR as err: + if err.errno != errno.EWOULDBLOCK: + raise + except Exception as err: + # There's nothing sensible to do here, we'll exit the interrupt + # loop after POLL_TIMEOUT secs in worst case anyway. + LOGGER.warning("Failed to send interrupt to poller: %s", err) + raise + + + def _get_max_wait(self): + """Get the interval to the next timeout event, or a default interval + + :returns: maximum number of self.POLL_TIMEOUT_MULT-scaled time units + to wait for IO events + + """ + delay = self._get_wait_seconds() + if delay is None: + delay = self._MAX_POLL_TIMEOUT + else: + delay = min(delay, self._MAX_POLL_TIMEOUT) + + return delay * self.POLL_TIMEOUT_MULT + + def add_handler(self, fileno, handler, events): + """Add a new fileno to the set to be monitored + + :param int fileno: The file descriptor + :param method handler: What is called when an event happens + :param int events: The event mask using READ, WRITE, ERROR + + """ + self._fd_handlers[fileno] = handler + self._set_handler_events(fileno, events) + + # Inform the derived class + self._register_fd(fileno, events) + + def update_handler(self, fileno, events): + """Set the events to the current events + + :param int fileno: The file descriptor + :param int events: The event mask using READ, WRITE, ERROR + + """ + # Record the change + events_cleared, events_set = self._set_handler_events(fileno, events) + + # Inform the derived class + self._modify_fd_events( + fileno, + events=events, + events_to_clear=events_cleared, + events_to_set=events_set) + + def remove_handler(self, fileno): + """Remove a file descriptor from the set + + :param int fileno: The file descriptor + + """ + try: + del self._processing_fd_event_map[fileno] + except KeyError: + pass + + events_cleared, _ = self._set_handler_events(fileno, 0) + del self._fd_handlers[fileno] + + # Inform the derived class + self._unregister_fd(fileno, events_to_clear=events_cleared) + + def _set_handler_events(self, fileno, events): + """Set the handler's events to the given events; internal to + `_PollerBase`. + + :param int fileno: The file descriptor + :param int events: The event mask (READ, WRITE, ERROR) + + :returns: a 2-tuple (events_cleared, events_set) + """ + events_cleared = 0 + events_set = 0 + + for evt in (READ, WRITE, ERROR): + if events & evt: + if fileno not in self._fd_events[evt]: + self._fd_events[evt].add(fileno) + events_set |= evt + else: + if fileno in self._fd_events[evt]: + self._fd_events[evt].discard(fileno) + events_cleared |= evt + + return events_cleared, events_set + + def activate_poller(self): + """Activate the poller + + """ + # Activate the underlying poller and register current events + self._init_poller() + fd_to_events = collections.defaultdict(int) + for event, file_descriptors in self._fd_events.items(): + for fileno in file_descriptors: + fd_to_events[fileno] |= event + + for fileno, events in fd_to_events.items(): + self._register_fd(fileno, events) + + def deactivate_poller(self): + """Deactivate the poller + + """ + self._uninit_poller() + + def start(self): + """Start the main poller loop. It will loop until requested to exit + + """ + self._start_nesting_levels += 1 + + if self._start_nesting_levels == 1: + LOGGER.debug('Entering IOLoop') + + # Activate the underlying poller and register current events + self.activate_poller() + + else: + LOGGER.debug('Reentering IOLoop at nesting level=%s', + self._start_nesting_levels) + + try: + # Run event loop + while not self._stopping: + self.poll() + self._process_timeouts() + + finally: + self._start_nesting_levels -= 1 + + if self._start_nesting_levels == 0: + try: + LOGGER.debug('Deactivating poller') + + # Deactivate the underlying poller + self.deactivate_poller() + finally: + self._stopping = False + else: + LOGGER.debug('Leaving IOLoop with %s nesting levels remaining', + self._start_nesting_levels) + + def stop(self): + """Request exit from the ioloop. The loop is NOT guaranteed to stop + before this method returns. + + """ + LOGGER.debug('Stopping IOLoop') + self._stopping = True + + self.wake_threadsafe() + + @abc.abstractmethod + def poll(self): + """Wait for events on interested filedescriptors. + """ + raise NotImplementedError + + @abc.abstractmethod + def _init_poller(self): + """Notify the implementation to allocate the poller resource""" + raise NotImplementedError + + @abc.abstractmethod + def _uninit_poller(self): + """Notify the implementation to release the poller resource""" + raise NotImplementedError + + @abc.abstractmethod + def _register_fd(self, fileno, events): + """The base class invokes this method to notify the implementation to + register the file descriptor with the polling object. The request must + be ignored if the poller is not activated. + + :param int fileno: The file descriptor + :param int events: The event mask (READ, WRITE, ERROR) + """ + raise NotImplementedError + + @abc.abstractmethod + def _modify_fd_events(self, fileno, events, events_to_clear, events_to_set): + """The base class invoikes this method to notify the implementation to + modify an already registered file descriptor. The request must be + ignored if the poller is not activated. + + :param int fileno: The file descriptor + :param int events: absolute events (READ, WRITE, ERROR) + :param int events_to_clear: The events to clear (READ, WRITE, ERROR) + :param int events_to_set: The events to set (READ, WRITE, ERROR) + """ + raise NotImplementedError + + @abc.abstractmethod + def _unregister_fd(self, fileno, events_to_clear): + """The base class invokes this method to notify the implementation to + unregister the file descriptor being tracked by the polling object. The + request must be ignored if the poller is not activated. + + :param int fileno: The file descriptor + :param int events_to_clear: The events to clear (READ, WRITE, ERROR) + """ + raise NotImplementedError + + def _dispatch_fd_events(self, fd_event_map): + """ Helper to dispatch callbacks for file descriptors that received + events. + + Before doing so we re-calculate the event mask based on what is + currently set in case it has been changed under our feet by a + previous callback. We also take a store a refernce to the + fd_event_map so that we can detect removal of an + fileno during processing of another callback and not generate + spurious callbacks on it. + + :param dict fd_event_map: Map of fds to events received on them. + """ + # Reset the prior map; if the call is nested, this will suppress the + # remaining dispatch in the earlier call. + self._processing_fd_event_map.clear() + + self._processing_fd_event_map = fd_event_map + + for fileno in pika.compat.dictkeys(fd_event_map): + if fileno not in fd_event_map: + # the fileno has been removed from the map under our feet. + continue + + events = fd_event_map[fileno] + for evt in [READ, WRITE, ERROR]: + if fileno not in self._fd_events[evt]: + events &= ~evt + + if events: + handler = self._fd_handlers[fileno] + handler(fileno, events) + + @staticmethod + def _get_interrupt_pair(): + """ Use a socketpair to be able to interrupt the ioloop if called + from another thread. Socketpair() is not supported on some OS (Win) + so use a pair of simple TCP sockets instead. The sockets will be + closed and garbage collected by python when the ioloop itself is. + """ + return pika.compat._nonblocking_socketpair() # pylint: disable=W0212 + + def _read_interrupt(self, interrupt_fd, events): # pylint: disable=W0613 + """ Read the interrupt byte(s). We ignore the event mask as we can ony + get here if there's data to be read on our fd. + + :param int interrupt_fd: The file descriptor to read from + :param int events: (unused) The events generated for this fd + """ + try: + # NOTE Use recv instead of os.read for windows compatibility + self._r_interrupt.recv(512) # pylint: disable=E1101 + except pika.compat.SOCKET_ERROR as err: + if err.errno != errno.EAGAIN: + raise + + +class SelectPoller(_PollerBase): + """Default behavior is to use Select since it's the widest supported and has + all of the methods we need for child classes as well. One should only need + to override the update_handler and start methods for additional types. + + """ + # if the poller uses MS specify 1000 + POLL_TIMEOUT_MULT = 1 + + def poll(self): + """Wait for events of interest on registered file descriptors until an + event of interest occurs or next timer deadline or _MAX_POLL_TIMEOUT, + whichever is sooner, and dispatch the corresponding event handlers. + + """ + while True: + try: + if (self._fd_events[READ] or self._fd_events[WRITE] or + self._fd_events[ERROR]): + read, write, error = select.select( + self._fd_events[READ], self._fd_events[WRITE], + self._fd_events[ERROR], self._get_max_wait()) + else: + # NOTE When called without any FDs, select fails on + # Windows with error 10022, 'An invalid argument was + # supplied'. + time.sleep(self._get_max_wait()) + read, write, error = [], [], [] + break + except _SELECT_ERRORS as error: + if _is_resumable(error): + continue + else: + raise + + # Build an event bit mask for each fileno we've received an event for + + fd_event_map = collections.defaultdict(int) + for fd_set, evt in zip((read, write, error), (READ, WRITE, ERROR)): + for fileno in fd_set: + fd_event_map[fileno] |= evt + + self._dispatch_fd_events(fd_event_map) + + def _init_poller(self): + """Notify the implementation to allocate the poller resource""" + # It's a no op in SelectPoller + pass + + def _uninit_poller(self): + """Notify the implementation to release the poller resource""" + # It's a no op in SelectPoller + pass + + def _register_fd(self, fileno, events): + """The base class invokes this method to notify the implementation to + register the file descriptor with the polling object. The request must + be ignored if the poller is not activated. + + :param int fileno: The file descriptor + :param int events: The event mask using READ, WRITE, ERROR + """ + # It's a no op in SelectPoller + pass + + def _modify_fd_events(self, fileno, events, events_to_clear, events_to_set): + """The base class invoikes this method to notify the implementation to + modify an already registered file descriptor. The request must be + ignored if the poller is not activated. + + :param int fileno: The file descriptor + :param int events: absolute events (READ, WRITE, ERROR) + :param int events_to_clear: The events to clear (READ, WRITE, ERROR) + :param int events_to_set: The events to set (READ, WRITE, ERROR) + """ + # It's a no op in SelectPoller + pass + + def _unregister_fd(self, fileno, events_to_clear): + """The base class invokes this method to notify the implementation to + unregister the file descriptor being tracked by the polling object. The + request must be ignored if the poller is not activated. + + :param int fileno: The file descriptor + :param int events_to_clear: The events to clear (READ, WRITE, ERROR) + """ + # It's a no op in SelectPoller + pass + + +class KQueuePoller(_PollerBase): + """KQueuePoller works on BSD based systems and is faster than select""" + + def __init__(self, get_wait_seconds, process_timeouts): + """Create an instance of the KQueuePoller + """ + self._kqueue = None + super(KQueuePoller, self).__init__(get_wait_seconds, process_timeouts) + + @staticmethod + def _map_event(kevent): + """return the event type associated with a kevent object + + :param kevent kevent: a kevent object as returned by kqueue.control() + + """ + if kevent.filter == select.KQ_FILTER_READ: + return READ + elif kevent.filter == select.KQ_FILTER_WRITE: + return WRITE + elif kevent.flags & select.KQ_EV_ERROR: + return ERROR + + # Should never happen + return None + + def poll(self): + """Wait for events of interest on registered file descriptors until an + event of interest occurs or next timer deadline or _MAX_POLL_TIMEOUT, + whichever is sooner, and dispatch the corresponding event handlers. + + """ + while True: + try: + kevents = self._kqueue.control(None, 1000, + self._get_max_wait()) + break + except _SELECT_ERRORS as error: + if _is_resumable(error): + continue + else: + raise + + fd_event_map = collections.defaultdict(int) + for event in kevents: + fd_event_map[event.ident] |= self._map_event(event) + + self._dispatch_fd_events(fd_event_map) + + def _init_poller(self): + """Notify the implementation to allocate the poller resource""" + assert self._kqueue is None + + self._kqueue = select.kqueue() + + def _uninit_poller(self): + """Notify the implementation to release the poller resource""" + if self._kqueue is not None: + self._kqueue.close() + self._kqueue = None + + def _register_fd(self, fileno, events): + """The base class invokes this method to notify the implementation to + register the file descriptor with the polling object. The request must + be ignored if the poller is not activated. + + :param int fileno: The file descriptor + :param int events: The event mask using READ, WRITE, ERROR + """ + self._modify_fd_events( + fileno, events=events, events_to_clear=0, events_to_set=events) + + def _modify_fd_events(self, fileno, events, events_to_clear, events_to_set): + """The base class invoikes this method to notify the implementation to + modify an already registered file descriptor. The request must be + ignored if the poller is not activated. + + :param int fileno: The file descriptor + :param int events: absolute events (READ, WRITE, ERROR) + :param int events_to_clear: The events to clear (READ, WRITE, ERROR) + :param int events_to_set: The events to set (READ, WRITE, ERROR) + """ + if self._kqueue is None: + return + + kevents = list() + + if events_to_clear & READ: + kevents.append( + select.kevent( + fileno, + filter=select.KQ_FILTER_READ, + flags=select.KQ_EV_DELETE)) + if events_to_set & READ: + kevents.append( + select.kevent( + fileno, + filter=select.KQ_FILTER_READ, + flags=select.KQ_EV_ADD)) + if events_to_clear & WRITE: + kevents.append( + select.kevent( + fileno, + filter=select.KQ_FILTER_WRITE, + flags=select.KQ_EV_DELETE)) + if events_to_set & WRITE: + kevents.append( + select.kevent( + fileno, + filter=select.KQ_FILTER_WRITE, + flags=select.KQ_EV_ADD)) + + self._kqueue.control(kevents, 0) + + def _unregister_fd(self, fileno, events_to_clear): + """The base class invokes this method to notify the implementation to + unregister the file descriptor being tracked by the polling object. The + request must be ignored if the poller is not activated. + + :param int fileno: The file descriptor + :param int events_to_clear: The events to clear (READ, WRITE, ERROR) + """ + self._modify_fd_events( + fileno, events=0, events_to_clear=events_to_clear, events_to_set=0) + + +class PollPoller(_PollerBase): + """Poll works on Linux and can have better performance than EPoll in + certain scenarios. Both are faster than select. + + """ + POLL_TIMEOUT_MULT = 1000 + + def __init__(self, get_wait_seconds, process_timeouts): + """Create an instance of the KQueuePoller + + """ + self._poll = None + super(PollPoller, self).__init__(get_wait_seconds, process_timeouts) + + @staticmethod + def _create_poller(): + """ + :rtype: `select.poll` + """ + return select.poll() # pylint: disable=E1101 + + def poll(self): + """Wait for events of interest on registered file descriptors until an + event of interest occurs or next timer deadline or _MAX_POLL_TIMEOUT, + whichever is sooner, and dispatch the corresponding event handlers. + + """ + while True: + try: + events = self._poll.poll(self._get_max_wait()) + break + except _SELECT_ERRORS as error: + if _is_resumable(error): + continue + else: + raise + + fd_event_map = collections.defaultdict(int) + for fileno, event in events: + fd_event_map[fileno] |= event + + self._dispatch_fd_events(fd_event_map) + + def _init_poller(self): + """Notify the implementation to allocate the poller resource""" + assert self._poll is None + + self._poll = self._create_poller() + + def _uninit_poller(self): + """Notify the implementation to release the poller resource""" + if self._poll is not None: + if hasattr(self._poll, "close"): + self._poll.close() + + self._poll = None + + def _register_fd(self, fileno, events): + """The base class invokes this method to notify the implementation to + register the file descriptor with the polling object. The request must + be ignored if the poller is not activated. + + :param int fileno: The file descriptor + :param int events: The event mask using READ, WRITE, ERROR + """ + if self._poll is not None: + self._poll.register(fileno, events) + + def _modify_fd_events(self, fileno, events, events_to_clear, events_to_set): + """The base class invoikes this method to notify the implementation to + modify an already registered file descriptor. The request must be + ignored if the poller is not activated. + + :param int fileno: The file descriptor + :param int events: absolute events (READ, WRITE, ERROR) + :param int events_to_clear: The events to clear (READ, WRITE, ERROR) + :param int events_to_set: The events to set (READ, WRITE, ERROR) + """ + if self._poll is not None: + self._poll.modify(fileno, events) + + def _unregister_fd(self, fileno, events_to_clear): + """The base class invokes this method to notify the implementation to + unregister the file descriptor being tracked by the polling object. The + request must be ignored if the poller is not activated. + + :param int fileno: The file descriptor + :param int events_to_clear: The events to clear (READ, WRITE, ERROR) + """ + if self._poll is not None: + self._poll.unregister(fileno) + + +class EPollPoller(PollPoller): + """EPoll works on Linux and can have better performance than Poll in + certain scenarios. Both are faster than select. + + """ + POLL_TIMEOUT_MULT = 1 + + @staticmethod + def _create_poller(): + """ + :rtype: `select.poll` + """ + return select.epoll() # pylint: disable=E1101 diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/pika/adapters/tornado_connection.py b/NodeRed/NodeRedFiles/pika-0.13.1/pika/adapters/tornado_connection.py new file mode 100644 index 000000000..db34dfd99 --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/pika/adapters/tornado_connection.py @@ -0,0 +1,122 @@ +"""Use pika with the Tornado IOLoop""" +from tornado import ioloop +import logging +import time + +from pika.adapters import base_connection + +LOGGER = logging.getLogger(__name__) + + +class TornadoConnection(base_connection.BaseConnection): + """The TornadoConnection runs on the Tornado IOLoop. If you're running the + connection in a web app, make sure you set stop_ioloop_on_close to False, + which is the default behavior for this adapter, otherwise the web app + will stop taking requests. + + :param pika.connection.Parameters parameters: Connection parameters + :param on_open_callback: The method to call when the connection is open + :type on_open_callback: method + :param on_open_error_callback: Method to call if the connection cant + be opened + :type on_open_error_callback: method + :param bool stop_ioloop_on_close: Call ioloop.stop() if disconnected + :param custom_ioloop: Override using the global IOLoop in Tornado + + """ + WARN_ABOUT_IOLOOP = True + + def __init__(self, + parameters=None, + on_open_callback=None, + on_open_error_callback=None, + on_close_callback=None, + stop_ioloop_on_close=False, + custom_ioloop=None): + """Create a new instance of the TornadoConnection class, connecting + to RabbitMQ automatically + + :param pika.connection.Parameters parameters: Connection parameters + :param on_open_callback: The method to call when the connection is open + :type on_open_callback: method + :param method on_open_error_callback: Called if the connection can't + be established: on_open_error_callback(connection, str|exception) + :param method on_close_callback: Called when the connection is closed: + on_close_callback(connection, reason_code, reason_text) + :param bool stop_ioloop_on_close: Call ioloop.stop() if disconnected + :param custom_ioloop: Override using the global IOLoop in Tornado + + """ + self.sleep_counter = 0 + self.ioloop = custom_ioloop or ioloop.IOLoop.instance() + super(TornadoConnection, self).__init__(parameters, on_open_callback, + on_open_error_callback, + on_close_callback, self.ioloop, + stop_ioloop_on_close) + + def _adapter_connect(self): + """Connect to the remote socket, adding the socket to the IOLoop if + connected. + + :rtype: bool + + """ + error = super(TornadoConnection, self)._adapter_connect() + if not error: + self.ioloop.add_handler(self.socket.fileno(), self._handle_events, + self.event_state) + return error + + def _adapter_disconnect(self): + """Disconnect from the RabbitMQ broker""" + if self.socket: + self.ioloop.remove_handler(self.socket.fileno()) + super(TornadoConnection, self)._adapter_disconnect() + + def add_timeout(self, deadline, callback_method): + """Add the callback_method to the IOLoop timer to fire after deadline + seconds. Returns a handle to the timeout. Do not confuse with + Tornado's timeout where you pass in the time you want to have your + callback called. Only pass in the seconds until it's to be called. + + :param int deadline: The number of seconds to wait to call callback + :param method callback_method: The callback method + :rtype: str + + """ + return self.ioloop.add_timeout(time.time() + deadline, callback_method) + + def remove_timeout(self, timeout_id): + """Remove the timeout from the IOLoop by the ID returned from + add_timeout. + + :rtype: str + + """ + return self.ioloop.remove_timeout(timeout_id) + + def add_callback_threadsafe(self, callback): + """Requests a call to the given function as soon as possible in the + context of this connection's IOLoop thread. + + NOTE: This is the only thread-safe method offered by the connection. All + other manipulations of the connection must be performed from the + connection's thread. + + For example, a thread may request a call to the + `channel.basic_ack` method of a connection that is running in a + different thread via + + ``` + connection.add_callback_threadsafe( + functools.partial(channel.basic_ack, delivery_tag=...)) + ``` + + :param method callback: The callback method; must be callable. + + """ + if not callable(callback): + raise TypeError( + 'callback must be a callable, but got %r' % (callback,)) + + self.ioloop.add_callback(callback) diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/pika/adapters/twisted_connection.py b/NodeRed/NodeRedFiles/pika-0.13.1/pika/adapters/twisted_connection.py new file mode 100644 index 000000000..1dac51f44 --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/pika/adapters/twisted_connection.py @@ -0,0 +1,474 @@ +"""Using Pika with a Twisted reactor. + +Supports two methods of establishing the connection, using TwistedConnection +or TwistedProtocolConnection. For details about each method, see the docstrings +of the corresponding classes. + +The interfaces in this module are Deferred-based when possible. This means that +the connection.channel() method and most of the channel methods return +Deferreds instead of taking a callback argument and that basic_consume() +returns a Twisted DeferredQueue where messages from the server will be +stored. Refer to the docstrings for TwistedConnection.channel() and the +TwistedChannel class for details. + +""" +import functools +from twisted.internet import defer, error, reactor +from twisted.python import log + +from pika import connection +from pika import exceptions +from pika.adapters import base_connection + + +class ClosableDeferredQueue(defer.DeferredQueue): + """ + Like the normal Twisted DeferredQueue, but after close() is called with an + Exception instance all pending Deferreds are errbacked and further attempts + to call get() or put() return a Failure wrapping that exception. + """ + + def __init__(self, size=None, backlog=None): + self.closed = None + super(ClosableDeferredQueue, self).__init__(size, backlog) + + def put(self, obj): + if self.closed: + return defer.fail(self.closed) + return defer.DeferredQueue.put(self, obj) + + def get(self): + if self.closed: + return defer.fail(self.closed) + return defer.DeferredQueue.get(self) + + def close(self, reason): + self.closed = reason + while self.waiting: + self.waiting.pop().errback(reason) + self.pending = [] + + +class TwistedChannel(object): + """A wrapper wround Pika's Channel. + + Channel methods that normally take a callback argument are wrapped to + return a Deferred that fires with whatever would be passed to the callback. + If the channel gets closed, all pending Deferreds are errbacked with a + ChannelClosed exception. The returned Deferreds fire with whatever + arguments the callback to the original method would receive. + + The basic_consume method is wrapped in a special way, see its docstring for + details. + """ + + WRAPPED_METHODS = ('exchange_declare', 'exchange_delete', 'queue_declare', + 'queue_bind', 'queue_purge', 'queue_unbind', 'basic_qos', + 'basic_get', 'basic_recover', 'tx_select', 'tx_commit', + 'tx_rollback', 'flow', 'basic_cancel') + + def __init__(self, channel): + self.__channel = channel + self.__closed = None + self.__calls = set() + self.__consumers = {} + + channel.add_on_close_callback(self.channel_closed) + + def channel_closed(self, channel, reply_code, reply_text): + # enter the closed state + self.__closed = exceptions.ChannelClosed(reply_code, reply_text) + # errback all pending calls + for d in self.__calls: + d.errback(self.__closed) + # close all open queues + for consumers in self.__consumers.values(): + for c in consumers: + c.close(self.__closed) + # release references to stored objects + self.__calls = set() + self.__consumers = {} + + def basic_consume(self, *args, **kwargs): + """Consume from a server queue. Returns a Deferred that fires with a + tuple: (queue_object, consumer_tag). The queue object is an instance of + ClosableDeferredQueue, where data received from the queue will be + stored. Clients should use its get() method to fetch individual + message. + """ + if self.__closed: + return defer.fail(self.__closed) + + queue = ClosableDeferredQueue() + queue_name = kwargs['queue'] + kwargs['consumer_callback'] = lambda *args: queue.put(args) + self.__consumers.setdefault(queue_name, set()).add(queue) + + try: + consumer_tag = self.__channel.basic_consume(*args, **kwargs) + # TODO this except without types would suppress system-exiting + # exceptions, such as SystemExit and KeyboardInterrupt. It should be at + # least `except Exception` and preferably more specific. + except: + return defer.fail() + + return defer.succeed((queue, consumer_tag)) + + def queue_delete(self, *args, **kwargs): + """Wraps the method the same way all the others are wrapped, but removes + the reference to the queue object after it gets deleted on the server. + + """ + wrapped = self.__wrap_channel_method('queue_delete') + queue_name = kwargs['queue'] + + d = wrapped(*args, **kwargs) + return d.addCallback(self.__clear_consumer, queue_name) + + def basic_publish(self, *args, **kwargs): + """Make sure the channel is not closed and then publish. Return a + Deferred that fires with the result of the channel's basic_publish. + + """ + if self.__closed: + return defer.fail(self.__closed) + return defer.succeed(self.__channel.basic_publish(*args, **kwargs)) + + def __wrap_channel_method(self, name): + """Wrap Pika's Channel method to make it return a Deferred that fires + when the method completes and errbacks if the channel gets closed. If + the original method's callback would receive more than one argument, the + Deferred fires with a tuple of argument values. + + """ + method = getattr(self.__channel, name) + + @functools.wraps(method) + def wrapped(*args, **kwargs): + if self.__closed: + return defer.fail(self.__closed) + + d = defer.Deferred() + self.__calls.add(d) + d.addCallback(self.__clear_call, d) + + def single_argument(*args): + """ + Make sure that the deferred is called with a single argument. + In case the original callback fires with more than one, convert + to a tuple. + """ + if len(args) > 1: + d.callback(tuple(args)) + else: + d.callback(*args) + + kwargs['callback'] = single_argument + + try: + method(*args, **kwargs) + # TODO this except without types would suppress system-exiting + # exceptions, such as SystemExit and KeyboardInterrupt. It should be + # at least `except Exception` and preferably more specific. + except: + return defer.fail() + return d + + return wrapped + + def __clear_consumer(self, ret, queue_name): + self.__consumers.pop(queue_name, None) + return ret + + def __clear_call(self, ret, d): + self.__calls.discard(d) + return ret + + def __getattr__(self, name): + # Wrap methods defined in WRAPPED_METHODS, forward the rest of accesses + # to the channel. + if name in self.WRAPPED_METHODS: + return self.__wrap_channel_method(name) + return getattr(self.__channel, name) + + +class IOLoopReactorAdapter(object): + """An adapter providing Pika's IOLoop interface using a Twisted reactor. + + Accepts a TwistedConnection object and a Twisted reactor object. + + """ + + def __init__(self, connection, reactor): + self.connection = connection + self.reactor = reactor + self.started = False + + def add_timeout(self, deadline, callback_method): + """Add the callback_method to the IOLoop timer to fire after deadline + seconds. Returns a handle to the timeout. Do not confuse with + Tornado's timeout where you pass in the time you want to have your + callback called. Only pass in the seconds until it's to be called. + + :param int deadline: The number of seconds to wait to call callback + :param method callback_method: The callback method + :rtype: twisted.internet.interfaces.IDelayedCall + + """ + return self.reactor.callLater(deadline, callback_method) + + def remove_timeout(self, call): + """Remove a call + + :param twisted.internet.interfaces.IDelayedCall call: The call to cancel + + """ + call.cancel() + + def add_callback_threadsafe(self, callback): + """Requests a call to the given function as soon as possible in the + context of this IOLoop's thread. + + NOTE: This is the only thread-safe method offered by the IOLoop adapter. + All other manipulations of the IOLoop adapter and its parent connection + must be performed from the connection's thread. + + For example, a thread may request a call to the + `channel.basic_ack` method of a connection that is running in a + different thread via + + ``` + connection.add_callback_threadsafe( + functools.partial(channel.basic_ack, delivery_tag=...)) + ``` + + :param method callback: The callback method; must be callable. + + """ + self.reactor.callFromThread(callback) + + def stop(self): + # Guard against stopping the reactor multiple times + if not self.started: + return + self.started = False + self.reactor.stop() + + def start(self): + # Guard against starting the reactor multiple times + if self.started: + return + self.started = True + self.reactor.run() + + def remove_handler(self, _): + # The fileno is irrelevant, as it's the connection's job to provide it + # to the reactor when asked to do so. Removing the handler from the + # ioloop is removing it from the reactor in Twisted's parlance. + self.reactor.removeReader(self.connection) + self.reactor.removeWriter(self.connection) + + def update_handler(self, _, event_state): + # Same as in remove_handler, the fileno is irrelevant. First remove the + # connection entirely from the reactor, then add it back depending on + # the event state. + self.reactor.removeReader(self.connection) + self.reactor.removeWriter(self.connection) + + if event_state & self.connection.READ: + self.reactor.addReader(self.connection) + + if event_state & self.connection.WRITE: + self.reactor.addWriter(self.connection) + + +class TwistedConnection(base_connection.BaseConnection): + """A standard Pika connection adapter. You instantiate the class passing the + connection parameters and the connected callback and when it gets called + you can start using it. + + The problem is that connection establishing is done using the blocking + socket module. For instance, if the host you are connecting to is behind a + misconfigured firewall that just drops packets, the whole process will + freeze until the connection timeout passes. To work around that problem, + use TwistedProtocolConnection, but read its docstring first. + + Objects of this class get put in the Twisted reactor which will notify them + when the socket connection becomes readable or writable, so apart from + implementing the BaseConnection interface, they also provide Twisted's + IReadWriteDescriptor interface. + + """ + + def __init__(self, + parameters=None, + on_open_callback=None, + on_open_error_callback=None, + on_close_callback=None, + stop_ioloop_on_close=False): + super(TwistedConnection, self).__init__( + parameters=parameters, + on_open_callback=on_open_callback, + on_open_error_callback=on_open_error_callback, + on_close_callback=on_close_callback, + ioloop=IOLoopReactorAdapter(self, reactor), + stop_ioloop_on_close=stop_ioloop_on_close) + + def _adapter_connect(self): + """Connect to the RabbitMQ broker""" + # Connect (blockignly!) to the server + error = super(TwistedConnection, self)._adapter_connect() + if not error: + # Set the I/O events we're waiting for (see IOLoopReactorAdapter + # docstrings for why it's OK to pass None as the file descriptor) + self.ioloop.update_handler(None, self.event_state) + return error + + def _adapter_disconnect(self): + """Called when the adapter should disconnect""" + self.ioloop.remove_handler(None) + self._cleanup_socket() + + def _on_connected(self): + """Call superclass and then update the event state to flush the outgoing + frame out. Commit 50d842526d9f12d32ad9f3c4910ef60b8c301f59 removed a + self._flush_outbound call that was in _send_frame which previously + made this step unnecessary. + + """ + super(TwistedConnection, self)._on_connected() + self._manage_event_state() + + def channel(self, channel_number=None): + """Return a Deferred that fires with an instance of a wrapper around the + Pika Channel class. + + """ + d = defer.Deferred() + base_connection.BaseConnection.channel(self, d.callback, channel_number) + return d.addCallback(TwistedChannel) + + # IReadWriteDescriptor methods + + def fileno(self): + return self.socket.fileno() + + def logPrefix(self): + return "twisted-pika" + + def connectionLost(self, reason): + # If the connection was not closed cleanly, log the error + if not reason.check(error.ConnectionDone): + log.err(reason) + + self._on_terminate(connection.InternalCloseReasons.SOCKET_ERROR, + str(reason)) + + def doRead(self): + self._handle_read() + + def doWrite(self): + self._handle_write() + self._manage_event_state() + + +class TwistedProtocolConnection(base_connection.BaseConnection): + """A hybrid between a Pika Connection and a Twisted Protocol. Allows using + Twisted's non-blocking connectTCP/connectSSL methods for connecting to the + server. + + It has one caveat: TwistedProtocolConnection objects have a ready + instance variable that's a Deferred which fires when the connection is + ready to be used (the initial AMQP handshaking has been done). You *have* + to wait for this Deferred to fire before requesting a channel. + + Since it's Twisted handling connection establishing it does not accept + connect callbacks, you have to implement that within Twisted. Also remember + that the host, port and ssl values of the connection parameters are ignored + because, yet again, it's Twisted who manages the connection. + + """ + + def __init__(self, parameters=None, on_close_callback=None): + self.ready = defer.Deferred() + super(TwistedProtocolConnection, self).__init__( + parameters=parameters, + on_open_callback=self.connectionReady, + on_open_error_callback=self.connectionFailed, + on_close_callback=on_close_callback, + ioloop=IOLoopReactorAdapter(self, reactor), + stop_ioloop_on_close=False) + + def connect(self): + # The connection is open asynchronously by Twisted, so skip the whole + # connect() part, except for setting the connection state + self._set_connection_state(self.CONNECTION_INIT) + + def _adapter_connect(self): + # Should never be called, as we override connect() and leave the + # building of a TCP connection to Twisted, but implement anyway to keep + # the interface + return False + + def _adapter_disconnect(self): + # Disconnect from the server + self.transport.loseConnection() + + def _flush_outbound(self): + """Override BaseConnection._flush_outbound to send all bufferred data + the Twisted way, by writing to the transport. No need for buffering, + Twisted handles that for us. + """ + while self.outbound_buffer: + self.transport.write(self.outbound_buffer.popleft()) + + def channel(self, channel_number=None): + """Create a new channel with the next available channel number or pass + in a channel number to use. Must be non-zero if you would like to + specify but it is recommended that you let Pika manage the channel + numbers. + + Return a Deferred that fires with an instance of a wrapper around the + Pika Channel class. + + :param int channel_number: The channel number to use, defaults to the + next available. + + """ + d = defer.Deferred() + base_connection.BaseConnection.channel(self, d.callback, channel_number) + return d.addCallback(TwistedChannel) + + # IProtocol methods + + def dataReceived(self, data): + # Pass the bytes to Pika for parsing + self._on_data_available(data) + + def connectionLost(self, reason): + # Let the caller know there's been an error + d, self.ready = self.ready, None + if d: + d.errback(reason) + + def makeConnection(self, transport): + self.transport = transport + self.connectionMade() + + def connectionMade(self): + # Tell everyone we're connected + self._on_connected() + + # Our own methods + + def connectionReady(self, res): + d, self.ready = self.ready, None + if d: + d.callback(res) + + def connectionFailed(self, connection_unused, error_message=None): + d, self.ready = self.ready, None + if d: + attempts = self.params.connection_attempts + exc = exceptions.AMQPConnectionError(attempts) + d.errback(exc) diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/pika/amqp_object.py b/NodeRed/NodeRedFiles/pika-0.13.1/pika/amqp_object.py new file mode 100644 index 000000000..576a2c412 --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/pika/amqp_object.py @@ -0,0 +1,66 @@ +"""Base classes that are extended by low level AMQP frames and higher level +AMQP classes and methods. + +""" + + +class AMQPObject(object): + """Base object that is extended by AMQP low level frames and AMQP classes + and methods. + + """ + NAME = 'AMQPObject' + INDEX = None + + def __repr__(self): + items = list() + for key, value in self.__dict__.items(): + if getattr(self.__class__, key, None) != value: + items.append('%s=%s' % (key, value)) + if not items: + return "<%s>" % self.NAME + return "<%s(%s)>" % (self.NAME, sorted(items)) + + +class Class(AMQPObject): + """Is extended by AMQP classes""" + NAME = 'Unextended Class' + + +class Method(AMQPObject): + """Is extended by AMQP methods""" + NAME = 'Unextended Method' + synchronous = False + + def _set_content(self, properties, body): + """If the method is a content frame, set the properties and body to + be carried as attributes of the class. + + :param pika.frame.Properties properties: AMQP Basic Properties + :param body: The message body + :type body: str or unicode + + """ + self._properties = properties + self._body = body + + def get_properties(self): + """Return the properties if they are set. + + :rtype: pika.frame.Properties + + """ + return self._properties + + def get_body(self): + """Return the message body if it is set. + + :rtype: str|unicode + + """ + return self._body + + +class Properties(AMQPObject): + """Class to encompass message properties (AMQP Basic.Properties)""" + NAME = 'Unextended Properties' diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/pika/callback.py b/NodeRed/NodeRedFiles/pika-0.13.1/pika/callback.py new file mode 100644 index 000000000..6ac58bd95 --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/pika/callback.py @@ -0,0 +1,410 @@ +"""Callback management class, common area for keeping track of all callbacks in +the Pika stack. + +""" +import functools +import logging + +from pika import frame +from pika import amqp_object +from pika.compat import xrange, canonical_str + +LOGGER = logging.getLogger(__name__) + + +def name_or_value(value): + """Will take Frame objects, classes, etc and attempt to return a valid + string identifier for them. + + :param value: The value to sanitize + :type value: pika.amqp_object.AMQPObject|pika.frame.Frame|int|unicode|str + :rtype: str + + """ + # Is it subclass of AMQPObject + try: + if issubclass(value, amqp_object.AMQPObject): + return value.NAME + except TypeError: + pass + + # Is it a Pika frame object? + if isinstance(value, frame.Method): + return value.method.NAME + + # Is it a Pika frame object (go after Method since Method extends this) + if isinstance(value, amqp_object.AMQPObject): + return value.NAME + + # Cast the value to a str (python 2 and python 3); encoding as UTF-8 on Python 2 + return canonical_str(value) + + +def sanitize_prefix(function): + """Automatically call name_or_value on the prefix passed in.""" + + @functools.wraps(function) + def wrapper(*args, **kwargs): + args = list(args) + offset = 1 + if 'prefix' in kwargs: + kwargs['prefix'] = name_or_value(kwargs['prefix']) + elif len(args) - 1 >= offset: + args[offset] = name_or_value(args[offset]) + offset += 1 + if 'key' in kwargs: + kwargs['key'] = name_or_value(kwargs['key']) + elif len(args) - 1 >= offset: + args[offset] = name_or_value(args[offset]) + + return function(*tuple(args), **kwargs) + + return wrapper + + +def check_for_prefix_and_key(function): + """Automatically return false if the key or prefix is not in the callbacks + for the instance. + + """ + + @functools.wraps(function) + def wrapper(*args, **kwargs): + offset = 1 + # Sanitize the prefix + if 'prefix' in kwargs: + prefix = name_or_value(kwargs['prefix']) + else: + prefix = name_or_value(args[offset]) + offset += 1 + + # Make sure to sanitize the key as well + if 'key' in kwargs: + key = name_or_value(kwargs['key']) + else: + key = name_or_value(args[offset]) + + # Make sure prefix and key are in the stack + if prefix not in args[0]._stack or key not in args[0]._stack[prefix]: + return False + + # Execute the method + return function(*args, **kwargs) + + return wrapper + + +class CallbackManager(object): + """CallbackManager is a global callback system designed to be a single place + where Pika can manage callbacks and process them. It should be referenced + by the CallbackManager.instance() method instead of constructing new + instances of it. + + """ + CALLS = 'calls' + ARGUMENTS = 'arguments' + DUPLICATE_WARNING = 'Duplicate callback found for "%s:%s"' + CALLBACK = 'callback' + ONE_SHOT = 'one_shot' + ONLY_CALLER = 'only' + + def __init__(self): + """Create an instance of the CallbackManager""" + self._stack = dict() + + @sanitize_prefix + def add(self, prefix, key, callback, + one_shot=True, + only_caller=None, + arguments=None): + """Add a callback to the stack for the specified key. If the call is + specified as one_shot, it will be removed after being fired + + The prefix is usually the channel number but the class is generic + and prefix and key may be any value. If you pass in only_caller + CallbackManager will restrict processing of the callback to only + the calling function/object that you specify. + + :param prefix: Categorize the callback + :type prefix: str or int + :param key: The key for the callback + :type key: object or str or dict + :param method callback: The callback to call + :param bool one_shot: Remove this callback after it is called + :param object only_caller: Only allow one_caller value to call the + event that fires the callback. + :param dict arguments: Arguments to validate when processing + :rtype: tuple(prefix, key) + + """ + # Prep the stack + if prefix not in self._stack: + self._stack[prefix] = dict() + + if key not in self._stack[prefix]: + self._stack[prefix][key] = list() + + # Check for a duplicate + for callback_dict in self._stack[prefix][key]: + if (callback_dict[self.CALLBACK] == callback and + callback_dict[self.ARGUMENTS] == arguments and + callback_dict[self.ONLY_CALLER] == only_caller): + if callback_dict[self.ONE_SHOT] is True: + callback_dict[self.CALLS] += 1 + LOGGER.debug('Incremented callback reference counter: %r', + callback_dict) + else: + LOGGER.warning(self.DUPLICATE_WARNING, prefix, key) + return prefix, key + + # Create the callback dictionary + callback_dict = self._callback_dict(callback, one_shot, only_caller, + arguments) + self._stack[prefix][key].append(callback_dict) + LOGGER.debug('Added: %r', callback_dict) + return prefix, key + + def clear(self): + """Clear all the callbacks if there are any defined.""" + self._stack = dict() + LOGGER.debug('Callbacks cleared') + + @sanitize_prefix + def cleanup(self, prefix): + """Remove all callbacks from the stack by a prefix. Returns True + if keys were there to be removed + + :param str or int prefix: The prefix for keeping track of callbacks with + :rtype: bool + + """ + LOGGER.debug('Clearing out %r from the stack', prefix) + if prefix not in self._stack or not self._stack[prefix]: + return False + del self._stack[prefix] + return True + + @sanitize_prefix + def pending(self, prefix, key): + """Return count of callbacks for a given prefix or key or None + + :param prefix: Categorize the callback + :type prefix: str or int + :param key: The key for the callback + :type key: object or str or dict + :rtype: None or int + + """ + if not prefix in self._stack or not key in self._stack[prefix]: + return None + return len(self._stack[prefix][key]) + + @sanitize_prefix + @check_for_prefix_and_key + def process(self, prefix, key, caller, *args, **keywords): + """Run through and process all the callbacks for the specified keys. + Caller should be specified at all times so that callbacks which + require a specific function to call CallbackManager.process will + not be processed. + + :param prefix: Categorize the callback + :type prefix: str or int + :param key: The key for the callback + :type key: object or str or dict + :param object caller: Who is firing the event + :param list args: Any optional arguments + :param dict keywords: Optional keyword arguments + :rtype: bool + + """ + LOGGER.debug('Processing %s:%s', prefix, key) + if prefix not in self._stack or key not in self._stack[prefix]: + return False + + callbacks = list() + # Check each callback, append it to the list if it should be called + for callback_dict in list(self._stack[prefix][key]): + if self._should_process_callback(callback_dict, caller, list(args)): + callbacks.append(callback_dict[self.CALLBACK]) + if callback_dict[self.ONE_SHOT]: + self._use_one_shot_callback(prefix, key, callback_dict) + + # Call each callback + for callback in callbacks: + LOGGER.debug('Calling %s for "%s:%s"', callback, prefix, key) + try: + callback(*args, **keywords) + except: + LOGGER.exception('Calling %s for "%s:%s" failed', callback, + prefix, key) + raise + return True + + @sanitize_prefix + @check_for_prefix_and_key + def remove(self, prefix, key, callback_value=None, arguments=None): + """Remove a callback from the stack by prefix, key and optionally + the callback itself. If you only pass in prefix and key, all + callbacks for that prefix and key will be removed. + + :param str or int prefix: The prefix for keeping track of callbacks with + :param str key: The callback key + :param method callback_value: The method defined to call on callback + :param dict arguments: Optional arguments to check + :rtype: bool + + """ + if callback_value: + offsets_to_remove = list() + for offset in xrange(len(self._stack[prefix][key]), 0, -1): + callback_dict = self._stack[prefix][key][offset - 1] + + if (callback_dict[self.CALLBACK] == callback_value and + self._arguments_match(callback_dict, [arguments])): + offsets_to_remove.append(offset - 1) + + for offset in offsets_to_remove: + try: + LOGGER.debug('Removing callback #%i: %r', offset, + self._stack[prefix][key][offset]) + del self._stack[prefix][key][offset] + except KeyError: + pass + + self._cleanup_callback_dict(prefix, key) + return True + + @sanitize_prefix + @check_for_prefix_and_key + def remove_all(self, prefix, key): + """Remove all callbacks for the specified prefix and key. + + :param str prefix: The prefix for keeping track of callbacks with + :param str key: The callback key + + """ + del self._stack[prefix][key] + self._cleanup_callback_dict(prefix, key) + + def _arguments_match(self, callback_dict, args): + """Validate if the arguments passed in match the expected arguments in + the callback_dict. We expect this to be a frame passed in to *args for + process or passed in as a list from remove. + + :param dict callback_dict: The callback dictionary to evaluate against + :param list args: The arguments passed in as a list + + """ + if callback_dict[self.ARGUMENTS] is None: + return True + if not args: + return False + if isinstance(args[0], dict): + return self._dict_arguments_match(args[0], + callback_dict[self.ARGUMENTS]) + return self._obj_arguments_match(args[0].method + if hasattr(args[0], 'method') else + args[0], callback_dict[self.ARGUMENTS]) + + def _callback_dict(self, callback, one_shot, only_caller, arguments): + """Return the callback dictionary. + + :param method callback: The callback to call + :param bool one_shot: Remove this callback after it is called + :param object only_caller: Only allow one_caller value to call the + event that fires the callback. + :rtype: dict + + """ + value = { + self.CALLBACK: callback, + self.ONE_SHOT: one_shot, + self.ONLY_CALLER: only_caller, + self.ARGUMENTS: arguments + } + if one_shot: + value[self.CALLS] = 1 + return value + + def _cleanup_callback_dict(self, prefix, key=None): + """Remove empty dict nodes in the callback stack. + + :param str or int prefix: The prefix for keeping track of callbacks with + :param str key: The callback key + + """ + if key and key in self._stack[prefix] and not self._stack[prefix][key]: + del self._stack[prefix][key] + if prefix in self._stack and not self._stack[prefix]: + del self._stack[prefix] + + @staticmethod + def _dict_arguments_match(value, expectation): + """Checks an dict to see if it has attributes that meet the expectation. + + :param dict value: The dict to evaluate + :param dict expectation: The values to check against + :rtype: bool + + """ + LOGGER.debug('Comparing %r to %r', value, expectation) + for key in expectation: + if value.get(key) != expectation[key]: + LOGGER.debug('Values in dict do not match for %s', key) + return False + return True + + @staticmethod + def _obj_arguments_match(value, expectation): + """Checks an object to see if it has attributes that meet the + expectation. + + :param object value: The object to evaluate + :param dict expectation: The values to check against + :rtype: bool + + """ + for key in expectation: + if not hasattr(value, key): + LOGGER.debug('%r does not have required attribute: %s', + type(value), key) + return False + if getattr(value, key) != expectation[key]: + LOGGER.debug('Values in %s do not match for %s', type(value), + key) + return False + return True + + def _should_process_callback(self, callback_dict, caller, args): + """Returns True if the callback should be processed. + + :param dict callback_dict: The callback configuration + :param object caller: Who is firing the event + :param list args: Any optional arguments + :rtype: bool + + """ + if not self._arguments_match(callback_dict, args): + LOGGER.debug('Arguments do not match for %r, %r', callback_dict, + args) + return False + return (callback_dict[self.ONLY_CALLER] is None or + (callback_dict[self.ONLY_CALLER] and + callback_dict[self.ONLY_CALLER] == caller)) + + def _use_one_shot_callback(self, prefix, key, callback_dict): + """Process the one-shot callback, decrementing the use counter and + removing it from the stack if it's now been fully used. + + :param str or int prefix: The prefix for keeping track of callbacks with + :param str key: The callback key + :param dict callback_dict: The callback dict to process + + """ + LOGGER.debug('Processing use of oneshot callback') + callback_dict[self.CALLS] -= 1 + LOGGER.debug('%i registered uses left', callback_dict[self.CALLS]) + + if callback_dict[self.CALLS] <= 0: + self.remove(prefix, key, callback_dict[self.CALLBACK], + callback_dict[self.ARGUMENTS]) diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/pika/channel.py b/NodeRed/NodeRedFiles/pika-0.13.1/pika/channel.py new file mode 100644 index 000000000..745e47bdd --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/pika/channel.py @@ -0,0 +1,1436 @@ +"""The Channel class provides a wrapper for interacting with RabbitMQ +implementing the methods and behaviors for an AMQP Channel. + +""" + +import collections +import logging +import uuid + +import pika.frame as frame +import pika.exceptions as exceptions +import pika.spec as spec +from pika.utils import is_callable +from pika.compat import unicode_type, dictkeys, is_integer + + +LOGGER = logging.getLogger(__name__) + +MAX_CHANNELS = 65535 # per AMQP 0.9.1 spec. + + +class Channel(object): + """A Channel is the primary communication method for interacting with + RabbitMQ. It is recommended that you do not directly invoke + the creation of a channel object in your application code but rather + construct the a channel by calling the active connection's channel() + method. + + """ + + # Disable pyling messages concerning "method could be a function" + # pylint: disable=R0201 + + CLOSED = 0 + OPENING = 1 + OPEN = 2 + CLOSING = 3 # client-initiated close in progress + + _STATE_NAMES = { + CLOSED: 'CLOSED', + OPENING: 'OPENING', + OPEN: 'OPEN', + CLOSING: 'CLOSING' + } + + _ON_CHANNEL_CLEANUP_CB_KEY = '_on_channel_cleanup' + + def __init__(self, connection, channel_number, on_open_callback): + """Create a new instance of the Channel + + :param pika.connection.Connection connection: The connection + :param int channel_number: The channel number for this instance + :param callable on_open_callback: The callback to call on channel open + + """ + if not isinstance(channel_number, int): + raise exceptions.InvalidChannelNumber + self.channel_number = channel_number + self.callbacks = connection.callbacks + self.connection = connection + + # Initially, flow is assumed to be active + self.flow_active = True + + self._content_assembler = ContentFrameAssembler() + + self._blocked = collections.deque(list()) + self._blocking = None + self._has_on_flow_callback = False + self._cancelled = set() + self._consumers = dict() + self._consumers_with_noack = set() + self._on_flowok_callback = None + self._on_getok_callback = None + self._on_openok_callback = on_open_callback + self._state = self.CLOSED + + # We save the closing reason code and text to be passed to + # on-channel-close callback at closing of the channel. Channel.close + # stores the given reply_code/reply_text if the channel was in OPEN or + # OPENING states. An incoming Channel.Close AMQP method from broker will + # override this value. And a sudden loss of connection has the highest + # prececence to override it. + self._closing_code_and_text = (0, '') + + # opaque cookie value set by wrapper layer (e.g., BlockingConnection) + # via _set_cookie + self._cookie = None + + def __int__(self): + """Return the channel object as its channel number + + :rtype: int + + """ + return self.channel_number + + def __repr__(self): + return '<%s number=%s %s conn=%r>' % (self.__class__.__name__, + self.channel_number, + self._STATE_NAMES[self._state], + self.connection) + + def add_callback(self, callback, replies, one_shot=True): + """Pass in a callback handler and a list replies from the + RabbitMQ broker which you'd like the callback notified of. Callbacks + should allow for the frame parameter to be passed in. + + :param callable callback: The callback to call + :param list replies: The replies to get a callback for + :param bool one_shot: Only handle the first type callback + + """ + for reply in replies: + self.callbacks.add(self.channel_number, reply, callback, one_shot) + + def add_on_cancel_callback(self, callback): + """Pass a callback function that will be called when the basic_cancel + is sent by the server. The callback function should receive a frame + parameter. + + :param callable callback: The callback to call on Basic.Cancel from + broker + + """ + self.callbacks.add(self.channel_number, spec.Basic.Cancel, callback, + False) + + def add_on_close_callback(self, callback): + """Pass a callback function that will be called when the channel is + closed. The callback function will receive the channel, the + reply_code (int) and the reply_text (string) describing why the channel was + closed. + + If the channel is closed by broker via Channel.Close, the callback will + receive the reply_code/reply_text provided by the broker. + + If channel closing is initiated by user (either directly of indirectly + by closing a connection containing the channel) and closing + concludes gracefully without Channel.Close from the broker and without + loss of connection, the callback will receive 0 as reply_code and empty + string as reply_text. + + If channel was closed due to loss of connection, the callback will + receive reply_code and reply_text representing the loss of connection. + + :param callable callback: The callback, having the signature: + callback(Channel, int reply_code, str reply_text) + + """ + self.callbacks.add(self.channel_number, '_on_channel_close', callback, + False, self) + + def add_on_flow_callback(self, callback): + """Pass a callback function that will be called when Channel.Flow is + called by the remote server. Note that newer versions of RabbitMQ + will not issue this but instead use TCP backpressure + + :param callable callback: The callback function + + """ + self._has_on_flow_callback = True + self.callbacks.add(self.channel_number, spec.Channel.Flow, callback, + False) + + def add_on_return_callback(self, callback): + """Pass a callback function that will be called when basic_publish as + sent a message that has been rejected and returned by the server. + + :param callable callback: The function to call, having the signature + callback(channel, method, properties, body) + where + channel: pika.Channel + method: pika.spec.Basic.Return + properties: pika.spec.BasicProperties + body: str, unicode, or bytes (python 3.x) + + """ + self.callbacks.add(self.channel_number, '_on_return', callback, False) + + def basic_ack(self, delivery_tag=0, multiple=False): + """Acknowledge one or more messages. When sent by the client, this + method acknowledges one or more messages delivered via the Deliver or + Get-Ok methods. When sent by server, this method acknowledges one or + more messages published with the Publish method on a channel in + confirm mode. The acknowledgement can be for a single message or a + set of messages up to and including a specific message. + + :param integer delivery_tag: int/long The server-assigned delivery tag + :param bool multiple: If set to True, the delivery tag is treated as + "up to and including", so that multiple messages + can be acknowledged with a single method. If set + to False, the delivery tag refers to a single + message. If the multiple field is 1, and the + delivery tag is zero, this indicates + acknowledgement of all outstanding messages. + """ + if not self.is_open: + raise exceptions.ChannelClosed() + return self._send_method(spec.Basic.Ack(delivery_tag, multiple)) + + def basic_cancel(self, callback=None, consumer_tag='', nowait=False): + """This method cancels a consumer. This does not affect already + delivered messages, but it does mean the server will not send any more + messages for that consumer. The client may receive an arbitrary number + of messages in between sending the cancel method and receiving the + cancel-ok reply. It may also be sent from the server to the client in + the event of the consumer being unexpectedly cancelled (i.e. cancelled + for any reason other than the server receiving the corresponding + basic.cancel from the client). This allows clients to be notified of + the loss of consumers due to events such as queue deletion. + + :param callable callback: Callback to call for a Basic.CancelOk + response; MUST be None when nowait=True. MUST be callable when + nowait=False. + :param str consumer_tag: Identifier for the consumer + :param bool nowait: Do not expect a Basic.CancelOk response + + :raises ValueError: + + """ + self._validate_channel_and_callback(callback) + + if nowait: + if callback is not None: + raise ValueError( + 'Completion callback must be None when nowait=True') + else: + if callback is None: + raise ValueError( + 'Must have completion callback with nowait=False') + + if consumer_tag in self._cancelled: + # We check for cancelled first, because basic_cancel removes + # consumers closed with nowait from self._consumers + LOGGER.warning('basic_cancel - consumer is already cancelling: %s', + consumer_tag) + return + + if consumer_tag not in self._consumers: + # Could be cancelled by user or broker earlier + LOGGER.warning('basic_cancel - consumer not found: %s', + consumer_tag) + return + + LOGGER.debug('Cancelling consumer: %s (nowait=%s)', + consumer_tag, nowait) + + if nowait: + # This is our last opportunity while the channel is open to remove + # this consumer callback and help gc; unfortunately, this consumer's + # self._cancelled and self._consumers_with_noack (if any) entries + # will persist until the channel is closed. + del self._consumers[consumer_tag] + + if callback is not None: + if nowait: + raise ValueError('Cannot pass a callback if nowait is True') + self.callbacks.add(self.channel_number, spec.Basic.CancelOk, + callback) + + self._cancelled.add(consumer_tag) + + self._rpc(spec.Basic.Cancel(consumer_tag=consumer_tag, nowait=nowait), + self._on_cancelok if not nowait else None, + [(spec.Basic.CancelOk, {'consumer_tag': consumer_tag})] if + nowait is False else []) + + def basic_consume(self, consumer_callback, + queue='', + no_ack=False, + exclusive=False, + consumer_tag=None, + arguments=None): + """Sends the AMQP 0-9-1 command Basic.Consume to the broker and binds messages + for the consumer_tag to the consumer callback. If you do not pass in + a consumer_tag, one will be automatically generated for you. Returns + the consumer tag. + + For more information on basic_consume, see: + Tutorial 2 at http://www.rabbitmq.com/getstarted.html + http://www.rabbitmq.com/confirms.html + http://www.rabbitmq.com/amqp-0-9-1-reference.html#basic.consume + + + :param callable consumer_callback: The function to call when consuming + with the signature consumer_callback(channel, method, properties, + body), where + channel: pika.Channel + method: pika.spec.Basic.Deliver + properties: pika.spec.BasicProperties + body: str, unicode, or bytes (python 3.x) + + :param queue: The queue to consume from + :type queue: str or unicode + :param bool no_ack: if set to True, automatic acknowledgement mode will be used + (see http://www.rabbitmq.com/confirms.html) + :param bool exclusive: Don't allow other consumers on the queue + :param consumer_tag: Specify your own consumer tag + :type consumer_tag: str or unicode + :param dict arguments: Custom key/value pair arguments for the consumer + :rtype: str + + """ + self._validate_channel_and_callback(consumer_callback) + + # If a consumer tag was not passed, create one + if not consumer_tag: + consumer_tag = self._generate_consumer_tag() + + if consumer_tag in self._consumers or consumer_tag in self._cancelled: + raise exceptions.DuplicateConsumerTag(consumer_tag) + + if no_ack: + self._consumers_with_noack.add(consumer_tag) + + self._consumers[consumer_tag] = consumer_callback + self._rpc(spec.Basic.Consume(queue=queue, + consumer_tag=consumer_tag, + no_ack=no_ack, + exclusive=exclusive, + arguments=arguments or dict()), + self._on_eventok, [(spec.Basic.ConsumeOk, + {'consumer_tag': consumer_tag})]) + + return consumer_tag + + def _generate_consumer_tag(self): + """Generate a consumer tag + + NOTE: this protected method may be called by derived classes + + :returns: consumer tag + :rtype: str + """ + return 'ctag%i.%s' % (self.channel_number, + uuid.uuid4().hex) + + def basic_get(self, callback=None, queue='', no_ack=False): + """Get a single message from the AMQP broker. If you want to + be notified of Basic.GetEmpty, use the Channel.add_callback method + adding your Basic.GetEmpty callback which should expect only one + parameter, frame. Due to implementation details, this cannot be called + a second time until the callback is executed. For more information on + basic_get and its parameters, see: + + http://www.rabbitmq.com/amqp-0-9-1-reference.html#basic.get + + :param callable callback: The callback to call with a message that has + the signature callback(channel, method, properties, body), where: + channel: pika.Channel + method: pika.spec.Basic.GetOk + properties: pika.spec.BasicProperties + body: str, unicode, or bytes (python 3.x) + :param queue: The queue to get a message from + :type queue: str or unicode + :param bool no_ack: Tell the broker to not expect a reply + + """ + self._validate_channel_and_callback(callback) + # TODO Is basic_get meaningful when callback is None? + if self._on_getok_callback is not None: + raise exceptions.DuplicateGetOkCallback() + self._on_getok_callback = callback + # TODO Strangely, not using _rpc for the synchronous Basic.Get. Would + # need to extend _rpc to handle Basic.GetOk method, header, and body + # frames (or similar) + self._send_method(spec.Basic.Get(queue=queue, no_ack=no_ack)) + + def basic_nack(self, delivery_tag=None, multiple=False, requeue=True): + """This method allows a client to reject one or more incoming messages. + It can be used to interrupt and cancel large incoming messages, or + return untreatable messages to their original queue. + + :param integer delivery-tag: int/long The server-assigned delivery tag + :param bool multiple: If set to True, the delivery tag is treated as + "up to and including", so that multiple messages + can be acknowledged with a single method. If set + to False, the delivery tag refers to a single + message. If the multiple field is 1, and the + delivery tag is zero, this indicates + acknowledgement of all outstanding messages. + :param bool requeue: If requeue is true, the server will attempt to + requeue the message. If requeue is false or the + requeue attempt fails the messages are discarded or + dead-lettered. + + """ + if not self.is_open: + raise exceptions.ChannelClosed() + return self._send_method(spec.Basic.Nack(delivery_tag, multiple, + requeue)) + + def basic_publish(self, exchange, routing_key, body, + properties=None, + mandatory=False, + immediate=False): + """Publish to the channel with the given exchange, routing key and body. + For more information on basic_publish and what the parameters do, see: + + http://www.rabbitmq.com/amqp-0-9-1-reference.html#basic.publish + + :param exchange: The exchange to publish to + :type exchange: str or unicode + :param routing_key: The routing key to bind on + :type routing_key: str or unicode + :param body: The message body + :type body: str or unicode + :param pika.spec.BasicProperties properties: Basic.properties + :param bool mandatory: The mandatory flag + :param bool immediate: The immediate flag + + """ + if not self.is_open: + raise exceptions.ChannelClosed() + if immediate: + LOGGER.warning('The immediate flag is deprecated in RabbitMQ') + if isinstance(body, unicode_type): + body = body.encode('utf-8') + properties = properties or spec.BasicProperties() + self._send_method(spec.Basic.Publish(exchange=exchange, + routing_key=routing_key, + mandatory=mandatory, + immediate=immediate), + (properties, body)) + + def basic_qos(self, + callback=None, + prefetch_size=0, + prefetch_count=0, + all_channels=False): + """Specify quality of service. This method requests a specific quality + of service. The QoS can be specified for the current channel or for all + channels on the connection. The client can request that messages be sent + in advance so that when the client finishes processing a message, the + following message is already held locally, rather than needing to be + sent down the channel. Prefetching gives a performance improvement. + + :param callable callback: The callback to call for Basic.QosOk response + :param int prefetch_size: This field specifies the prefetch window + size. The server will send a message in + advance if it is equal to or smaller in size + than the available prefetch size (and also + falls into other prefetch limits). May be set + to zero, meaning "no specific limit", + although other prefetch limits may still + apply. The prefetch-size is ignored if the + no-ack option is set. + :param int prefetch_count: Specifies a prefetch window in terms of whole + messages. This field may be used in + combination with the prefetch-size field; a + message will only be sent in advance if both + prefetch windows (and those at the channel + and connection level) allow it. The + prefetch-count is ignored if the no-ack + option is set. + :param bool all_channels: Should the QoS apply to all channels + + """ + self._validate_channel_and_callback(callback) + return self._rpc(spec.Basic.Qos(prefetch_size, prefetch_count, + all_channels), + callback, [spec.Basic.QosOk]) + + def basic_reject(self, delivery_tag, requeue=True): + """Reject an incoming message. This method allows a client to reject a + message. It can be used to interrupt and cancel large incoming messages, + or return untreatable messages to their original queue. + + :param integer delivery-tag: int/long The server-assigned delivery tag + :param bool requeue: If requeue is true, the server will attempt to + requeue the message. If requeue is false or the + requeue attempt fails the messages are discarded or + dead-lettered. + :raises: TypeError + + """ + if not self.is_open: + raise exceptions.ChannelClosed() + if not is_integer(delivery_tag): + raise TypeError('delivery_tag must be an integer') + return self._send_method(spec.Basic.Reject(delivery_tag, requeue)) + + def basic_recover(self, callback=None, requeue=False): + """This method asks the server to redeliver all unacknowledged messages + on a specified channel. Zero or more messages may be redelivered. This + method replaces the asynchronous Recover. + + :param callable callback: Callback to call when receiving + Basic.RecoverOk + :param bool requeue: If False, the message will be redelivered to the + original recipient. If True, the server will + attempt to requeue the message, potentially then + delivering it to an alternative subscriber. + + """ + self._validate_channel_and_callback(callback) + return self._rpc(spec.Basic.Recover(requeue), callback, + [spec.Basic.RecoverOk]) + + def close(self, reply_code=0, reply_text="Normal shutdown"): + """Invoke a graceful shutdown of the channel with the AMQP Broker. + + If channel is OPENING, transition to CLOSING and suppress the incoming + Channel.OpenOk, if any. + + :param int reply_code: The reason code to send to broker + :param str reply_text: The reason text to send to broker + + :raises ChannelClosed: if channel is already closed + :raises ChannelAlreadyClosing: if channel is already closing + """ + if self.is_closed: + # Whoever is calling `close` might expect the on-channel-close-cb + # to be called, which won't happen when it's already closed + raise exceptions.ChannelClosed('Already closed: %s' % self) + + if self.is_closing: + # Whoever is calling `close` might expect their reply_code and + # reply_text to be sent to broker, which won't happen if we're + # already closing. + raise exceptions.ChannelAlreadyClosing('Already closing: %s' % self) + + # If channel is OPENING, we will transition it to CLOSING state, + # causing the _on_openok method to suppress the OPEN state transition + # and the on-channel-open-callback + + LOGGER.info('Closing channel (%s): %r on %s', + reply_code, reply_text, self) + + for consumer_tag in dictkeys(self._consumers): + if consumer_tag not in self._cancelled: + self.basic_cancel(consumer_tag=consumer_tag, nowait=True) + + # Change state after cancelling consumers to avoid ChannelClosed + # exception from basic_cancel + self._set_state(self.CLOSING) + + self._rpc(spec.Channel.Close(reply_code, reply_text, 0, 0), + self._on_closeok, [spec.Channel.CloseOk]) + + def confirm_delivery(self, callback=None, nowait=False): + """Turn on Confirm mode in the channel. Pass in a callback to be + notified by the Broker when a message has been confirmed as received or + rejected (Basic.Ack, Basic.Nack) from the broker to the publisher. + + For more information see: + http://www.rabbitmq.com/extensions.html#confirms + + :param callable callback: The callback for delivery confirmations that + has the following signature: callback(pika.frame.Method), where + method_frame contains either method `spec.Basic.Ack` or + `spec.Basic.Nack`. + :param bool nowait: Do not send a reply frame (Confirm.SelectOk) + + """ + self._validate_channel_and_callback(callback) + + # TODO confirm_deliver should require a callback; it's meaningless + # without a user callback to receieve Basic.Ack/Basic.Nack notifications + + if not (self.connection.publisher_confirms and + self.connection.basic_nack): + raise exceptions.MethodNotImplemented('Not Supported on Server') + + # Add the ack and nack callbacks + if callback is not None: + self.callbacks.add(self.channel_number, spec.Basic.Ack, callback, + False) + self.callbacks.add(self.channel_number, spec.Basic.Nack, callback, + False) + + # Send the RPC command + self._rpc(spec.Confirm.Select(nowait), + self._on_selectok if not nowait else None, + [spec.Confirm.SelectOk] if nowait is False else []) + + @property + def consumer_tags(self): + """Property method that returns a list of currently active consumers + + :rtype: list + + """ + return dictkeys(self._consumers) + + def exchange_bind(self, + callback=None, + destination=None, + source=None, + routing_key='', + nowait=False, + arguments=None): + """Bind an exchange to another exchange. + + :param callable callback: The callback to call on Exchange.BindOk; MUST + be None when nowait=True + :param destination: The destination exchange to bind + :type destination: str or unicode + :param source: The source exchange to bind to + :type source: str or unicode + :param routing_key: The routing key to bind on + :type routing_key: str or unicode + :param bool nowait: Do not wait for an Exchange.BindOk + :param dict arguments: Custom key/value pair arguments for the binding + + """ + self._validate_channel_and_callback(callback) + return self._rpc(spec.Exchange.Bind(0, destination, source, routing_key, + nowait, arguments or dict()), + callback, [spec.Exchange.BindOk] if nowait is False + else []) + + def exchange_declare(self, + callback=None, + exchange=None, + exchange_type='direct', + passive=False, + durable=False, + auto_delete=False, + internal=False, + nowait=False, + arguments=None): + """This method creates an exchange if it does not already exist, and if + the exchange exists, verifies that it is of the correct and expected + class. + + If passive set, the server will reply with Declare-Ok if the exchange + already exists with the same name, and raise an error if not and if the + exchange does not already exist, the server MUST raise a channel + exception with reply code 404 (not found). + + :param callable callback: Call this method on Exchange.DeclareOk; MUST + be None when nowait=True + :param exchange: The exchange name consists of a non-empty + :type exchange: str or unicode + sequence of these characters: letters, + digits, hyphen, underscore, period, or + colon. + :param str exchange_type: The exchange type to use + :param bool passive: Perform a declare or just check to see if it exists + :param bool durable: Survive a reboot of RabbitMQ + :param bool auto_delete: Remove when no more queues are bound to it + :param bool internal: Can only be published to by other exchanges + :param bool nowait: Do not expect an Exchange.DeclareOk response + :param dict arguments: Custom key/value pair arguments for the exchange + + """ + self._validate_channel_and_callback(callback) + + return self._rpc(spec.Exchange.Declare(0, exchange, exchange_type, + passive, durable, auto_delete, + internal, nowait, + arguments or dict()), + callback, + [spec.Exchange.DeclareOk] if nowait is False else []) + + def exchange_delete(self, + callback=None, + exchange=None, + if_unused=False, + nowait=False): + """Delete the exchange. + + :param callable callback: The function to call on Exchange.DeleteOk; + MUST be None when nowait=True. + :param exchange: The exchange name + :type exchange: str or unicode + :param bool if_unused: only delete if the exchange is unused + :param bool nowait: Do not wait for an Exchange.DeleteOk + + """ + self._validate_channel_and_callback(callback) + return self._rpc(spec.Exchange.Delete(0, exchange, if_unused, nowait), + callback, [spec.Exchange.DeleteOk] if nowait is False + else []) + + def exchange_unbind(self, + callback=None, + destination=None, + source=None, + routing_key='', + nowait=False, + arguments=None): + """Unbind an exchange from another exchange. + + :param callable callback: The callback to call on Exchange.UnbindOk; + MUST be None when nowait=True. + :param destination: The destination exchange to unbind + :type destination: str or unicode + :param source: The source exchange to unbind from + :type source: str or unicode + :param routing_key: The routing key to unbind + :type routing_key: str or unicode + :param bool nowait: Do not wait for an Exchange.UnbindOk + :param dict arguments: Custom key/value pair arguments for the binding + + """ + self._validate_channel_and_callback(callback) + return self._rpc(spec.Exchange.Unbind(0, destination, source, + routing_key, nowait, arguments), + callback, + [spec.Exchange.UnbindOk] if nowait is False else []) + + def flow(self, callback, active): + """Turn Channel flow control off and on. Pass a callback to be notified + of the response from the server. active is a bool. Callback should + expect a bool in response indicating channel flow state. For more + information, please reference: + + http://www.rabbitmq.com/amqp-0-9-1-reference.html#channel.flow + + :param callable callback: The callback to call upon completion + :param bool active: Turn flow on or off + + """ + self._validate_channel_and_callback(callback) + self._on_flowok_callback = callback + self._rpc(spec.Channel.Flow(active), self._on_flowok, + [spec.Channel.FlowOk]) + + @property + def is_closed(self): + """Returns True if the channel is closed. + + :rtype: bool + + """ + return self._state == self.CLOSED + + @property + def is_closing(self): + """Returns True if client-initiated closing of the channel is in + progress. + + :rtype: bool + + """ + return self._state == self.CLOSING + + @property + def is_open(self): + """Returns True if the channel is open. + + :rtype: bool + + """ + return self._state == self.OPEN + + def open(self): + """Open the channel""" + self._set_state(self.OPENING) + self._add_callbacks() + self._rpc(spec.Channel.Open(), self._on_openok, [spec.Channel.OpenOk]) + + def queue_bind(self, callback, queue, exchange, + routing_key=None, + nowait=False, + arguments=None): + """Bind the queue to the specified exchange + + :param callable callback: The callback to call on Queue.BindOk; + MUST be None when nowait=True. + :param queue: The queue to bind to the exchange + :type queue: str or unicode + :param exchange: The source exchange to bind to + :type exchange: str or unicode + :param routing_key: The routing key to bind on + :type routing_key: str or unicode + :param bool nowait: Do not wait for a Queue.BindOk + :param dict arguments: Custom key/value pair arguments for the binding + + """ + self._validate_channel_and_callback(callback) + replies = [spec.Queue.BindOk] if nowait is False else [] + if routing_key is None: + routing_key = queue + return self._rpc(spec.Queue.Bind(0, queue, exchange, routing_key, + nowait, arguments or dict()), + callback, replies) + + def queue_declare(self, callback, + queue='', + passive=False, + durable=False, + exclusive=False, + auto_delete=False, + nowait=False, + arguments=None): + """Declare queue, create if needed. This method creates or checks a + queue. When creating a new queue the client can specify various + properties that control the durability of the queue and its contents, + and the level of sharing for the queue. + + Leave the queue name empty for a auto-named queue in RabbitMQ + + :param callable callback: callback(pika.frame.Method) for method + Queue.DeclareOk; MUST be None when nowait=True. + :param queue: The queue name + :type queue: str or unicode + :param bool passive: Only check to see if the queue exists + :param bool durable: Survive reboots of the broker + :param bool exclusive: Only allow access by the current connection + :param bool auto_delete: Delete after consumer cancels or disconnects + :param bool nowait: Do not wait for a Queue.DeclareOk + :param dict arguments: Custom key/value arguments for the queue + + """ + if queue: + condition = (spec.Queue.DeclareOk, + {'queue': queue}) + else: + condition = spec.Queue.DeclareOk # pylint: disable=R0204 + replies = [condition] if nowait is False else [] + self._validate_channel_and_callback(callback) + return self._rpc(spec.Queue.Declare(0, queue, passive, durable, + exclusive, auto_delete, nowait, + arguments or dict()), + callback, replies) + + def queue_delete(self, + callback=None, + queue='', + if_unused=False, + if_empty=False, + nowait=False): + """Delete a queue from the broker. + + :param callable callback: The callback to call on Queue.DeleteOk; + MUST be None when nowait=True. + :param queue: The queue to delete + :type queue: str or unicode + :param bool if_unused: only delete if it's unused + :param bool if_empty: only delete if the queue is empty + :param bool nowait: Do not wait for a Queue.DeleteOk + + """ + replies = [spec.Queue.DeleteOk] if nowait is False else [] + self._validate_channel_and_callback(callback) + return self._rpc(spec.Queue.Delete(0, queue, if_unused, if_empty, + nowait), + callback, replies) + + def queue_purge(self, callback=None, queue='', nowait=False): + """Purge all of the messages from the specified queue + + :param callable callback: The callback to call on Queue.PurgeOk; + MUST be None when nowait=True. + :param queue: The queue to purge + :type queue: str or unicode + :param bool nowait: Do not expect a Queue.PurgeOk response + + """ + replies = [spec.Queue.PurgeOk] if nowait is False else [] + self._validate_channel_and_callback(callback) + return self._rpc(spec.Queue.Purge(0, queue, nowait), callback, replies) + + def queue_unbind(self, + callback=None, + queue='', + exchange=None, + routing_key=None, + arguments=None): + """Unbind a queue from an exchange. + + :param callable callback: The callback to call on Queue.UnbindOk + :param queue: The queue to unbind from the exchange + :type queue: str or unicode + :param exchange: The source exchange to bind from + :type exchange: str or unicode + :param routing_key: The routing key to unbind + :type routing_key: str or unicode + :param dict arguments: Custom key/value pair arguments for the binding + + """ + self._validate_channel_and_callback(callback) + if routing_key is None: + routing_key = queue + return self._rpc(spec.Queue.Unbind(0, queue, exchange, routing_key, + arguments or dict()), + callback, [spec.Queue.UnbindOk]) + + def tx_commit(self, callback=None): + """Commit a transaction + + :param callable callback: The callback for delivery confirmations + + """ + self._validate_channel_and_callback(callback) + return self._rpc(spec.Tx.Commit(), callback, [spec.Tx.CommitOk]) + + def tx_rollback(self, callback=None): + """Rollback a transaction. + + :param callable callback: The callback for delivery confirmations + + """ + self._validate_channel_and_callback(callback) + return self._rpc(spec.Tx.Rollback(), callback, [spec.Tx.RollbackOk]) + + def tx_select(self, callback=None): + """Select standard transaction mode. This method sets the channel to use + standard transactions. The client must use this method at least once on + a channel before using the Commit or Rollback methods. + + :param callable callback: The callback for delivery confirmations + + """ + self._validate_channel_and_callback(callback) + return self._rpc(spec.Tx.Select(), callback, [spec.Tx.SelectOk]) + + # Internal methods + + def _add_callbacks(self): + """Callbacks that add the required behavior for a channel when + connecting and connected to a server. + + """ + # Add a callback for Basic.GetEmpty + self.callbacks.add(self.channel_number, spec.Basic.GetEmpty, + self._on_getempty, False) + + # Add a callback for Basic.Cancel + self.callbacks.add(self.channel_number, spec.Basic.Cancel, + self._on_cancel, False) + + # Deprecated in newer versions of RabbitMQ but still register for it + self.callbacks.add(self.channel_number, spec.Channel.Flow, + self._on_flow, False) + + # Add a callback for when the server closes our channel + self.callbacks.add(self.channel_number, spec.Channel.Close, + self._on_close, True) + + def _add_on_cleanup_callback(self, callback): + """For internal use only (e.g., Connection needs to remove closed + channels from its channel container). Pass a callback function that will + be called when the channel is being cleaned up after all channel-close + callbacks callbacks. + + :param callable callback: The callback to call, having the + signature: callback(channel) + + """ + self.callbacks.add(self.channel_number, self._ON_CHANNEL_CLEANUP_CB_KEY, + callback, one_shot=True, only_caller=self) + + def _cleanup(self): + """Remove all consumers and any callbacks for the channel.""" + self.callbacks.process(self.channel_number, + self._ON_CHANNEL_CLEANUP_CB_KEY, self, + self) + self._consumers = dict() + self.callbacks.cleanup(str(self.channel_number)) + self._cookie = None + + def _cleanup_consumer_ref(self, consumer_tag): + """Remove any references to the consumer tag in internal structures + for consumer state. + + :param str consumer_tag: The consumer tag to cleanup + + """ + self._consumers_with_noack.discard(consumer_tag) + self._consumers.pop(consumer_tag, None) + self._cancelled.discard(consumer_tag) + + def _get_cookie(self): + """Used by the wrapper implementation (e.g., `BlockingChannel`) to + retrieve the cookie that it set via `_set_cookie` + + :returns: opaque cookie value that was set via `_set_cookie` + """ + return self._cookie + + def _handle_content_frame(self, frame_value): + """This is invoked by the connection when frames that are not registered + with the CallbackManager have been found. This should only be the case + when the frames are related to content delivery. + + The _content_assembler will be invoked which will return the fully + formed message in three parts when all of the body frames have been + received. + + :param pika.amqp_object.Frame frame_value: The frame to deliver + + """ + try: + response = self._content_assembler.process(frame_value) + except exceptions.UnexpectedFrameError: + self._on_unexpected_frame(frame_value) + return + + if response: + if isinstance(response[0].method, spec.Basic.Deliver): + self._on_deliver(*response) + elif isinstance(response[0].method, spec.Basic.GetOk): + self._on_getok(*response) + elif isinstance(response[0].method, spec.Basic.Return): + self._on_return(*response) + + def _on_cancel(self, method_frame): + """When the broker cancels a consumer, delete it from our internal + dictionary. + + :param pika.frame.Method method_frame: The method frame received + + """ + if method_frame.method.consumer_tag in self._cancelled: + # User-initiated cancel is waiting for Cancel-ok + return + + self._cleanup_consumer_ref(method_frame.method.consumer_tag) + + def _on_cancelok(self, method_frame): + """Called in response to a frame from the Broker when the + client sends Basic.Cancel + + :param pika.frame.Method method_frame: The method frame received + + """ + self._cleanup_consumer_ref(method_frame.method.consumer_tag) + + def _on_close(self, method_frame): + """Handle the case where our channel has been closed for us + + :param pika.frame.Method method_frame: Method frame with Channel.Close + method + + """ + LOGGER.warning('Received remote Channel.Close (%s): %r on %s', + method_frame.method.reply_code, + method_frame.method.reply_text, + self) + + # AMQP 0.9.1 requires CloseOk response to Channel.Close; Note, we should + # not be called when connection is closed + self._send_method(spec.Channel.CloseOk()) + + if self.is_closing: + # Since we already sent Channel.Close, we need to wait for CloseOk + # before cleaning up to avoid a race condition whereby our channel + # number might get reused before our CloseOk arrives + + # Save the details to provide to user callback when CloseOk arrives + self._closing_code_and_text = (method_frame.method.reply_code, + method_frame.method.reply_text) + else: + self._set_state(self.CLOSED) + try: + self.callbacks.process(self.channel_number, '_on_channel_close', + self, self, + method_frame.method.reply_code, + method_frame.method.reply_text) + finally: + self._cleanup() + + def _on_close_meta(self, reply_code, reply_text): + """Handle meta-close request from Connection's cleanup logic after + sudden connection loss. We use this opportunity to transition to + CLOSED state, clean up the channel, and dispatch the on-channel-closed + callbacks. + + :param int reply_code: The reply code to pass to on-close callback + :param str reply_text: The reply text to pass to on-close callback + + """ + LOGGER.debug('Handling meta-close on %s', self) + + if not self.is_closed: + self._closing_code_and_text = reply_code, reply_text + + self._set_state(self.CLOSED) + + try: + self.callbacks.process(self.channel_number, '_on_channel_close', + self, self, + reply_code, + reply_text) + finally: + self._cleanup() + + def _on_closeok(self, method_frame): + """Invoked when RabbitMQ replies to a Channel.Close method + + :param pika.frame.Method method_frame: Method frame with Channel.CloseOk + method + + """ + LOGGER.info('Received %s on %s', method_frame.method, self) + + self._set_state(self.CLOSED) + + try: + self.callbacks.process(self.channel_number, '_on_channel_close', + self, self, + self._closing_code_and_text[0], + self._closing_code_and_text[1]) + finally: + self._cleanup() + + def _on_deliver(self, method_frame, header_frame, body): + """Cope with reentrancy. If a particular consumer is still active when + another delivery appears for it, queue the deliveries up until it + finally exits. + + :param pika.frame.Method method_frame: The method frame received + :param pika.frame.Header header_frame: The header frame received + :param body: The body received + :type body: str or unicode + + """ + consumer_tag = method_frame.method.consumer_tag + + if consumer_tag in self._cancelled: + if self.is_open and consumer_tag not in self._consumers_with_noack: + self.basic_reject(method_frame.method.delivery_tag) + return + + if consumer_tag not in self._consumers: + LOGGER.error('Unexpected delivery: %r', method_frame) + return + + self._consumers[consumer_tag](self, method_frame.method, + header_frame.properties, body) + + def _on_eventok(self, method_frame): + """Generic events that returned ok that may have internal callbacks. + We keep a list of what we've yet to implement so that we don't silently + drain events that we don't support. + + :param pika.frame.Method method_frame: The method frame received + + """ + LOGGER.debug('Discarding frame %r', method_frame) + + def _on_flow(self, _method_frame_unused): + """Called if the server sends a Channel.Flow frame. + + :param pika.frame.Method method_frame_unused: The Channel.Flow frame + + """ + if self._has_on_flow_callback is False: + LOGGER.warning('Channel.Flow received from server') + + def _on_flowok(self, method_frame): + """Called in response to us asking the server to toggle on Channel.Flow + + :param pika.frame.Method method_frame: The method frame received + + """ + self.flow_active = method_frame.method.active + if self._on_flowok_callback: + self._on_flowok_callback(method_frame.method.active) + self._on_flowok_callback = None + else: + LOGGER.warning('Channel.FlowOk received with no active callbacks') + + def _on_getempty(self, method_frame): + """When we receive an empty reply do nothing but log it + + :param pika.frame.Method method_frame: The method frame received + + """ + LOGGER.debug('Received Basic.GetEmpty: %r', method_frame) + if self._on_getok_callback is not None: + self._on_getok_callback = None + + def _on_getok(self, method_frame, header_frame, body): + """Called in reply to a Basic.Get when there is a message. + + :param pika.frame.Method method_frame: The method frame received + :param pika.frame.Header header_frame: The header frame received + :param body: The body received + :type body: str or unicode + + """ + if self._on_getok_callback is not None: + callback = self._on_getok_callback + self._on_getok_callback = None + callback(self, method_frame.method, header_frame.properties, body) + else: + LOGGER.error('Basic.GetOk received with no active callback') + + def _on_openok(self, method_frame): + """Called by our callback handler when we receive a Channel.OpenOk and + subsequently calls our _on_openok_callback which was passed into the + Channel constructor. The reason we do this is because we want to make + sure that the on_open_callback parameter passed into the Channel + constructor is not the first callback we make. + + Suppress the state transition and callback if channel is already in + CLOSING state. + + :param pika.frame.Method method_frame: Channel.OpenOk frame + + """ + # Suppress OpenOk if the user or Connection.Close started closing it + # before open completed. + if self.is_closing: + LOGGER.debug('Suppressing while in closing state: %s', method_frame) + else: + self._set_state(self.OPEN) + if self._on_openok_callback is not None: + self._on_openok_callback(self) + + def _on_return(self, method_frame, header_frame, body): + """Called if the server sends a Basic.Return frame. + + :param pika.frame.Method method_frame: The Basic.Return frame + :param pika.frame.Header header_frame: The content header frame + :param body: The message body + :type body: str or unicode + + """ + if not self.callbacks.process(self.channel_number, '_on_return', self, + self, + method_frame.method, + header_frame.properties, + body): + LOGGER.warning('Basic.Return received from server (%r, %r)', + method_frame.method, header_frame.properties) + + def _on_selectok(self, method_frame): + """Called when the broker sends a Confirm.SelectOk frame + + :param pika.frame.Method method_frame: The method frame received + + """ + LOGGER.debug("Confirm.SelectOk Received: %r", method_frame) + + def _on_synchronous_complete(self, _method_frame_unused): + """This is called when a synchronous command is completed. It will undo + the blocking state and send all the frames that stacked up while we + were in the blocking state. + + :param pika.frame.Method method_frame_unused: The method frame received + + """ + LOGGER.debug('%i blocked frames', len(self._blocked)) + self._blocking = None + while self._blocked and self._blocking is None: + self._rpc(*self._blocked.popleft()) + + def _rpc(self, method, callback=None, acceptable_replies=None): + """Make a syncronous channel RPC call for a synchronous method frame. If + the channel is already in the blocking state, then enqueue the request, + but don't send it at this time; it will be eventually sent by + `_on_synchronous_complete` after the prior blocking request receives a + resposne. If the channel is not in the blocking state and + `acceptable_replies` is not empty, transition the channel to the + blocking state and register for `_on_synchronous_complete` before + sending the request. + + NOTE: A callback must be accompanied by non-empty acceptable_replies. + + :param pika.amqp_object.Method method: The AMQP method to invoke + :param callable callback: The callback for the RPC response + :param acceptable_replies: A (possibly empty) sequence of + replies this RPC call expects or None + :type acceptable_replies: list or None + + """ + assert method.synchronous, ( + 'Only synchronous-capable methods may be used with _rpc: %r' + % (method,)) + + # Validate we got None or a list of acceptable_replies + if not isinstance(acceptable_replies, (type(None), list)): + raise TypeError('acceptable_replies should be list or None') + + if callback is not None: + # Validate the callback is callable + if not is_callable(callback): + raise TypeError( + 'callback should be None or a callable') + + # Make sure that callback is accompanied by acceptable replies + if not acceptable_replies: + raise ValueError( + 'Unexpected callback for asynchronous (nowait) operation.') + + # Make sure the channel is not closed yet + if self.is_closed: + raise exceptions.ChannelClosed + + # If the channel is blocking, add subsequent commands to our stack + if self._blocking: + LOGGER.debug('Already in blocking state, so enqueueing method %s; ' + 'acceptable_replies=%r', + method, acceptable_replies) + return self._blocked.append([method, callback, acceptable_replies]) + + # If acceptable replies are set, add callbacks + if acceptable_replies: + # Block until a response frame is received for synchronous frames + self._blocking = method.NAME + LOGGER.debug( + 'Entering blocking state on frame %s; acceptable_replies=%r', + method, acceptable_replies) + + for reply in acceptable_replies: + if isinstance(reply, tuple): + reply, arguments = reply + else: + arguments = None + LOGGER.debug('Adding on_synchronous_complete callback') + self.callbacks.add(self.channel_number, reply, + self._on_synchronous_complete, + arguments=arguments) + if callback is not None: + LOGGER.debug('Adding passed-in callback') + self.callbacks.add(self.channel_number, reply, callback, + arguments=arguments) + + self._send_method(method) + + def _send_method(self, method, content=None): + """Shortcut wrapper to send a method through our connection, passing in + the channel number + + :param pika.amqp_object.Method method: The method to send + :param tuple content: If set, is a content frame, is tuple of + properties and body. + + """ + # pylint: disable=W0212 + self.connection._send_method(self.channel_number, method, content) + + def _set_cookie(self, cookie): + """Used by wrapper layer (e.g., `BlockingConnection`) to link the + channel implementation back to the proxy. See `_get_cookie`. + + :param cookie: an opaque value; typically a proxy channel implementation + instance (e.g., `BlockingChannel` instance) + """ + self._cookie = cookie + + def _set_state(self, connection_state): + """Set the channel connection state to the specified state value. + + :param int connection_state: The connection_state value + + """ + self._state = connection_state + + def _on_unexpected_frame(self, frame_value): + """Invoked when a frame is received that is not setup to be processed. + + :param pika.frame.Frame frame_value: The frame received + + """ + LOGGER.error('Unexpected frame: %r', frame_value) + + def _validate_channel_and_callback(self, callback): + """Verify that channel is open and callback is callable if not None + + :raises ChannelClosed: if channel is closed + :raises ValueError: if callback is not None and is not callable + """ + if not self.is_open: + raise exceptions.ChannelClosed() + if callback is not None and not is_callable(callback): + raise ValueError('callback must be a function or method') + + +class ContentFrameAssembler(object): + """Handle content related frames, building a message and return the message + back in three parts upon receipt. + + """ + + def __init__(self): + """Create a new instance of the conent frame assembler. + + """ + self._method_frame = None + self._header_frame = None + self._seen_so_far = 0 + self._body_fragments = list() + + def process(self, frame_value): + """Invoked by the Channel object when passed frames that are not + setup in the rpc process and that don't have explicit reply types + defined. This includes Basic.Publish, Basic.GetOk and Basic.Return + + :param Method|Header|Body frame_value: The frame to process + + """ + if (isinstance(frame_value, frame.Method) and + spec.has_content(frame_value.method.INDEX)): + self._method_frame = frame_value + elif isinstance(frame_value, frame.Header): + self._header_frame = frame_value + if frame_value.body_size == 0: + return self._finish() + elif isinstance(frame_value, frame.Body): + return self._handle_body_frame(frame_value) + else: + raise exceptions.UnexpectedFrameError(frame_value) + + def _finish(self): + """Invoked when all of the message has been received + + :rtype: tuple(pika.frame.Method, pika.frame.Header, str) + + """ + content = (self._method_frame, self._header_frame, + b''.join(self._body_fragments)) + self._reset() + return content + + def _handle_body_frame(self, body_frame): + """Receive body frames and append them to the stack. When the body size + matches, call the finish method. + + :param Body body_frame: The body frame + :raises: pika.exceptions.BodyTooLongError + :rtype: tuple(pika.frame.Method, pika.frame.Header, str)|None + + """ + self._seen_so_far += len(body_frame.fragment) + self._body_fragments.append(body_frame.fragment) + if self._seen_so_far == self._header_frame.body_size: + return self._finish() + elif self._seen_so_far > self._header_frame.body_size: + raise exceptions.BodyTooLongError(self._seen_so_far, + self._header_frame.body_size) + return None + + def _reset(self): + """Reset the values for processing frames""" + self._method_frame = None + self._header_frame = None + self._seen_so_far = 0 + self._body_fragments = list() diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/pika/compat.py b/NodeRed/NodeRedFiles/pika-0.13.1/pika/compat.py new file mode 100644 index 000000000..ad14aaa88 --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/pika/compat.py @@ -0,0 +1,210 @@ +import errno +import os +import platform +import re +import socket +import sys as _sys + +PY2 = _sys.version_info < (3,) +PY3 = not PY2 +RE_NUM = re.compile(r'(\d+).+') + +if _sys.version_info[:2] < (3, 3): + SOCKET_ERROR = socket.error +else: + # socket.error was deprecated and replaced by OSError in python 3.3 + SOCKET_ERROR = OSError + +try: + SOL_TCP = socket.SOL_TCP +except AttributeError: + SOL_TCP = socket.IPPROTO_TCP + +if not PY2: + # these were moved around for Python 3 + from urllib.parse import (quote as url_quote, unquote as url_unquote, + urlencode) + + # Python 3 does not have basestring anymore; we include + # *only* the str here as this is used for textual data. + basestring = (str,) + + # for assertions that the data is either encoded or non-encoded text + str_or_bytes = (str, bytes) + + # xrange is gone, replace it with range + xrange = range + + # the unicode type is str + unicode_type = str + + def dictkeys(dct): + """ + Returns a list of keys of dictionary + + dict.keys returns a view that works like .keys in Python 2 + *except* any modifications in the dictionary will be visible + (and will cause errors if the view is being iterated over while + it is modified). + """ + + return list(dct.keys()) + + def dictvalues(dct): + """ + Returns a list of values of a dictionary + + dict.values returns a view that works like .values in Python 2 + *except* any modifications in the dictionary will be visible + (and will cause errors if the view is being iterated over while + it is modified). + """ + return list(dct.values()) + + def dict_iteritems(dct): + """ + Returns an iterator of items (key/value pairs) of a dictionary + + dict.items returns a view that works like .items in Python 2 + *except* any modifications in the dictionary will be visible + (and will cause errors if the view is being iterated over while + it is modified). + """ + return dct.items() + + def dict_itervalues(dct): + """ + :param dict dct: + :returns: an iterator of the values of a dictionary + """ + return dct.values() + + def byte(*args): + """ + This is the same as Python 2 `chr(n)` for bytes in Python 3 + + Returns a single byte `bytes` for the given int argument (we + optimize it a bit here by passing the positional argument tuple + directly to the bytes constructor. + """ + return bytes(args) + + class long(int): + """ + A marker class that signifies that the integer value should be + serialized as `l` instead of `I` + """ + + def __repr__(self): + return str(self) + 'L' + + def canonical_str(value): + """ + Return the canonical str value for the string. + In both Python 3 and Python 2 this is str. + """ + + return str(value) + + def is_integer(value): + return isinstance(value, int) +else: + from urllib import quote as url_quote, unquote as url_unquote, urlencode + + basestring = basestring + str_or_bytes = basestring + xrange = xrange + unicode_type = unicode + dictkeys = dict.keys + dictvalues = dict.values + dict_iteritems = dict.iteritems + dict_itervalues = dict.itervalues + byte = chr + long = long + + def canonical_str(value): + """ + Returns the canonical string value of the given string. + In Python 2 this is the value unchanged if it is an str, otherwise + it is the unicode value encoded as UTF-8. + """ + + try: + return str(value) + except UnicodeEncodeError: + return str(value.encode('utf-8')) + + def is_integer(value): + return isinstance(value, (int, long)) + + +def as_bytes(value): + if not isinstance(value, bytes): + return value.encode('UTF-8') + return value + + +def to_digit(value): + if value.isdigit(): + return int(value) + match = RE_NUM.match(value) + return int(match.groups()[0]) if match else 0 + + +def get_linux_version(release_str): + ver_str = release_str.split('-')[0] + return tuple(map(to_digit, ver_str.split('.')[:3])) + + +HAVE_SIGNAL = os.name == 'posix' + +EINTR_IS_EXPOSED = _sys.version_info[:2] <= (3, 4) + +LINUX_VERSION = None +if platform.system() == 'Linux': + LINUX_VERSION = get_linux_version(platform.release()) + +_LOCALHOST = '127.0.0.1' +_LOCALHOST_V6 = '::1' + +def _nonblocking_socketpair(family=socket.AF_INET, type=socket.SOCK_STREAM, proto=0): + """ + Returns a pair of sockets in the manner of socketpair with the additional + feature that they will be non-blocking. Prior to Python 3.5, socketpair + did not exist on Windows at all. + """ + if family == socket.AF_INET: + host = _LOCALHOST + elif family == socket.AF_INET6: + host = _LOCALHOST_V6 + else: + raise ValueError( + 'Only AF_INET and AF_INET6 socket address families ' + 'are supported') + if type != socket.SOCK_STREAM: + raise ValueError('Only SOCK_STREAM socket type is supported') + if proto != 0: + raise ValueError('Only protocol zero is supported') + + lsock = socket.socket(family, type, proto) + try: + lsock.bind((host, 0)) + lsock.listen(min(socket.SOMAXCONN, 128)) + # On IPv6, ignore flow_info and scope_id + addr, port = lsock.getsockname()[:2] + csock = socket.socket(family, type, proto) + try: + csock.connect((addr, port)) + ssock, _ = lsock.accept() + except Exception: + csock.close() + raise + finally: + lsock.close() + + # Make sockets non-blocking to prevent deadlocks + # See https://github.com/pika/pika/issues/917 + csock.setblocking(False) + ssock.setblocking(False) + + return ssock, csock diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/pika/connection.py b/NodeRed/NodeRedFiles/pika-0.13.1/pika/connection.py new file mode 100644 index 000000000..4cc1e3272 --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/pika/connection.py @@ -0,0 +1,2356 @@ +"""Core connection objects""" +import ast +import sys +import collections +import copy +import logging +import math +import numbers +import os +import platform +import warnings +import ssl + +if sys.version_info > (3,): + import urllib.parse as urlparse # pylint: disable=E0611,F0401 +else: + import urlparse + +from pika import __version__ +from pika import callback +import pika.channel +from pika import credentials as pika_credentials +from pika import exceptions +from pika import frame +from pika import heartbeat +from pika import utils + +from pika import spec + +from pika.compat import (xrange, basestring, # pylint: disable=W0622 + url_unquote, dictkeys, dict_itervalues, + dict_iteritems) + + +BACKPRESSURE_WARNING = ("Pika: Write buffer exceeded warning threshold at " + "%i bytes and an estimated %i frames behind") +PRODUCT = "Pika Python Client Library" + +LOGGER = logging.getLogger(__name__) + + +class InternalCloseReasons(object): + """Internal reason codes passed to the user's on_close_callback when the + connection is terminated abruptly, without reply code/text from the broker. + + AMQP 0.9.1 specification cites IETF RFC 821 for reply codes. To avoid + conflict, the `InternalCloseReasons` namespace uses negative integers. These + are invalid for sending to the broker. + """ + SOCKET_ERROR = -1 + BLOCKED_CONNECTION_TIMEOUT = -2 + + +class Parameters(object): # pylint: disable=R0902 + """Base connection parameters class definition + + :param bool backpressure_detection: `DEFAULT_BACKPRESSURE_DETECTION` + :param float|None blocked_connection_timeout: + `DEFAULT_BLOCKED_CONNECTION_TIMEOUT` + :param int channel_max: `DEFAULT_CHANNEL_MAX` + :param int connection_attempts: `DEFAULT_CONNECTION_ATTEMPTS` + :param credentials: `DEFAULT_CREDENTIALS` + :param int frame_max: `DEFAULT_FRAME_MAX` + :param int heartbeat: `DEFAULT_HEARTBEAT_TIMEOUT` + :param str host: `DEFAULT_HOST` + :param str locale: `DEFAULT_LOCALE` + :param int port: `DEFAULT_PORT` + :param float retry_delay: `DEFAULT_RETRY_DELAY` + :param float socket_timeout: `DEFAULT_SOCKET_TIMEOUT` + :param bool ssl: `DEFAULT_SSL` + :param dict ssl_options: `DEFAULT_SSL_OPTIONS` + :param str virtual_host: `DEFAULT_VIRTUAL_HOST` + :param int tcp_options: `DEFAULT_TCP_OPTIONS` + """ + + # Declare slots to protect against accidental assignment of an invalid + # attribute + __slots__ = ( + '_backpressure_detection', + '_blocked_connection_timeout', + '_channel_max', + '_client_properties', + '_connection_attempts', + '_credentials', + '_frame_max', + '_heartbeat', + '_host', + '_locale', + '_port', + '_retry_delay', + '_socket_timeout', + '_ssl', + '_ssl_options', + '_virtual_host', + '_tcp_options' + ) + + DEFAULT_USERNAME = 'guest' + DEFAULT_PASSWORD = 'guest' + + DEFAULT_BACKPRESSURE_DETECTION = False + DEFAULT_BLOCKED_CONNECTION_TIMEOUT = None + DEFAULT_CHANNEL_MAX = pika.channel.MAX_CHANNELS + DEFAULT_CLIENT_PROPERTIES = None + DEFAULT_CREDENTIALS = pika_credentials.PlainCredentials(DEFAULT_USERNAME, + DEFAULT_PASSWORD) + DEFAULT_CONNECTION_ATTEMPTS = 1 + DEFAULT_FRAME_MAX = spec.FRAME_MAX_SIZE + DEFAULT_HEARTBEAT_TIMEOUT = None # None accepts server's proposal + DEFAULT_HOST = 'localhost' + DEFAULT_LOCALE = 'en_US' + DEFAULT_PORT = 5672 + DEFAULT_RETRY_DELAY = 2.0 + DEFAULT_SOCKET_TIMEOUT = 10.0 + DEFAULT_SSL = False + DEFAULT_SSL_OPTIONS = None + DEFAULT_SSL_PORT = 5671 + DEFAULT_VIRTUAL_HOST = '/' + DEFAULT_TCP_OPTIONS = None + + DEFAULT_HEARTBEAT_INTERVAL = DEFAULT_HEARTBEAT_TIMEOUT # DEPRECATED + + def __init__(self): + self._backpressure_detection = None + self.backpressure_detection = self.DEFAULT_BACKPRESSURE_DETECTION + + # If not None, blocked_connection_timeout is the timeout, in seconds, + # for the connection to remain blocked; if the timeout expires, the + # connection will be torn down, triggering the connection's + # on_close_callback + self._blocked_connection_timeout = None + self.blocked_connection_timeout = ( + self.DEFAULT_BLOCKED_CONNECTION_TIMEOUT) + + self._channel_max = None + self.channel_max = self.DEFAULT_CHANNEL_MAX + + self._client_properties = None + self.client_properties = self.DEFAULT_CLIENT_PROPERTIES + + self._connection_attempts = None + self.connection_attempts = self.DEFAULT_CONNECTION_ATTEMPTS + + self._credentials = None + self.credentials = self.DEFAULT_CREDENTIALS + + self._frame_max = None + self.frame_max = self.DEFAULT_FRAME_MAX + + self._heartbeat = None + self.heartbeat = self.DEFAULT_HEARTBEAT_TIMEOUT + + self._host = None + self.host = self.DEFAULT_HOST + + self._locale = None + self.locale = self.DEFAULT_LOCALE + + self._port = None + self.port = self.DEFAULT_PORT + + self._retry_delay = None + self.retry_delay = self.DEFAULT_RETRY_DELAY + + self._socket_timeout = None + self.socket_timeout = self.DEFAULT_SOCKET_TIMEOUT + + self._ssl = None + self.ssl = self.DEFAULT_SSL + + self._ssl_options = None + self.ssl_options = self.DEFAULT_SSL_OPTIONS + + self._virtual_host = None + self.virtual_host = self.DEFAULT_VIRTUAL_HOST + + self._tcp_options = None + self.tcp_options = self.DEFAULT_TCP_OPTIONS + + def __repr__(self): + """Represent the info about the instance. + + :rtype: str + + """ + return ('<%s host=%s port=%s virtual_host=%s ssl=%s>' % + (self.__class__.__name__, self.host, self.port, + self.virtual_host, self.ssl)) + + @property + def backpressure_detection(self): + """ + :returns: boolean indicating whether backpressure detection is + enabled. Defaults to `DEFAULT_BACKPRESSURE_DETECTION`. + + """ + return self._backpressure_detection + + @backpressure_detection.setter + def backpressure_detection(self, value): + """ + :param bool value: boolean indicating whether to enable backpressure + detection + + """ + if not isinstance(value, bool): + raise TypeError('backpressure_detection must be a bool, ' + 'but got %r' % (value,)) + self._backpressure_detection = value + + @property + def blocked_connection_timeout(self): + """ + :returns: None or float blocked connection timeout. Defaults to + `DEFAULT_BLOCKED_CONNECTION_TIMEOUT`. + + """ + return self._blocked_connection_timeout + + @blocked_connection_timeout.setter + def blocked_connection_timeout(self, value): + """ + :param value: If not None, blocked_connection_timeout is the timeout, in + seconds, for the connection to remain blocked; if the timeout + expires, the connection will be torn down, triggering the + connection's on_close_callback + + """ + if value is not None: + if not isinstance(value, numbers.Real): + raise TypeError('blocked_connection_timeout must be a Real ' + 'number, but got %r' % (value,)) + if value < 0: + raise ValueError('blocked_connection_timeout must be >= 0, but ' + 'got %r' % (value,)) + self._blocked_connection_timeout = value + + @property + def channel_max(self): + """ + :returns: max preferred number of channels. Defaults to + `DEFAULT_CHANNEL_MAX`. + :rtype: int + + """ + return self._channel_max + + @channel_max.setter + def channel_max(self, value): + """ + :param int value: max preferred number of channels, between 1 and + `channel.MAX_CHANNELS`, inclusive + + """ + if not isinstance(value, numbers.Integral): + raise TypeError('channel_max must be an int, but got %r' % (value,)) + if value < 1 or value > pika.channel.MAX_CHANNELS: + raise ValueError('channel_max must be <= %i and > 0, but got %r' % + (pika.channel.MAX_CHANNELS, value)) + self._channel_max = value + + @property + def client_properties(self): + """ + :returns: None or dict of client properties used to override the fields + in the default client poperties reported to RabbitMQ via + `Connection.StartOk` method. Defaults to + `DEFAULT_CLIENT_PROPERTIES`. + + """ + return self._client_properties + + @client_properties.setter + def client_properties(self, value): + """ + :param value: None or dict of client properties used to override the + fields in the default client poperties reported to RabbitMQ via + `Connection.StartOk` method. + """ + if not isinstance(value, (dict, type(None),)): + raise TypeError('client_properties must be dict or None, ' + 'but got %r' % (value,)) + # Copy the mutable object to avoid accidental side-effects + self._client_properties = copy.deepcopy(value) + + @property + def connection_attempts(self): + """ + :returns: number of socket connection attempts. Defaults to + `DEFAULT_CONNECTION_ATTEMPTS`. + + """ + return self._connection_attempts + + @connection_attempts.setter + def connection_attempts(self, value): + """ + :param int value: number of socket connection attempts of at least 1 + + """ + if not isinstance(value, numbers.Integral): + raise TypeError('connection_attempts must be an int') + if value < 1: + raise ValueError('connection_attempts must be > 0, but got %r' % + (value,)) + self._connection_attempts = value + + @property + def credentials(self): + """ + :rtype: one of the classes from `pika.credentials.VALID_TYPES`. Defaults + to `DEFAULT_CREDENTIALS`. + + """ + return self._credentials + + @credentials.setter + def credentials(self, value): + """ + :param value: authentication credential object of one of the classes + from `pika.credentials.VALID_TYPES` + + """ + if not isinstance(value, tuple(pika_credentials.VALID_TYPES)): + raise TypeError('Credentials must be an object of type: %r, but ' + 'got %r' % (pika_credentials.VALID_TYPES, value)) + # Copy the mutable object to avoid accidental side-effects + self._credentials = copy.deepcopy(value) + + @property + def frame_max(self): + """ + :returns: desired maximum AMQP frame size to use. Defaults to + `DEFAULT_FRAME_MAX`. + + """ + return self._frame_max + + @frame_max.setter + def frame_max(self, value): + """ + :param int value: desired maximum AMQP frame size to use between + `spec.FRAME_MIN_SIZE` and `spec.FRAME_MAX_SIZE`, inclusive + + """ + if not isinstance(value, numbers.Integral): + raise TypeError('frame_max must be an int, but got %r' % (value,)) + if value < spec.FRAME_MIN_SIZE: + raise ValueError('Min AMQP 0.9.1 Frame Size is %i, but got %r', + (spec.FRAME_MIN_SIZE, value,)) + elif value > spec.FRAME_MAX_SIZE: + raise ValueError('Max AMQP 0.9.1 Frame Size is %i, but got %r', + (spec.FRAME_MAX_SIZE, value,)) + self._frame_max = value + + @property + def heartbeat(self): + """ + :returns: AMQP connection heartbeat timeout value for negotiation during + connection tuning or callable which is invoked during connection tuning. + None to accept broker's value. 0 turns heartbeat off. Defaults to + `DEFAULT_HEARTBEAT_TIMEOUT`. + :rtype: integer, None or callable + + """ + return self._heartbeat + + @heartbeat.setter + def heartbeat(self, value): + """ + :param int|None|callable value: Controls AMQP heartbeat timeout negotiation + during connection tuning. An integer value always overrides the value + proposed by broker. Use 0 to deactivate heartbeats and None to always + accept the broker's proposal. If a callable is given, it will be called + with the connection instance and the heartbeat timeout proposed by broker + as its arguments. The callback should return a non-negative integer that + will be used to override the broker's proposal. + """ + if value is not None: + if not isinstance(value, numbers.Integral) and not callable(value): + raise TypeError('heartbeat must be an int or a callable function, but got %r' % + (value,)) + if not callable(value) and value < 0: + raise ValueError('heartbeat must >= 0, but got %r' % (value,)) + self._heartbeat = value + + @property + def host(self): + """ + :returns: hostname or ip address of broker. Defaults to `DEFAULT_HOST`. + :rtype: str + + """ + return self._host + + @host.setter + def host(self, value): + """ + :param str value: hostname or ip address of broker + + """ + if not isinstance(value, basestring): + raise TypeError('host must be a str or unicode str, but got %r' % + (value,)) + self._host = value + + @property + def locale(self): + """ + :returns: locale value to pass to broker; e.g., 'en_US'. Defaults to + `DEFAULT_LOCALE`. + :rtype: str + + """ + return self._locale + + @locale.setter + def locale(self, value): + """ + :param str value: locale value to pass to broker; e.g., "en_US" + + """ + if not isinstance(value, basestring): + raise TypeError('locale must be a str, but got %r' % (value,)) + self._locale = value + + @property + def port(self): + """ + :returns: port number of broker's listening socket. Defaults to + `DEFAULT_PORT`. + :rtype: int + + """ + return self._port + + @port.setter + def port(self, value): + """ + :param int value: port number of broker's listening socket + + """ + try: + self._port = int(value) + except (TypeError, ValueError): + raise TypeError('port must be an int, but got %r' % (value,)) + + @property + def retry_delay(self): + """ + :returns: interval between socket connection attempts; see also + `connection_attempts`. Defaults to `DEFAULT_RETRY_DELAY`. + :rtype: float + + """ + return self._retry_delay + + @retry_delay.setter + def retry_delay(self, value): + """ + :param float value: interval between socket connection attempts; see + also `connection_attempts`. + + """ + if not isinstance(value, numbers.Real): + raise TypeError('retry_delay must be a float or int, but got %r' % + (value,)) + self._retry_delay = value + + @property + def socket_timeout(self): + """ + :returns: socket timeout value. Defaults to `DEFAULT_SOCKET_TIMEOUT`. + :rtype: float + + """ + return self._socket_timeout + + @socket_timeout.setter + def socket_timeout(self, value): + """ + :param float value: socket timeout value; NOTE: this is mostly unused + now, owing to switchover to to non-blocking socket setting after + initial socket connection establishment. + + """ + if value is not None: + if not isinstance(value, numbers.Real): + raise TypeError('socket_timeout must be a float or int, ' + 'but got %r' % (value,)) + if not value > 0: + raise ValueError('socket_timeout must be > 0, but got %r' % + (value,)) + self._socket_timeout = value + + @property + def ssl(self): + """ + :returns: boolean indicating whether to connect via SSL. Defaults to + `DEFAULT_SSL`. + + """ + return self._ssl + + @ssl.setter + def ssl(self, value): + """ + :param bool value: boolean indicating whether to connect via SSL + + """ + if not isinstance(value, bool): + raise TypeError('ssl must be a bool, but got %r' % (value,)) + self._ssl = value + + @property + def ssl_options(self): + """ + :returns: None or a dict of options to pass to `ssl.wrap_socket`. + Defaults to `DEFAULT_SSL_OPTIONS`. + + """ + return self._ssl_options + + @ssl_options.setter + def ssl_options(self, value): + """ + :param value: None, a dict of options to pass to `ssl.wrap_socket` or + a SSLOptions object for advanced setup. + + """ + if not isinstance(value, (dict, SSLOptions, type(None))): + raise TypeError( + 'ssl_options must be a dict, None or an SSLOptions but got %r' + % (value, )) + # Copy the mutable object to avoid accidental side-effects + self._ssl_options = copy.deepcopy(value) + + + @property + def virtual_host(self): + """ + :returns: rabbitmq virtual host name. Defaults to + `DEFAULT_VIRTUAL_HOST`. + + """ + return self._virtual_host + + @virtual_host.setter + def virtual_host(self, value): + """ + :param str value: rabbitmq virtual host name + + """ + if not isinstance(value, basestring): + raise TypeError('virtual_host must be a str, but got %r' % (value,)) + self._virtual_host = value + + @property + def tcp_options(self): + """ + :returns: None or a dict of options to pass to the underlying socket + """ + return self._tcp_options + + @tcp_options.setter + def tcp_options(self, value): + """ + :param bool value: None or a dict of options to pass to the underlying + socket. Currently supported are TCP_KEEPIDLE, TCP_KEEPINTVL, TCP_KEEPCNT + and TCP_USER_TIMEOUT. Availability of these may depend on your platform. + """ + if not isinstance(value, (dict, type(None))): + raise TypeError('tcp_options must be a dict or None, but got %r' % + (value,)) + self._tcp_options = value + + +class ConnectionParameters(Parameters): + """Connection parameters object that is passed into the connection adapter + upon construction. + + """ + + # Protect against accidental assignment of an invalid attribute + __slots__ = () + + class _DEFAULT(object): + """Designates default parameter value; internal use""" + pass + + def __init__(self, # pylint: disable=R0913,R0914,R0912 + host=_DEFAULT, + port=_DEFAULT, + virtual_host=_DEFAULT, + credentials=_DEFAULT, + channel_max=_DEFAULT, + frame_max=_DEFAULT, + heartbeat=_DEFAULT, + ssl=_DEFAULT, + ssl_options=_DEFAULT, + connection_attempts=_DEFAULT, + retry_delay=_DEFAULT, + socket_timeout=_DEFAULT, + locale=_DEFAULT, + backpressure_detection=_DEFAULT, + blocked_connection_timeout=_DEFAULT, + client_properties=_DEFAULT, + tcp_options=_DEFAULT, + **kwargs): + """Create a new ConnectionParameters instance. See `Parameters` for + default values. + + :param str host: Hostname or IP Address to connect to + :param int port: TCP port to connect to + :param str virtual_host: RabbitMQ virtual host to use + :param pika.credentials.Credentials credentials: auth credentials + :param int channel_max: Maximum number of channels to allow + :param int frame_max: The maximum byte size for an AMQP frame + :param int|None|callable value: Controls AMQP heartbeat timeout negotiation + during connection tuning. An integer value always overrides the value + proposed by broker. Use 0 to deactivate heartbeats and None to always + accept the broker's proposal. If a callable is given, it will be called + with the connection instance and the heartbeat timeout proposed by broker + as its arguments. The callback should return a non-negative integer that + will be used to override the broker's proposal. + :param bool ssl: Enable SSL + :param dict ssl_options: None or a dict of arguments to be passed to + ssl.wrap_socket + :param int connection_attempts: Maximum number of retry attempts + :param int|float retry_delay: Time to wait in seconds, before the next + :param int|float socket_timeout: Use for high latency networks + :param str locale: Set the locale value + :param bool backpressure_detection: DEPRECATED in favor of + `Connection.Blocked` and `Connection.Unblocked`. See + `Connection.add_on_connection_blocked_callback`. + :param blocked_connection_timeout: If not None, + the value is a non-negative timeout, in seconds, for the + connection to remain blocked (triggered by Connection.Blocked from + broker); if the timeout expires before connection becomes unblocked, + the connection will be torn down, triggering the adapter-specific + mechanism for informing client app about the closed connection ( + e.g., on_close_callback or ConnectionClosed exception) with + `reason_code` of `InternalCloseReasons.BLOCKED_CONNECTION_TIMEOUT`. + :type blocked_connection_timeout: None, int, float + :param client_properties: None or dict of client properties used to + override the fields in the default client properties reported to + RabbitMQ via `Connection.StartOk` method. + :param heartbeat_interval: DEPRECATED; use `heartbeat` instead, and + don't pass both + :param tcp_options: None or a dict of TCP options to set for socket + """ + super(ConnectionParameters, self).__init__() + + if backpressure_detection is not self._DEFAULT: + self.backpressure_detection = backpressure_detection + + if blocked_connection_timeout is not self._DEFAULT: + self.blocked_connection_timeout = blocked_connection_timeout + + if channel_max is not self._DEFAULT: + self.channel_max = channel_max + + if client_properties is not self._DEFAULT: + self.client_properties = client_properties + + if connection_attempts is not self._DEFAULT: + self.connection_attempts = connection_attempts + + if credentials is not self._DEFAULT: + self.credentials = credentials + + if frame_max is not self._DEFAULT: + self.frame_max = frame_max + + if heartbeat is not self._DEFAULT: + self.heartbeat = heartbeat + + try: + heartbeat_interval = kwargs.pop('heartbeat_interval') + except KeyError: + # Good, this one is deprecated + pass + else: + warnings.warn('heartbeat_interval is deprecated, use heartbeat', + DeprecationWarning, stacklevel=2) + if heartbeat is not self._DEFAULT: + raise TypeError('heartbeat and deprecated heartbeat_interval ' + 'are mutually-exclusive') + self.heartbeat = heartbeat_interval + + if host is not self._DEFAULT: + self.host = host + + if locale is not self._DEFAULT: + self.locale = locale + + if retry_delay is not self._DEFAULT: + self.retry_delay = retry_delay + + if socket_timeout is not self._DEFAULT: + self.socket_timeout = socket_timeout + + if ssl is not self._DEFAULT: + self.ssl = ssl + + if ssl_options is not self._DEFAULT: + self.ssl_options = ssl_options + + # Set port after SSL status is known + if port is not self._DEFAULT: + self.port = port + elif ssl is not self._DEFAULT: + self.port = self.DEFAULT_SSL_PORT if self.ssl else self.DEFAULT_PORT + + if virtual_host is not self._DEFAULT: + self.virtual_host = virtual_host + + if tcp_options is not self._DEFAULT: + self.tcp_options = tcp_options + + if kwargs: + raise TypeError('Unexpected kwargs: %r' % (kwargs,)) + + +class URLParameters(Parameters): + """Connect to RabbitMQ via an AMQP URL in the format:: + + amqp://username:password@host:port/[?query-string] + + Ensure that the virtual host is URI encoded when specified. For example if + you are using the default "/" virtual host, the value should be `%2f`. + + See `Parameters` for default values. + + Valid query string values are: + + - backpressure_detection: + DEPRECATED in favor of + `Connection.Blocked` and `Connection.Unblocked`. See + `Connection.add_on_connection_blocked_callback`. + - channel_max: + Override the default maximum channel count value + - client_properties: + dict of client properties used to override the fields in the default + client properties reported to RabbitMQ via `Connection.StartOk` + method + - connection_attempts: + Specify how many times pika should try and reconnect before it gives up + - frame_max: + Override the default maximum frame size for communication + - heartbeat: + Desired connection heartbeat timeout for negotiation. If not present + the broker's value is accepted. 0 turns heartbeat off. + - locale: + Override the default `en_US` locale value + - ssl: + Toggle SSL, possible values are `t`, `f` + - ssl_options: + Arguments passed to :meth:`ssl.wrap_socket` + - retry_delay: + The number of seconds to sleep before attempting to connect on + connection failure. + - socket_timeout: + Override low level socket timeout value + - blocked_connection_timeout: + Set the timeout, in seconds, that the connection may remain blocked + (triggered by Connection.Blocked from broker); if the timeout + expires before connection becomes unblocked, the connection will be + torn down, triggering the connection's on_close_callback + - tcp_options: + Set the tcp options for the underlying socket. + + :param str url: The AMQP URL to connect to + + """ + + # Protect against accidental assignment of an invalid attribute + __slots__ = ('_all_url_query_values',) + + + # The name of the private function for parsing and setting a given URL query + # arg is constructed by catenating the query arg's name to this prefix + _SETTER_PREFIX = '_set_url_' + + def __init__(self, url): + """Create a new URLParameters instance. + + :param str url: The URL value + + """ + super(URLParameters, self).__init__() + + self._all_url_query_values = None + + # Handle the Protocol scheme + # + # Fix up scheme amqp(s) to http(s) so urlparse won't barf on python + # prior to 2.7. On Python 2.6.9, + # `urlparse('amqp://127.0.0.1/%2f?socket_timeout=1')` produces an + # incorrect path='/%2f?socket_timeout=1' + if url[0:4].lower() == 'amqp': + url = 'http' + url[4:] + + # TODO Is support for the alternative http(s) schemes intentional? + + parts = urlparse.urlparse(url) + + if parts.scheme == 'https': + self.ssl = True + elif parts.scheme == 'http': + self.ssl = False + elif parts.scheme: + raise ValueError('Unexpected URL scheme %r; supported scheme ' + 'values: amqp, amqps' % (parts.scheme,)) + + if parts.hostname is not None: + self.host = parts.hostname + + # Take care of port after SSL status is known + if parts.port is not None: + self.port = parts.port + else: + self.port = self.DEFAULT_SSL_PORT if self.ssl else self.DEFAULT_PORT + + if parts.username is not None: + self.credentials = pika_credentials.PlainCredentials(url_unquote(parts.username), + url_unquote(parts.password)) + + # Get the Virtual Host + if len(parts.path) > 1: + self.virtual_host = url_unquote(parts.path.split('/')[1]) + + # Handle query string values, validating and assigning them + self._all_url_query_values = urlparse.parse_qs(parts.query) + + for name, value in dict_iteritems(self._all_url_query_values): + try: + set_value = getattr(self, self._SETTER_PREFIX + name) + except AttributeError: + raise ValueError('Unknown URL parameter: %r' % (name,)) + + try: + (value,) = value + except ValueError: + raise ValueError('Expected exactly one value for URL parameter ' + '%s, but got %i values: %s' % ( + name, len(value), value)) + + set_value(value) + + def _set_url_backpressure_detection(self, value): + """Deserialize and apply the corresponding query string arg""" + try: + backpressure_detection = {'t': True, 'f': False}[value] + except KeyError: + raise ValueError('Invalid backpressure_detection value: %r' % + (value,)) + self.backpressure_detection = backpressure_detection + + def _set_url_blocked_connection_timeout(self, value): + """Deserialize and apply the corresponding query string arg""" + try: + blocked_connection_timeout = float(value) + except ValueError as exc: + raise ValueError('Invalid blocked_connection_timeout value %r: %r' % + (value, exc,)) + self.blocked_connection_timeout = blocked_connection_timeout + + def _set_url_channel_max(self, value): + """Deserialize and apply the corresponding query string arg""" + try: + channel_max = int(value) + except ValueError as exc: + raise ValueError('Invalid channel_max value %r: %r' % (value, exc,)) + self.channel_max = channel_max + + def _set_url_client_properties(self, value): + """Deserialize and apply the corresponding query string arg""" + self.client_properties = ast.literal_eval(value) + + def _set_url_connection_attempts(self, value): + """Deserialize and apply the corresponding query string arg""" + try: + connection_attempts = int(value) + except ValueError as exc: + raise ValueError('Invalid connection_attempts value %r: %r' % + (value, exc,)) + self.connection_attempts = connection_attempts + + def _set_url_frame_max(self, value): + """Deserialize and apply the corresponding query string arg""" + try: + frame_max = int(value) + except ValueError as exc: + raise ValueError('Invalid frame_max value %r: %r' % (value, exc,)) + self.frame_max = frame_max + + def _set_url_heartbeat(self, value): + """Deserialize and apply the corresponding query string arg""" + if 'heartbeat_interval' in self._all_url_query_values: + raise ValueError('Deprecated URL parameter heartbeat_interval must ' + 'not be specified together with heartbeat') + + try: + heartbeat_timeout = int(value) + except ValueError as exc: + raise ValueError('Invalid heartbeat value %r: %r' % (value, exc,)) + self.heartbeat = heartbeat_timeout + + def _set_url_heartbeat_interval(self, value): + """Deserialize and apply the corresponding query string arg""" + warnings.warn('heartbeat_interval is deprecated, use heartbeat', + DeprecationWarning, stacklevel=2) + + if 'heartbeat' in self._all_url_query_values: + raise ValueError('Deprecated URL parameter heartbeat_interval must ' + 'not be specified together with heartbeat') + + try: + heartbeat_timeout = int(value) + except ValueError as exc: + raise ValueError('Invalid heartbeat_interval value %r: %r' % + (value, exc,)) + self.heartbeat = heartbeat_timeout + + def _set_url_locale(self, value): + """Deserialize and apply the corresponding query string arg""" + self.locale = value + + def _set_url_retry_delay(self, value): + """Deserialize and apply the corresponding query string arg""" + try: + retry_delay = float(value) + except ValueError as exc: + raise ValueError('Invalid retry_delay value %r: %r' % (value, exc,)) + self.retry_delay = retry_delay + + def _set_url_socket_timeout(self, value): + """Deserialize and apply the corresponding query string arg""" + try: + socket_timeout = float(value) + except ValueError as exc: + raise ValueError('Invalid socket_timeout value %r: %r' % + (value, exc,)) + self.socket_timeout = socket_timeout + + def _set_url_ssl_options(self, value): + """Deserialize and apply the corresponding query string arg + + """ + opts = ast.literal_eval(value) + if opts is None: + if self.ssl_options is not None: + raise ValueError( + 'Specified ssl_options=None URL arg is inconsistent with ' + 'the specified https URL scheme.') + else: + self.ssl_options = pika.SSLOptions( + keyfile=opts.get('keyfile'), + key_password=opts.get('key_password') or opts.get('password'), + certfile=opts.get('certfile'), + verify_mode=opts.get('verify_mode') or ssl.CERT_NONE, + ssl_version=opts.get('ssl_version') or ssl.PROTOCOL_TLSv1, + cafile=opts.get('cafile'), + capath=opts.get('capath'), + cadata=opts.get('cadata'), + ciphers=opts.get('ciphers'), + server_hostname=opts.get('server_hostname')) + + def _set_url_tcp_options(self, value): + """Deserialize and apply the corresponding query string arg""" + self.tcp_options = ast.literal_eval(value) + +class SSLOptions(object): + """Class used to provide parameters for optional fine grained control of SSL + socket wrapping. + + :param string keyfile: The key file to pass to SSLContext.load_cert_chain + :param string key_password: The key password to passed to + SSLContext.load_cert_chain + :param string certfile: The certificate file to passed to + SSLContext.load_cert_chain + :param bool server_side: Passed to SSLContext.wrap_socket + :param verify_mode: Passed to SSLContext.wrap_socket + :param ssl_version: Passed to SSLContext init, defines the ssl + version to use + :param string cafile: The CA file passed to + SSLContext.load_verify_locations + :param string capath: The CA path passed to + SSLContext.load_verify_locations + :param string cadata: The CA data passed to + SSLContext.load_verify_locations + :param do_handshake_on_connect: Passed to SSLContext.wrap_socket + :param suppress_ragged_eofs: Passed to SSLContext.wrap_socket + :param ciphers: Passed to SSLContext.set_ciphers + :param server_hostname: SSLContext.wrap_socket, used to enable SNI + """ + + def __init__(self, + keyfile=None, + key_password=None, + certfile=None, + server_side=False, + verify_mode=ssl.CERT_NONE, + ssl_version=ssl.PROTOCOL_TLSv1, + cafile=None, + capath=None, + cadata=None, + do_handshake_on_connect=True, + suppress_ragged_eofs=True, + ciphers=None, + server_hostname=None): + self.keyfile = keyfile + self.key_password = key_password + self.certfile = certfile + self.server_side = server_side + self.verify_mode = verify_mode + self.ssl_version = ssl_version + self.cafile = cafile + self.capath = capath + self.cadata = cadata + self.do_handshake_on_connect = do_handshake_on_connect + self.suppress_ragged_eofs = suppress_ragged_eofs + self.ciphers = ciphers + self.server_hostname = server_hostname + +class Connection(object): + """This is the core class that implements communication with RabbitMQ. This + class should not be invoked directly but rather through the use of an + adapter such as SelectConnection or BlockingConnection. + + :param pika.connection.Parameters parameters: Connection parameters + :param method on_open_callback: Called when the connection is opened + :param method on_open_error_callback: Called if the connection cant + be opened + :param method on_close_callback: Called when the connection is closed + + """ + + # Disable pylint messages concerning "method could be a funciton" + # pylint: disable=R0201 + + ON_CONNECTION_BACKPRESSURE = '_on_connection_backpressure' + ON_CONNECTION_BLOCKED = '_on_connection_blocked' + ON_CONNECTION_CLOSED = '_on_connection_closed' + ON_CONNECTION_ERROR = '_on_connection_error' + ON_CONNECTION_OPEN = '_on_connection_open' + ON_CONNECTION_UNBLOCKED = '_on_connection_unblocked' + CONNECTION_CLOSED = 0 + CONNECTION_INIT = 1 + CONNECTION_PROTOCOL = 2 + CONNECTION_START = 3 + CONNECTION_TUNE = 4 + CONNECTION_OPEN = 5 + CONNECTION_CLOSING = 6 # client-initiated close in progress + + _STATE_NAMES = { + CONNECTION_CLOSED: 'CLOSED', + CONNECTION_INIT: 'INIT', + CONNECTION_PROTOCOL: 'PROTOCOL', + CONNECTION_START: 'START', + CONNECTION_TUNE: 'TUNE', + CONNECTION_OPEN: 'OPEN', + CONNECTION_CLOSING: 'CLOSING' + } + + def __init__(self, + parameters=None, + on_open_callback=None, + on_open_error_callback=None, + on_close_callback=None): + """Connection initialization expects an object that has implemented the + Parameters class and a callback function to notify when we have + successfully connected to the AMQP Broker. + + Available Parameters classes are the ConnectionParameters class and + URLParameters class. + + :param pika.connection.Parameters parameters: Connection parameters + :param method on_open_callback: Called when the connection is opened + :param method on_open_error_callback: Called if the connection can't + be established: on_open_error_callback(connection, str|exception) + :param method on_close_callback: Called when the connection is closed: + `on_close_callback(connection, reason_code, reason_text)`, where + `reason_code` is either an IETF RFC 821 reply code for AMQP-level + closures or a value from `pika.connection.InternalCloseReasons` for + internal causes, such as socket errors. + + """ + self.connection_state = self.CONNECTION_CLOSED + + # Holds timer when the initial connect or reconnect is scheduled + self._connection_attempt_timer = None + + # Used to hold timer if configured for Connection.Blocked timeout + self._blocked_conn_timer = None + + self.heartbeat = None + + # Set our configuration options + self.params = (copy.deepcopy(parameters) if parameters is not None else + ConnectionParameters()) + + # Define our callback dictionary + self.callbacks = callback.CallbackManager() + + # Attributes that will be properly initialized by _init_connection_state + # and/or during connection handshake. + self.server_capabilities = None + self.server_properties = None + self._body_max_length = None + self.known_hosts = None + self.closing = None + self._frame_buffer = None + self._channels = None + self._backpressure_multiplier = None + self.remaining_connection_attempts = None + + self._init_connection_state() + + + # Add the on connection error callback + self.callbacks.add(0, self.ON_CONNECTION_ERROR, + on_open_error_callback or self._on_connection_error, + False) + + # On connection callback + if on_open_callback: + self.add_on_open_callback(on_open_callback) + + # On connection callback + if on_close_callback: + self.add_on_close_callback(on_close_callback) + + self.connect() + + def add_backpressure_callback(self, callback_method): + """Call method "callback" when pika believes backpressure is being + applied. + + :param method callback_method: The method to call + + """ + self.callbacks.add(0, self.ON_CONNECTION_BACKPRESSURE, callback_method, + False) + + def add_on_close_callback(self, callback_method): + """Add a callback notification when the connection has closed. The + callback will be passed the connection, the reply_code (int) and the + reply_text (str), if sent by the remote server. + + :param method callback_method: Callback to call on close + + """ + self.callbacks.add(0, self.ON_CONNECTION_CLOSED, callback_method, False) + + def add_on_connection_blocked_callback(self, callback_method): + """Add a callback to be notified when RabbitMQ has sent a + ``Connection.Blocked`` frame indicating that RabbitMQ is low on + resources. Publishers can use this to voluntarily suspend publishing, + instead of relying on back pressure throttling. The callback + will be passed the ``Connection.Blocked`` method frame. + + See also `ConnectionParameters.blocked_connection_timeout`. + + :param method callback_method: Callback to call on `Connection.Blocked`, + having the signature `callback_method(pika.frame.Method)`, where the + method frame's `method` member is of type + `pika.spec.Connection.Blocked` + + """ + self.callbacks.add(0, spec.Connection.Blocked, callback_method, False) + + def add_on_connection_unblocked_callback(self, callback_method): + """Add a callback to be notified when RabbitMQ has sent a + ``Connection.Unblocked`` frame letting publishers know it's ok + to start publishing again. The callback will be passed the + ``Connection.Unblocked`` method frame. + + :param method callback_method: Callback to call on + `Connection.Unblocked`, having the signature + `callback_method(pika.frame.Method)`, where the method frame's + `method` member is of type `pika.spec.Connection.Unblocked` + + """ + self.callbacks.add(0, spec.Connection.Unblocked, callback_method, False) + + def add_on_open_callback(self, callback_method): + """Add a callback notification when the connection has opened. + + :param method callback_method: Callback to call when open + + """ + self.callbacks.add(0, self.ON_CONNECTION_OPEN, callback_method, False) + + def add_on_open_error_callback(self, callback_method, remove_default=True): + """Add a callback notification when the connection can not be opened. + + The callback method should accept the connection object that could not + connect, and an optional error message. + + :param method callback_method: Callback to call when can't connect + :param bool remove_default: Remove default exception raising callback + + """ + if remove_default: + self.callbacks.remove(0, self.ON_CONNECTION_ERROR, + self._on_connection_error) + self.callbacks.add(0, self.ON_CONNECTION_ERROR, callback_method, False) + + def add_timeout(self, deadline, callback_method): + """Adapters should override to call the callback after the + specified number of seconds have elapsed, using a timer, or a + thread, or similar. + + :param int deadline: The number of seconds to wait to call callback + :param method callback_method: The callback method + + """ + raise NotImplementedError + + def channel(self, on_open_callback, channel_number=None): + """Create a new channel with the next available channel number or pass + in a channel number to use. Must be non-zero if you would like to + specify but it is recommended that you let Pika manage the channel + numbers. + + :param method on_open_callback: The callback when the channel is opened + :param int channel_number: The channel number to use, defaults to the + next available. + :rtype: pika.channel.Channel + + """ + if not self.is_open: + # TODO if state is OPENING, then ConnectionClosed might be wrong + raise exceptions.ConnectionClosed( + 'Channel allocation requires an open connection: %s' % self) + + if not channel_number: + channel_number = self._next_channel_number() + self._channels[channel_number] = self._create_channel(channel_number, + on_open_callback) + self._add_channel_callbacks(channel_number) + self._channels[channel_number].open() + return self._channels[channel_number] + + def close(self, reply_code=200, reply_text='Normal shutdown'): + """Disconnect from RabbitMQ. If there are any open channels, it will + attempt to close them prior to fully disconnecting. Channels which + have active consumers will attempt to send a Basic.Cancel to RabbitMQ + to cleanly stop the delivery of messages prior to closing the channel. + + :param int reply_code: The code number for the close + :param str reply_text: The text reason for the close + + """ + if self.is_closing or self.is_closed: + LOGGER.warning('Suppressing close request on %s', self) + return + + # NOTE The connection is either in opening or open state + + # Initiate graceful closing of channels that are OPEN or OPENING + if self._channels: + self._close_channels(reply_code, reply_text) + + # Set our connection state + self._set_connection_state(self.CONNECTION_CLOSING) + LOGGER.info("Closing connection (%s): %s", reply_code, reply_text) + self.closing = reply_code, reply_text + + # If there are channels that haven't finished closing yet, then + # _on_close_ready will finally be called from _on_channel_cleanup once + # all channels have been closed + if not self._channels: + # We can initiate graceful closing of the connection right away, + # since no more channels remain + self._on_close_ready() + else: + LOGGER.info('Connection.close is waiting for ' + '%d channels to close: %s', len(self._channels), self) + + def connect(self): + """Invoke if trying to reconnect to a RabbitMQ server. Constructing the + Connection object should connect on its own. + + """ + assert self._connection_attempt_timer is None, ( + 'connect timer was already scheduled') + + assert self.is_closed, ( + 'connect expected CLOSED state, but got: {}'.format( + self._STATE_NAMES[self.connection_state])) + + self._set_connection_state(self.CONNECTION_INIT) + + # Schedule a timer callback to start the actual connection logic from + # event loop's context, thus avoiding error callbacks in the context of + # the caller, which could be the constructor. + self._connection_attempt_timer = self.add_timeout( + 0, + self._on_connect_timer) + + + def remove_timeout(self, timeout_id): + """Adapters should override: Remove a timeout + + :param str timeout_id: The timeout id to remove + + """ + raise NotImplementedError + + def set_backpressure_multiplier(self, value=10): + """Alter the backpressure multiplier value. We set this to 10 by default. + This value is used to raise warnings and trigger the backpressure + callback. + + :param int value: The multiplier value to set + + """ + self._backpressure_multiplier = value + + # + # Connection state properties + # + + @property + def is_closed(self): + """ + Returns a boolean reporting the current connection state. + """ + return self.connection_state == self.CONNECTION_CLOSED + + @property + def is_closing(self): + """ + Returns True if connection is in the process of closing due to + client-initiated `close` request, but closing is not yet complete. + """ + return self.connection_state == self.CONNECTION_CLOSING + + @property + def is_open(self): + """ + Returns a boolean reporting the current connection state. + """ + return self.connection_state == self.CONNECTION_OPEN + + # + # Properties that reflect server capabilities for the current connection + # + + @property + def basic_nack(self): + """Specifies if the server supports basic.nack on the active connection. + + :rtype: bool + + """ + return self.server_capabilities.get('basic.nack', False) + + @property + def consumer_cancel_notify(self): + """Specifies if the server supports consumer cancel notification on the + active connection. + + :rtype: bool + + """ + return self.server_capabilities.get('consumer_cancel_notify', False) + + @property + def exchange_exchange_bindings(self): + """Specifies if the active connection supports exchange to exchange + bindings. + + :rtype: bool + + """ + return self.server_capabilities.get('exchange_exchange_bindings', False) + + @property + def publisher_confirms(self): + """Specifies if the active connection can use publisher confirmations. + + :rtype: bool + + """ + return self.server_capabilities.get('publisher_confirms', False) + + # + # Internal methods for managing the communication process + # + + def _adapter_connect(self): + """Subclasses should override to set up the outbound socket connection. + + :raises: NotImplementedError + + """ + raise NotImplementedError + + def _adapter_disconnect(self): + """Subclasses should override this to cause the underlying transport + (socket) to close. + + :raises: NotImplementedError + + """ + raise NotImplementedError + + def _add_channel_callbacks(self, channel_number): + """Add the appropriate callbacks for the specified channel number. + + :param int channel_number: The channel number for the callbacks + + """ + # pylint: disable=W0212 + + # This permits us to garbage-collect our reference to the channel + # regardless of whether it was closed by client or broker, and do so + # after all channel-close callbacks. + self._channels[channel_number]._add_on_cleanup_callback( + self._on_channel_cleanup) + + def _add_connection_start_callback(self): + """Add a callback for when a Connection.Start frame is received from + the broker. + + """ + self.callbacks.add(0, spec.Connection.Start, self._on_connection_start) + + def _add_connection_tune_callback(self): + """Add a callback for when a Connection.Tune frame is received.""" + self.callbacks.add(0, spec.Connection.Tune, self._on_connection_tune) + + def _append_frame_buffer(self, value): + """Append the bytes to the frame buffer. + + :param str value: The bytes to append to the frame buffer + + """ + self._frame_buffer += value + + @property + def _buffer_size(self): + """Return the suggested buffer size from the connection state/tune or + the default if that is None. + + :rtype: int + + """ + return self.params.frame_max or spec.FRAME_MAX_SIZE + + def _check_for_protocol_mismatch(self, value): + """Invoked when starting a connection to make sure it's a supported + protocol. + + :param pika.frame.Method value: The frame to check + :raises: ProtocolVersionMismatch + + """ + if (value.method.version_major, + value.method.version_minor) != spec.PROTOCOL_VERSION[0:2]: + # TODO This should call _on_terminate for proper callbacks and + # cleanup + raise exceptions.ProtocolVersionMismatch(frame.ProtocolHeader(), + value) + + @property + def _client_properties(self): + """Return the client properties dictionary. + + :rtype: dict + + """ + properties = { + 'product': PRODUCT, + 'platform': 'Python %s' % platform.python_version(), + 'capabilities': { + 'authentication_failure_close': True, + 'basic.nack': True, + 'connection.blocked': True, + 'consumer_cancel_notify': True, + 'publisher_confirms': True + }, + 'information': 'See http://pika.rtfd.org', + 'version': __version__ + } + + if self.params.client_properties: + properties.update(self.params.client_properties) + + return properties + + def _close_channels(self, reply_code, reply_text): + """Initiate graceful closing of channels that are in OPEN or OPENING + states, passing reply_code and reply_text. + + :param int reply_code: The code for why the channels are being closed + :param str reply_text: The text reason for why the channels are closing + + """ + assert self.is_open, str(self) + + for channel_number in dictkeys(self._channels): + chan = self._channels[channel_number] + if not (chan.is_closing or chan.is_closed): + chan.close(reply_code, reply_text) + + def _connect(self): + """Attempt to connect to RabbitMQ + + :rtype: bool + + """ + warnings.warn('This method is deprecated, use Connection.connect', + DeprecationWarning) + + def _create_channel(self, channel_number, on_open_callback): + """Create a new channel using the specified channel number and calling + back the method specified by on_open_callback + + :param int channel_number: The channel number to use + :param method on_open_callback: The callback when the channel is opened + + """ + LOGGER.debug('Creating channel %s', channel_number) + return pika.channel.Channel(self, channel_number, on_open_callback) + + def _create_heartbeat_checker(self): + """Create a heartbeat checker instance if there is a heartbeat interval + set. + + :rtype: pika.heartbeat.Heartbeat|None + + """ + if self.params.heartbeat is not None and self.params.heartbeat > 0: + LOGGER.debug('Creating a HeartbeatChecker: %r', + self.params.heartbeat) + return heartbeat.HeartbeatChecker(self, self.params.heartbeat) + + return None + + def _remove_heartbeat(self): + """Stop the heartbeat checker if it exists + + """ + if self.heartbeat: + self.heartbeat.stop() + self.heartbeat = None + + def _deliver_frame_to_channel(self, value): + """Deliver the frame to the channel specified in the frame. + + :param pika.frame.Method value: The frame to deliver + + """ + if not value.channel_number in self._channels: + # This should never happen and would constitute breach of the + # protocol + LOGGER.critical( + 'Received %s frame for unregistered channel %i on %s', + value.NAME, value.channel_number, self) + return + + # pylint: disable=W0212 + self._channels[value.channel_number]._handle_content_frame(value) + + def _detect_backpressure(self): + """Attempt to calculate if TCP backpressure is being applied due to + our outbound buffer being larger than the average frame size over + a window of frames. + + """ + avg_frame_size = self.bytes_sent / self.frames_sent + buffer_size = sum([len(f) for f in self.outbound_buffer]) + if buffer_size > (avg_frame_size * self._backpressure_multiplier): + LOGGER.warning(BACKPRESSURE_WARNING, buffer_size, + int(buffer_size / avg_frame_size)) + self.callbacks.process(0, self.ON_CONNECTION_BACKPRESSURE, self) + + def _ensure_closed(self): + """If the connection is not closed, close it.""" + if self.is_open: + self.close() + + def _flush_outbound(self): + """Adapters should override to flush the contents of outbound_buffer + out along the socket. + + :raises: NotImplementedError + + """ + raise NotImplementedError + + def _get_body_frame_max_length(self): + """Calculate the maximum amount of bytes that can be in a body frame. + + :rtype: int + + """ + return ( + self.params.frame_max - spec.FRAME_HEADER_SIZE - spec.FRAME_END_SIZE + ) + + def _get_credentials(self, method_frame): + """Get credentials for authentication. + + :param pika.frame.MethodFrame method_frame: The Connection.Start frame + :rtype: tuple(str, str) + + """ + (auth_type, + response) = self.params.credentials.response_for(method_frame.method) + if not auth_type: + # TODO this should call _on_terminate for proper callbacks and + # cleanup instead + raise exceptions.AuthenticationError(self.params.credentials.TYPE) + self.params.credentials.erase_credentials() + return auth_type, response + + def _has_pending_callbacks(self, value): + """Return true if there are any callbacks pending for the specified + frame. + + :param pika.frame.Method value: The frame to check + :rtype: bool + + """ + return self.callbacks.pending(value.channel_number, value.method) + + def _init_connection_state(self): + """Initialize or reset all of the internal state variables for a given + connection. On disconnect or reconnect all of the state needs to + be wiped. + + """ + # Connection state + self._set_connection_state(self.CONNECTION_CLOSED) + + # Negotiated server properties + self.server_properties = None + + # Outbound buffer for buffering writes until we're able to send them + self.outbound_buffer = collections.deque([]) + + # Inbound buffer for decoding frames + self._frame_buffer = bytes() + + # Dict of open channels + self._channels = dict() + + # Remaining connection attempts + self.remaining_connection_attempts = self.params.connection_attempts + + # Data used for Heartbeat checking and back-pressure detection + self.bytes_sent = 0 + self.bytes_received = 0 + self.frames_sent = 0 + self.frames_received = 0 + self.heartbeat = None + + # Default back-pressure multiplier value + self._backpressure_multiplier = 10 + + # When closing, hold reason why + self.closing = 0, 'Not specified' + + # Our starting point once connected, first frame received + self._add_connection_start_callback() + + # Add a callback handler for the Broker telling us to disconnect. + # NOTE: As of RabbitMQ 3.6.0, RabbitMQ broker may send Connection.Close + # to signal error during connection setup (and wait a longish time + # before closing the TCP/IP stream). Earlier RabbitMQ versions + # simply closed the TCP/IP stream. + self.callbacks.add(0, spec.Connection.Close, self._on_connection_close) + + if self._connection_attempt_timer is not None: + # Connection attempt timer was active when teardown was initiated + self.remove_timeout(self._connection_attempt_timer) + self._connection_attempt_timer = None + + if self.params.blocked_connection_timeout is not None: + if self._blocked_conn_timer is not None: + # Blocked connection timer was active when teardown was + # initiated + self.remove_timeout(self._blocked_conn_timer) + self._blocked_conn_timer = None + + self.add_on_connection_blocked_callback( + self._on_connection_blocked) + self.add_on_connection_unblocked_callback( + self._on_connection_unblocked) + + def _is_method_frame(self, value): + """Returns true if the frame is a method frame. + + :param pika.frame.Frame value: The frame to evaluate + :rtype: bool + + """ + return isinstance(value, frame.Method) + + def _is_protocol_header_frame(self, value): + """Returns True if it's a protocol header frame. + + :rtype: bool + + """ + return isinstance(value, frame.ProtocolHeader) + + def _next_channel_number(self): + """Return the next available channel number or raise an exception. + + :rtype: int + + """ + limit = self.params.channel_max or pika.channel.MAX_CHANNELS + if len(self._channels) >= limit: + raise exceptions.NoFreeChannels() + + for num in xrange(1, len(self._channels) + 1): + if num not in self._channels: + return num + return len(self._channels) + 1 + + def _on_channel_cleanup(self, channel): + """Remove the channel from the dict of channels when Channel.CloseOk is + sent. If connection is closing and no more channels remain, proceed to + `_on_close_ready`. + + :param pika.channel.Channel channel: channel instance + + """ + try: + del self._channels[channel.channel_number] + LOGGER.debug('Removed channel %s', channel.channel_number) + except KeyError: + LOGGER.error('Channel %r not in channels', + channel.channel_number) + if self.is_closing: + if not self._channels: + # Initiate graceful closing of the connection + self._on_close_ready() + else: + # Once Connection enters CLOSING state, all remaining channels + # should also be in CLOSING state. Deviation from this would + # prevent Connection from completing its closing procedure. + channels_not_in_closing_state = [ + chan for chan in dict_itervalues(self._channels) + if not chan.is_closing] + if channels_not_in_closing_state: + LOGGER.critical( + 'Connection in CLOSING state has non-CLOSING ' + 'channels: %r', channels_not_in_closing_state) + + def _on_close_ready(self): + """Called when the Connection is in a state that it can close after + a close has been requested. This happens, for example, when all of the + channels are closed that were open when the close request was made. + + """ + if self.is_closed: + LOGGER.warning('_on_close_ready invoked when already closed') + return + + self._send_connection_close(self.closing[0], self.closing[1]) + + def _on_connected(self): + """Invoked when the socket is connected and it's time to start speaking + AMQP with the broker. + + """ + self._set_connection_state(self.CONNECTION_PROTOCOL) + + # Start the communication with the RabbitMQ Broker + self._send_frame(frame.ProtocolHeader()) + + def _on_blocked_connection_timeout(self): + """ Called when the "connection blocked timeout" expires. When this + happens, we tear down the connection + + """ + self._blocked_conn_timer = None + self._on_terminate(InternalCloseReasons.BLOCKED_CONNECTION_TIMEOUT, + 'Blocked connection timeout expired') + + def _on_connection_blocked(self, method_frame): + """Handle Connection.Blocked notification from RabbitMQ broker + + :param pika.frame.Method method_frame: method frame having `method` + member of type `pika.spec.Connection.Blocked` + """ + LOGGER.warning('Received %s from broker', method_frame) + + if self._blocked_conn_timer is not None: + # RabbitMQ is not supposed to repeat Connection.Blocked, but it + # doesn't hurt to be careful + LOGGER.warning('_blocked_conn_timer %s already set when ' + '_on_connection_blocked is called', + self._blocked_conn_timer) + else: + self._blocked_conn_timer = self.add_timeout( + self.params.blocked_connection_timeout, + self._on_blocked_connection_timeout) + + def _on_connection_unblocked(self, method_frame): + """Handle Connection.Unblocked notification from RabbitMQ broker + + :param pika.frame.Method method_frame: method frame having `method` + member of type `pika.spec.Connection.Blocked` + """ + LOGGER.info('Received %s from broker', method_frame) + + if self._blocked_conn_timer is None: + # RabbitMQ is supposed to pair Connection.Blocked/Unblocked, but it + # doesn't hurt to be careful + LOGGER.warning('_blocked_conn_timer was not active when ' + '_on_connection_unblocked called') + else: + self.remove_timeout(self._blocked_conn_timer) + self._blocked_conn_timer = None + + def _on_connection_close(self, method_frame): + """Called when the connection is closed remotely via Connection.Close + frame from broker. + + :param pika.frame.Method method_frame: The Connection.Close frame + + """ + LOGGER.debug('_on_connection_close: frame=%s', method_frame) + + self.closing = (method_frame.method.reply_code, + method_frame.method.reply_text) + + self._on_terminate(self.closing[0], self.closing[1]) + + def _on_connection_close_ok(self, method_frame): + """Called when Connection.CloseOk is received from remote. + + :param pika.frame.Method method_frame: The Connection.CloseOk frame + + """ + LOGGER.debug('_on_connection_close_ok: frame=%s', method_frame) + + self._on_terminate(self.closing[0], self.closing[1]) + + def _on_connection_error(self, _connection_unused, error_message=None): + """Default behavior when the connecting connection can not connect. + + :raises: exceptions.AMQPConnectionError + + """ + raise exceptions.AMQPConnectionError(error_message or + self.params.connection_attempts) + + def _on_connection_open(self, method_frame): + """ + This is called once we have tuned the connection with the server and + called the Connection.Open on the server and it has replied with + Connection.Ok. + """ + # TODO _on_connection_open - what if user started closing it already? + # It shouldn't transition to OPEN if in closing state. Just log and skip + # the rest. + + self.known_hosts = method_frame.method.known_hosts + + # We're now connected at the AMQP level + self._set_connection_state(self.CONNECTION_OPEN) + + # Call our initial callback that we're open + self.callbacks.process(0, self.ON_CONNECTION_OPEN, self, self) + + def _on_connection_start(self, method_frame): + """This is called as a callback once we have received a Connection.Start + from the server. + + :param pika.frame.Method method_frame: The frame received + :raises: UnexpectedFrameError + + """ + self._set_connection_state(self.CONNECTION_START) + if self._is_protocol_header_frame(method_frame): + raise exceptions.UnexpectedFrameError + self._check_for_protocol_mismatch(method_frame) + self._set_server_information(method_frame) + self._add_connection_tune_callback() + self._send_connection_start_ok(*self._get_credentials(method_frame)) + + def _on_connect_timer(self): + """Callback for self._connection_attempt_timer: initiate connection + attempt in the context of the event loop + + """ + self._connection_attempt_timer = None + + error = self._adapter_connect() + if not error: + self._on_connected() + return + + self.remaining_connection_attempts -= 1 + LOGGER.warning('Could not connect, %i attempts left', + self.remaining_connection_attempts) + if self.remaining_connection_attempts > 0: + LOGGER.info('Retrying in %i seconds', self.params.retry_delay) + self._connection_attempt_timer = self.add_timeout( + self.params.retry_delay, + self._on_connect_timer) + else: + # TODO connect must not call failure callback from constructor. The + # current behavior is error-prone, because the user code may get a + # callback upon socket connection failure before user's other state + # may be sufficiently initialized. Constructors must either succeed + # or raise an exception. To be forward-compatible with failure + # reporting from fully non-blocking connection establishment, + # connect() should set INIT state and schedule a 0-second timer to + # continue the rest of the logic in a private method. The private + # method should use itself instead of connect() as the callback for + # scheduling retries. + + # TODO This should use _on_terminate for consistent behavior/cleanup + self.callbacks.process(0, self.ON_CONNECTION_ERROR, self, self, + error) + self.remaining_connection_attempts = self.params.connection_attempts + self._set_connection_state(self.CONNECTION_CLOSED) + + @staticmethod + def _negotiate_integer_value(client_value, server_value): + """Negotiates two values. If either of them is 0 or None, + returns the other one. If both are positive integers, returns the + smallest one. + + :param int client_value: The client value + :param int server_value: The server value + :rtype: int + + """ + if client_value == None: + client_value = 0 + if server_value == None: + server_value = 0 + + # this is consistent with how Java client and Bunny + # perform negotiation, see pika/pika#874 + if client_value == 0 or server_value == 0: + val = max(client_value, server_value) + else: + val = min(client_value, server_value) + + return val + + @staticmethod + def _tune_heartbeat_timeout(client_value, server_value): + """ Determine heartbeat timeout per AMQP 0-9-1 rules + + Per https://www.rabbitmq.com/resources/specs/amqp0-9-1.pdf, + + > Both peers negotiate the limits to the lowest agreed value as follows: + > - The server MUST tell the client what limits it proposes. + > - The client responds and **MAY reduce those limits** for its + connection + + If the client specifies a value, it always takes precedence. + + :param client_value: None to accept server_value; otherwise, an integral + number in seconds; 0 (zero) to disable heartbeat. + :param server_value: integral value of the heartbeat timeout proposed by + broker; 0 (zero) to disable heartbeat. + + :returns: the value of the heartbeat timeout to use and return to broker + """ + if client_value is None: + # Accept server's limit + timeout = server_value + else: + timeout = client_value + + return timeout + + def _on_connection_tune(self, method_frame): + """Once the Broker sends back a Connection.Tune, we will set our tuning + variables that have been returned to us and kick off the Heartbeat + monitor if required, send our TuneOk and then the Connection. Open rpc + call on channel 0. + + :param pika.frame.Method method_frame: The frame received + + """ + self._set_connection_state(self.CONNECTION_TUNE) + + # Get our max channels, frames and heartbeat interval + self.params.channel_max = Connection._negotiate_integer_value(self.params.channel_max, + method_frame.method.channel_max) + self.params.frame_max = Connection._negotiate_integer_value(self.params.frame_max, + method_frame.method.frame_max) + + if callable(self.params.heartbeat): + ret_heartbeat = self.params.heartbeat(self, method_frame.method.heartbeat) + if ret_heartbeat is None or callable(ret_heartbeat): + # Enforce callback-specific restrictions on callback's return value + raise TypeError('heartbeat callback must not return None ' + 'or callable, but got %r' % (ret_heartbeat,)) + + # Leave it to hearbeat setter deal with the rest of the validation + self.params.heartbeat = ret_heartbeat + + # Negotiate heatbeat timeout + self.params.heartbeat = self._tune_heartbeat_timeout( + client_value=self.params.heartbeat, + server_value=method_frame.method.heartbeat) + + # Calculate the maximum pieces for body frames + self._body_max_length = self._get_body_frame_max_length() + + # Create a new heartbeat checker if needed + self.heartbeat = self._create_heartbeat_checker() + + # Send the TuneOk response with what we've agreed upon + self._send_connection_tune_ok() + + # Send the Connection.Open RPC call for the vhost + self._send_connection_open() + + def _on_data_available(self, data_in): + """This is called by our Adapter, passing in the data from the socket. + As long as we have buffer try and map out frame data. + + :param str data_in: The data that is available to read + + """ + self._append_frame_buffer(data_in) + while self._frame_buffer: + consumed_count, frame_value = self._read_frame() + if not frame_value: + return + self._trim_frame_buffer(consumed_count) + self._process_frame(frame_value) + + def _on_terminate(self, reason_code, reason_text): + """Terminate the connection and notify registered ON_CONNECTION_ERROR + and/or ON_CONNECTION_CLOSED callbacks + + :param integer reason_code: either IETF RFC 821 reply code for + AMQP-level closures or a value from `InternalCloseReasons` for + internal causes, such as socket errors + :param str reason_text: human-readable text message describing the error + """ + LOGGER.info( + 'Disconnected from RabbitMQ at %s:%i (%s): %s', + self.params.host, self.params.port, reason_code, + reason_text) + + if not isinstance(reason_code, numbers.Integral): + raise TypeError('reason_code must be an integer, but got %r' + % (reason_code,)) + + # Stop the heartbeat checker if it exists + self._remove_heartbeat() + + # Remove connection management callbacks + # TODO This call was moved here verbatim from legacy code and the + # following doesn't seem to be right: `Connection.Open` here is + # unexpected, we don't appear to ever register it, and the broker + # shouldn't be sending `Connection.Open` to us, anyway. + self._remove_callbacks(0, [spec.Connection.Close, spec.Connection.Start, + spec.Connection.Open]) + + if self.params.blocked_connection_timeout is not None: + self._remove_callbacks(0, [spec.Connection.Blocked, + spec.Connection.Unblocked]) + + # Close the socket + self._adapter_disconnect() + + # Determine whether this was an error during connection setup + connection_error = None + + if self.connection_state == self.CONNECTION_PROTOCOL: + LOGGER.error('Incompatible Protocol Versions') + connection_error = exceptions.IncompatibleProtocolError( + reason_code, + reason_text) + elif self.connection_state == self.CONNECTION_START: + LOGGER.error('Connection closed while authenticating indicating a ' + 'probable authentication error') + connection_error = exceptions.ProbableAuthenticationError( + reason_code, + reason_text) + elif self.connection_state == self.CONNECTION_TUNE: + LOGGER.error('Connection closed while tuning the connection ' + 'indicating a probable permission error when ' + 'accessing a virtual host') + connection_error = exceptions.ProbableAccessDeniedError( + reason_code, + reason_text) + elif self.connection_state not in [self.CONNECTION_OPEN, + self.CONNECTION_CLOSED, + self.CONNECTION_CLOSING]: + LOGGER.warning('Unexpected connection state on disconnect: %i', + self.connection_state) + + # Transition to closed state + self._set_connection_state(self.CONNECTION_CLOSED) + + # Inform our channel proxies + for channel in dictkeys(self._channels): + if channel not in self._channels: + continue + # pylint: disable=W0212 + self._channels[channel]._on_close_meta(reason_code, reason_text) + + # Inform interested parties + if connection_error is not None: + LOGGER.error('Connection setup failed due to %r', connection_error) + self.callbacks.process(0, + self.ON_CONNECTION_ERROR, + self, self, + connection_error) + + self.callbacks.process(0, self.ON_CONNECTION_CLOSED, self, self, + reason_code, reason_text) + + # Reset connection properties + self._init_connection_state() + + def _process_callbacks(self, frame_value): + """Process the callbacks for the frame if the frame is a method frame + and if it has any callbacks pending. + + :param pika.frame.Method frame_value: The frame to process + :rtype: bool + + """ + if (self._is_method_frame(frame_value) and + self._has_pending_callbacks(frame_value)): + self.callbacks.process(frame_value.channel_number, # Prefix + frame_value.method, # Key + self, # Caller + frame_value) # Args + return True + return False + + def _process_frame(self, frame_value): + """Process an inbound frame from the socket. + + :param frame_value: The frame to process + :type frame_value: pika.frame.Frame | pika.frame.Method + + """ + # Will receive a frame type of -1 if protocol version mismatch + if frame_value.frame_type < 0: + return + + # Keep track of how many frames have been read + self.frames_received += 1 + + # Process any callbacks, if True, exit method + if self._process_callbacks(frame_value): + return + + # If a heartbeat is received, update the checker + if isinstance(frame_value, frame.Heartbeat): + if self.heartbeat: + self.heartbeat.received() + else: + LOGGER.warning('Received heartbeat frame without a heartbeat ' + 'checker') + + # If the frame has a channel number beyond the base channel, deliver it + elif frame_value.channel_number > 0: + self._deliver_frame_to_channel(frame_value) + + def _read_frame(self): + """Try and read from the frame buffer and decode a frame. + + :rtype tuple: (int, pika.frame.Frame) + + """ + return frame.decode_frame(self._frame_buffer) + + def _remove_callback(self, channel_number, method_class): + """Remove the specified method_frame callback if it is set for the + specified channel number. + + :param int channel_number: The channel number to remove the callback on + :param pika.amqp_object.Method method_class: The method class for the + callback + + """ + self.callbacks.remove(str(channel_number), method_class) + + def _remove_callbacks(self, channel_number, method_classes): + """Remove the callbacks for the specified channel number and list of + method frames. + + :param int channel_number: The channel number to remove the callback on + :param sequence method_classes: The method classes (derived from + `pika.amqp_object.Method`) for the callbacks + + """ + for method_frame in method_classes: + self._remove_callback(channel_number, method_frame) + + def _rpc(self, channel_number, method, + callback_method=None, + acceptable_replies=None): + """Make an RPC call for the given callback, channel number and method. + acceptable_replies lists out what responses we'll process from the + server with the specified callback. + + :param int channel_number: The channel number for the RPC call + :param pika.amqp_object.Method method: The method frame to call + :param method callback_method: The callback for the RPC response + :param list acceptable_replies: The replies this RPC call expects + + """ + # Validate that acceptable_replies is a list or None + if acceptable_replies and not isinstance(acceptable_replies, list): + raise TypeError('acceptable_replies should be list or None') + + # Validate the callback is callable + if callback_method: + if not utils.is_callable(callback_method): + raise TypeError('callback should be None, function or method.') + + for reply in acceptable_replies: + self.callbacks.add(channel_number, reply, callback_method) + + # Send the rpc call to RabbitMQ + self._send_method(channel_number, method) + + def _send_connection_close(self, reply_code, reply_text): + """Send a Connection.Close method frame. + + :param int reply_code: The reason for the close + :param str reply_text: The text reason for the close + + """ + self._rpc(0, spec.Connection.Close(reply_code, reply_text, 0, 0), + self._on_connection_close_ok, [spec.Connection.CloseOk]) + + def _send_connection_open(self): + """Send a Connection.Open frame""" + self._rpc(0, spec.Connection.Open(self.params.virtual_host, + insist=True), + self._on_connection_open, [spec.Connection.OpenOk]) + + def _send_connection_start_ok(self, authentication_type, response): + """Send a Connection.StartOk frame + + :param str authentication_type: The auth type value + :param str response: The encoded value to send + + """ + self._send_method(0, + spec.Connection.StartOk(self._client_properties, + authentication_type, response, + self.params.locale)) + + def _send_connection_tune_ok(self): + """Send a Connection.TuneOk frame""" + self._send_method(0, spec.Connection.TuneOk(self.params.channel_max, + self.params.frame_max, + self.params.heartbeat)) + + def _send_frame(self, frame_value): + """This appends the fully generated frame to send to the broker to the + output buffer which will be then sent via the connection adapter. + + :param frame_value: The frame to write + :type frame_value: pika.frame.Frame|pika.frame.ProtocolHeader + :raises: exceptions.ConnectionClosed + + """ + if self.is_closed: + LOGGER.error('Attempted to send frame when closed') + raise exceptions.ConnectionClosed + + marshaled_frame = frame_value.marshal() + self.bytes_sent += len(marshaled_frame) + self.frames_sent += 1 + self.outbound_buffer.append(marshaled_frame) + self._flush_outbound() + if self.params.backpressure_detection: + self._detect_backpressure() + + def _send_method(self, channel_number, method, content=None): + """Constructs a RPC method frame and then sends it to the broker. + + :param int channel_number: The channel number for the frame + :param pika.amqp_object.Method method: The method to send + :param tuple content: If set, is a content frame, is tuple of + properties and body. + + """ + if content: + self._send_message(channel_number, method, content) + else: + self._send_frame(frame.Method(channel_number, method)) + + def _send_message(self, channel_number, method_frame, content): + """Publish a message. + + :param int channel_number: The channel number for the frame + :param pika.object.Method method_frame: The method frame to send + :param tuple content: A content frame, which is tuple of properties and + body. + + """ + length = len(content[1]) + self._send_frame(frame.Method(channel_number, method_frame)) + self._send_frame(frame.Header(channel_number, length, content[0])) + + if content[1]: + chunks = int(math.ceil(float(length) / self._body_max_length)) + for chunk in xrange(0, chunks): + s = chunk * self._body_max_length + e = s + self._body_max_length + if e > length: + e = length + self._send_frame(frame.Body(channel_number, content[1][s:e])) + + def _set_connection_state(self, connection_state): + """Set the connection state. + + :param int connection_state: The connection state to set + + """ + self.connection_state = connection_state + + def _set_server_information(self, method_frame): + """Set the server properties and capabilities + + :param spec.connection.Start method_frame: The Connection.Start frame + + """ + self.server_properties = method_frame.method.server_properties + self.server_capabilities = self.server_properties.get('capabilities', + dict()) + if hasattr(self.server_properties, 'capabilities'): + del self.server_properties['capabilities'] + + def _trim_frame_buffer(self, byte_count): + """Trim the leading N bytes off the frame buffer and increment the + counter that keeps track of how many bytes have been read/used from the + socket. + + :param int byte_count: The number of bytes consumed + + """ + self._frame_buffer = self._frame_buffer[byte_count:] + self.bytes_received += byte_count diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/pika/credentials.py b/NodeRed/NodeRedFiles/pika-0.13.1/pika/credentials.py new file mode 100644 index 000000000..09e0cae46 --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/pika/credentials.py @@ -0,0 +1,120 @@ +"""The credentials classes are used to encapsulate all authentication +information for the :class:`~pika.connection.ConnectionParameters` class. + +The :class:`~pika.credentials.PlainCredentials` class returns the properly +formatted username and password to the :class:`~pika.connection.Connection`. + +To authenticate with Pika, create a :class:`~pika.credentials.PlainCredentials` +object passing in the username and password and pass it as the credentials +argument value to the :class:`~pika.connection.ConnectionParameters` object. + +If you are using :class:`~pika.connection.URLParameters` you do not need a +credentials object, one will automatically be created for you. + +If you are looking to implement SSL certificate style authentication, you would +extend the :class:`~pika.credentials.ExternalCredentials` class implementing +the required behavior. + +""" +from .compat import as_bytes +import logging + +LOGGER = logging.getLogger(__name__) + + +class PlainCredentials(object): + """A credentials object for the default authentication methodology with + RabbitMQ. + + If you do not pass in credentials to the ConnectionParameters object, it + will create credentials for 'guest' with the password of 'guest'. + + If you pass True to erase_on_connect the credentials will not be stored + in memory after the Connection attempt has been made. + + :param str username: The username to authenticate with + :param str password: The password to authenticate with + :param bool erase_on_connect: erase credentials on connect. + + """ + TYPE = 'PLAIN' + + def __init__(self, username, password, erase_on_connect=False): + """Create a new instance of PlainCredentials + + :param str username: The username to authenticate with + :param str password: The password to authenticate with + :param bool erase_on_connect: erase credentials on connect. + + """ + self.username = username + self.password = password + self.erase_on_connect = erase_on_connect + + def __eq__(self, other): + return (isinstance(other, PlainCredentials) and + other.username == self.username and + other.password == self.password and + other.erase_on_connect == self.erase_on_connect) + + def __ne__(self, other): + return not self == other + + def response_for(self, start): + """Validate that this type of authentication is supported + + :param spec.Connection.Start start: Connection.Start method + :rtype: tuple(str|None, str|None) + + """ + if as_bytes(PlainCredentials.TYPE) not in\ + as_bytes(start.mechanisms).split(): + return None, None + return (PlainCredentials.TYPE, + b'\0' + as_bytes(self.username) + + b'\0' + as_bytes(self.password)) + + def erase_credentials(self): + """Called by Connection when it no longer needs the credentials""" + if self.erase_on_connect: + LOGGER.info("Erasing stored credential values") + self.username = None + self.password = None + + +class ExternalCredentials(object): + """The ExternalCredentials class allows the connection to use EXTERNAL + authentication, generally with a client SSL certificate. + + """ + TYPE = 'EXTERNAL' + + def __init__(self): + """Create a new instance of ExternalCredentials""" + self.erase_on_connect = False + + def __eq__(self, other): + return (isinstance(other, ExternalCredentials) and + other.erase_on_connect == self.erase_on_connect) + + def __ne__(self, other): + return not self == other + + def response_for(self, start): + """Validate that this type of authentication is supported + + :param spec.Connection.Start start: Connection.Start method + :rtype: tuple(str or None, str or None) + + """ + if as_bytes(ExternalCredentials.TYPE) not in\ + as_bytes(start.mechanisms).split(): + return None, None + return ExternalCredentials.TYPE, b'' + + def erase_credentials(self): + """Called by Connection when it no longer needs the credentials""" + LOGGER.debug('Not supported by this Credentials type') + +# Append custom credential types to this list for validation support +VALID_TYPES = [PlainCredentials, ExternalCredentials] diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/pika/data.py b/NodeRed/NodeRedFiles/pika-0.13.1/pika/data.py new file mode 100644 index 000000000..b5bc5d92d --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/pika/data.py @@ -0,0 +1,322 @@ +"""AMQP Table Encoding/Decoding""" +import struct +import decimal +import calendar +import warnings + +from datetime import datetime + +from pika import exceptions +from pika.compat import PY2, PY3 +from pika.compat import unicode_type, long, as_bytes + + +def encode_short_string(pieces, value): + """Encode a string value as short string and append it to pieces list + returning the size of the encoded value. + + :param list pieces: Already encoded values + :param value: String value to encode + :type value: str or unicode + :rtype: int + + """ + encoded_value = as_bytes(value) + length = len(encoded_value) + + # 4.2.5.3 + # Short strings, stored as an 8-bit unsigned integer length followed by zero + # or more octets of data. Short strings can carry up to 255 octets of UTF-8 + # data, but may not contain binary zero octets. + # ... + # 4.2.5.5 + # The server SHOULD validate field names and upon receiving an invalid field + # name, it SHOULD signal a connection exception with reply code 503 (syntax + # error). + # -> validate length (avoid truncated utf-8 / corrupted data), but skip null + # byte check. + if length > 255: + raise exceptions.ShortStringTooLong(encoded_value) + + pieces.append(struct.pack('B', length)) + pieces.append(encoded_value) + return 1 + length + + +if PY2: + def decode_short_string(encoded, offset): + """Decode a short string value from ``encoded`` data at ``offset``. + """ + length = struct.unpack_from('B', encoded, offset)[0] + offset += 1 + # Purely for compatibility with original python2 code. No idea what + # and why this does. + value = encoded[offset:offset + length] + try: + value = bytes(value) + except UnicodeEncodeError: + pass + offset += length + return value, offset + +else: + def decode_short_string(encoded, offset): + """Decode a short string value from ``encoded`` data at ``offset``. + """ + length = struct.unpack_from('B', encoded, offset)[0] + offset += 1 + value = encoded[offset:offset + length] + try: + value = value.decode('utf8') + except UnicodeDecodeError: + pass + offset += length + return value, offset + + +def encode_table(pieces, table): + """Encode a dict as an AMQP table appending the encded table to the + pieces list passed in. + + :param list pieces: Already encoded frame pieces + :param dict table: The dict to encode + :rtype: int + + """ + table = table or {} + length_index = len(pieces) + pieces.append(None) # placeholder + tablesize = 0 + for (key, value) in table.items(): + tablesize += encode_short_string(pieces, key) + tablesize += encode_value(pieces, value) + + pieces[length_index] = struct.pack('>I', tablesize) + return tablesize + 4 + + +def encode_value(pieces, value): + """Encode the value passed in and append it to the pieces list returning + the the size of the encoded value. + + :param list pieces: Already encoded values + :param any value: The value to encode + :rtype: int + + """ + + if PY2: + if isinstance(value, basestring): + if isinstance(value, unicode_type): + value = value.encode('utf-8') + pieces.append(struct.pack('>cI', b'S', len(value))) + pieces.append(value) + return 5 + len(value) + else: + # support only str on Python 3 + if isinstance(value, str): + value = value.encode('utf-8') + pieces.append(struct.pack('>cI', b'S', len(value))) + pieces.append(value) + return 5 + len(value) + + if isinstance(value, bytes): + pieces.append(struct.pack('>cI', b'x', len(value))) + pieces.append(value) + return 5 + len(value) + + if isinstance(value, bool): + pieces.append(struct.pack('>cB', b't', int(value))) + return 2 + if isinstance(value, long): + pieces.append(struct.pack('>cq', b'l', value)) + return 9 + elif isinstance(value, int): + with warnings.catch_warnings(): + warnings.filterwarnings('error') + try: + p = struct.pack('>ci', b'I', value) + pieces.append(p) + return 5 + except (struct.error, DeprecationWarning): + p = struct.pack('>cq', b'l', long(value)) + pieces.append(p) + return 9 + elif isinstance(value, decimal.Decimal): + value = value.normalize() + if value.as_tuple().exponent < 0: + decimals = -value.as_tuple().exponent + raw = int(value * (decimal.Decimal(10) ** decimals)) + pieces.append(struct.pack('>cBi', b'D', decimals, raw)) + else: + # per spec, the "decimals" octet is unsigned (!) + pieces.append(struct.pack('>cBi', b'D', 0, int(value))) + return 6 + elif isinstance(value, datetime): + pieces.append(struct.pack('>cQ', b'T', + calendar.timegm(value.utctimetuple()))) + return 9 + elif isinstance(value, dict): + pieces.append(struct.pack('>c', b'F')) + return 1 + encode_table(pieces, value) + elif isinstance(value, list): + p = [] + for v in value: + encode_value(p, v) + piece = b''.join(p) + pieces.append(struct.pack('>cI', b'A', len(piece))) + pieces.append(piece) + return 5 + len(piece) + elif value is None: + pieces.append(struct.pack('>c', b'V')) + return 1 + else: + raise exceptions.UnsupportedAMQPFieldException(pieces, value) + + +def decode_table(encoded, offset): + """Decode the AMQP table passed in from the encoded value returning the + decoded result and the number of bytes read plus the offset. + + :param str encoded: The binary encoded data to decode + :param int offset: The starting byte offset + :rtype: tuple + + """ + result = {} + tablesize = struct.unpack_from('>I', encoded, offset)[0] + offset += 4 + limit = offset + tablesize + while offset < limit: + key, offset = decode_short_string(encoded, offset) + value, offset = decode_value(encoded, offset) + result[key] = value + return result, offset + + +def decode_value(encoded, offset): + """Decode the value passed in returning the decoded value and the number + of bytes read in addition to the starting offset. + + :param str encoded: The binary encoded data to decode + :param int offset: The starting byte offset + :rtype: tuple + :raises: pika.exceptions.InvalidFieldTypeException + + """ + # slice to get bytes in Python 3 and str in Python 2 + kind = encoded[offset:offset + 1] + offset += 1 + + # Bool + if kind == b't': + value = struct.unpack_from('>B', encoded, offset)[0] + value = bool(value) + offset += 1 + + # Short-Short Int + elif kind == b'b': + value = struct.unpack_from('>B', encoded, offset)[0] + offset += 1 + + # Short-Short Unsigned Int + elif kind == b'B': + value = struct.unpack_from('>b', encoded, offset)[0] + offset += 1 + + # Short Int + elif kind == b'U': + value = struct.unpack_from('>h', encoded, offset)[0] + offset += 2 + + # Short Unsigned Int + elif kind == b'u': + value = struct.unpack_from('>H', encoded, offset)[0] + offset += 2 + + # Long Int + elif kind == b'I': + value = struct.unpack_from('>i', encoded, offset)[0] + offset += 4 + + # Long Unsigned Int + elif kind == b'i': + value = struct.unpack_from('>I', encoded, offset)[0] + offset += 4 + + # Long-Long Int + elif kind == b'L': + value = long(struct.unpack_from('>q', encoded, offset)[0]) + offset += 8 + + # Long-Long Unsigned Int + elif kind == b'l': + value = long(struct.unpack_from('>Q', encoded, offset)[0]) + offset += 8 + + # Float + elif kind == b'f': + value = long(struct.unpack_from('>f', encoded, offset)[0]) + offset += 4 + + # Double + elif kind == b'd': + value = long(struct.unpack_from('>d', encoded, offset)[0]) + offset += 8 + + # Decimal + elif kind == b'D': + decimals = struct.unpack_from('B', encoded, offset)[0] + offset += 1 + raw = struct.unpack_from('>i', encoded, offset)[0] + offset += 4 + value = decimal.Decimal(raw) * (decimal.Decimal(10) ** -decimals) + + # Short String + elif kind == b's': + value, offset = decode_short_string(encoded, offset) + + # Long String + elif kind == b'S': + length = struct.unpack_from('>I', encoded, offset)[0] + offset += 4 + value = encoded[offset:offset + length] + try: + value = value.decode('utf8') + except UnicodeDecodeError: + pass + offset += length + + elif kind == b'x': + length = struct.unpack_from('>I', encoded, offset)[0] + offset += 4 + value = encoded[offset:offset + length] + offset += length + + # Field Array + elif kind == b'A': + length = struct.unpack_from('>I', encoded, offset)[0] + offset += 4 + offset_end = offset + length + value = [] + while offset < offset_end: + v, offset = decode_value(encoded, offset) + value.append(v) + + # Timestamp + elif kind == b'T': + value = datetime.utcfromtimestamp(struct.unpack_from('>Q', encoded, + offset)[0]) + offset += 8 + + # Field Table + elif kind == b'F': + (value, offset) = decode_table(encoded, offset) + + # Null / Void + elif kind == b'V': + value = None + else: + raise exceptions.InvalidFieldTypeException(kind) + + return value, offset diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/pika/exceptions.py b/NodeRed/NodeRedFiles/pika-0.13.1/pika/exceptions.py new file mode 100644 index 000000000..7daef48a4 --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/pika/exceptions.py @@ -0,0 +1,257 @@ +"""Pika specific exceptions""" + + +class AMQPError(Exception): + + def __repr__(self): + return 'An unspecified AMQP error has occurred' + + +class AMQPConnectionError(AMQPError): + + def __repr__(self): + if len(self.args) == 1: + if self.args[0] == 1: + return ('No connection could be opened after 1 ' + 'connection attempt') + elif isinstance(self.args[0], int): + return ('No connection could be opened after %s ' + 'connection attempts' % self.args[0]) + else: + return 'No connection could be opened: %s' % self.args[0] + elif len(self.args) == 2: + return '%s: %s' % (self.args[0], self.args[1]) + + +class IncompatibleProtocolError(AMQPConnectionError): + + def __repr__(self): + return ('The protocol returned by the server is not supported: %s' % + (self.args,)) + + +class AuthenticationError(AMQPConnectionError): + + def __repr__(self): + return ('Server and client could not negotiate use of the %s ' + 'authentication mechanism' % self.args[0]) + + +class ProbableAuthenticationError(AMQPConnectionError): + + def __repr__(self): + return ('Client was disconnected at a connection stage indicating a ' + 'probable authentication error: %s' % (self.args,)) + + +class ProbableAccessDeniedError(AMQPConnectionError): + + def __repr__(self): + return ('Client was disconnected at a connection stage indicating a ' + 'probable denial of access to the specified virtual host: %s' % + (self.args,)) + + +class NoFreeChannels(AMQPConnectionError): + + def __repr__(self): + return 'The connection has run out of free channels' + + +class ConnectionClosed(AMQPConnectionError): + + def __repr__(self): + if len(self.args) == 2: + return 'The AMQP connection was closed (%s) %s' % (self.args[0], + self.args[1]) + else: + return 'The AMQP connection was closed: %s' % (self.args,) + + +class AMQPChannelError(AMQPError): + + def __repr__(self): + return 'An unspecified AMQP channel error has occurred' + + +class ChannelClosed(AMQPChannelError): + + def __repr__(self): + if len(self.args) == 2: + return 'The channel was closed (%s) %s' % (self.args[0], + self.args[1]) + else: + return 'The channel was closed: %s' % (self.args,) + + +class ChannelAlreadyClosing(AMQPChannelError): + """Raised when `Channel.close` is called while channel is already closing""" + pass + + +class DuplicateConsumerTag(AMQPChannelError): + + def __repr__(self): + return ('The consumer tag specified already exists for this ' + 'channel: %s' % self.args[0]) + + +class ConsumerCancelled(AMQPChannelError): + + def __repr__(self): + return 'Server cancelled consumer' + + +class UnroutableError(AMQPChannelError): + """Exception containing one or more unroutable messages returned by broker + via Basic.Return. + + Used by BlockingChannel. + + In publisher-acknowledgements mode, this is raised upon receipt of Basic.Ack + from broker; in the event of Basic.Nack from broker, `NackError` is raised + instead + """ + + def __init__(self, messages): + """ + :param messages: sequence of returned unroutable messages + :type messages: sequence of `blocking_connection.ReturnedMessage` + objects + """ + super(UnroutableError, self).__init__( + "%s unroutable message(s) returned" % (len(messages))) + + self.messages = messages + + def __repr__(self): + return '%s: %i unroutable messages returned by broker' % ( + self.__class__.__name__, len(self.messages)) + + +class NackError(AMQPChannelError): + """This exception is raised when a message published in + publisher-acknowledgements mode is Nack'ed by the broker. + + Used by BlockingChannel. + """ + + def __init__(self, messages): + """ + :param messages: sequence of returned unroutable messages + :type messages: sequence of `blocking_connection.ReturnedMessage` + objects + """ + super(NackError, self).__init__( + "%s message(s) NACKed" % (len(messages))) + + self.messages = messages + + def __repr__(self): + return '%s: %i unroutable messages returned by broker' % ( + self.__class__.__name__, len(self.messages)) + + +class InvalidChannelNumber(AMQPError): + + def __repr__(self): + return 'An invalid channel number has been specified: %s' % self.args[0] + + +class ProtocolSyntaxError(AMQPError): + + def __repr__(self): + return 'An unspecified protocol syntax error occurred' + + +class UnexpectedFrameError(ProtocolSyntaxError): + + def __repr__(self): + return 'Received a frame out of sequence: %r' % self.args[0] + + +class ProtocolVersionMismatch(ProtocolSyntaxError): + + def __repr__(self): + return 'Protocol versions did not match: %r vs %r' % (self.args[0], + self.args[1]) + + +class BodyTooLongError(ProtocolSyntaxError): + + def __repr__(self): + return ('Received too many bytes for a message delivery: ' + 'Received %i, expected %i' % (self.args[0], self.args[1])) + + +class InvalidFrameError(ProtocolSyntaxError): + + def __repr__(self): + return 'Invalid frame received: %r' % self.args[0] + + +class InvalidFieldTypeException(ProtocolSyntaxError): + + def __repr__(self): + return 'Unsupported field kind %s' % self.args[0] + + +class UnsupportedAMQPFieldException(ProtocolSyntaxError): + + def __repr__(self): + return 'Unsupported field kind %s' % type(self.args[1]) + + +class UnspportedAMQPFieldException(UnsupportedAMQPFieldException): + """Deprecated version of UnsupportedAMQPFieldException""" + + +class MethodNotImplemented(AMQPError): + pass + + +class ChannelError(Exception): + + def __repr__(self): + return 'An unspecified error occurred with the Channel' + + +class InvalidMinimumFrameSize(ProtocolSyntaxError): + """ DEPRECATED; pika.connection.Parameters.frame_max property setter now + raises the standard `ValueError` exception when the value is out of bounds. + """ + + def __repr__(self): + return 'AMQP Minimum Frame Size is 4096 Bytes' + + +class InvalidMaximumFrameSize(ProtocolSyntaxError): + """ DEPRECATED; pika.connection.Parameters.frame_max property setter now + raises the standard `ValueError` exception when the value is out of bounds. + """ + + def __repr__(self): + return 'AMQP Maximum Frame Size is 131072 Bytes' + + +class RecursionError(Exception): + """The requested operation would result in unsupported recursion or + reentrancy. + + Used by BlockingConnection/BlockingChannel + + """ + + +class ShortStringTooLong(AMQPError): + + def __repr__(self): + return ('AMQP Short String can contain up to 255 bytes: ' + '%.300s' % self.args[0]) + + +class DuplicateGetOkCallback(ChannelError): + + def __repr__(self): + return ('basic_get can only be called again after the callback for the' + 'previous basic_get is executed') diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/pika/frame.py b/NodeRed/NodeRedFiles/pika-0.13.1/pika/frame.py new file mode 100644 index 000000000..9a07ec36a --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/pika/frame.py @@ -0,0 +1,265 @@ +"""Frame objects that do the frame demarshaling and marshaling.""" +import logging +import struct + +from pika import amqp_object +from pika import exceptions +from pika import spec +from pika.compat import byte + + +LOGGER = logging.getLogger(__name__) + + +class Frame(amqp_object.AMQPObject): + """Base Frame object mapping. Defines a behavior for all child classes for + assignment of core attributes and implementation of the a core _marshal + method which child classes use to create the binary AMQP frame. + + """ + NAME = 'Frame' + + def __init__(self, frame_type, channel_number): + """Create a new instance of a frame + + :param int frame_type: The frame type + :param int channel_number: The channel number for the frame + + """ + self.frame_type = frame_type + self.channel_number = channel_number + + def _marshal(self, pieces): + """Create the full AMQP wire protocol frame data representation + + :rtype: bytes + + """ + payload = b''.join(pieces) + return struct.pack('>BHI', self.frame_type, self.channel_number, + len(payload)) + payload + byte(spec.FRAME_END) + + def marshal(self): + """To be ended by child classes + + :raises NotImplementedError + + """ + raise NotImplementedError + + +class Method(Frame): + """Base Method frame object mapping. AMQP method frames are mapped on top + of this class for creating or accessing their data and attributes. + + """ + NAME = 'METHOD' + + def __init__(self, channel_number, method): + """Create a new instance of a frame + + :param int channel_number: The frame type + :param pika.Spec.Class.Method method: The AMQP Class.Method + + """ + Frame.__init__(self, spec.FRAME_METHOD, channel_number) + self.method = method + + def marshal(self): + """Return the AMQP binary encoded value of the frame + + :rtype: str + + """ + pieces = self.method.encode() + pieces.insert(0, struct.pack('>I', self.method.INDEX)) + return self._marshal(pieces) + + +class Header(Frame): + """Header frame object mapping. AMQP content header frames are mapped + on top of this class for creating or accessing their data and attributes. + + """ + NAME = 'Header' + + def __init__(self, channel_number, body_size, props): + """Create a new instance of a AMQP ContentHeader object + + :param int channel_number: The channel number for the frame + :param int body_size: The number of bytes for the body + :param pika.spec.BasicProperties props: Basic.Properties object + + """ + Frame.__init__(self, spec.FRAME_HEADER, channel_number) + self.body_size = body_size + self.properties = props + + def marshal(self): + """Return the AMQP binary encoded value of the frame + + :rtype: str + + """ + pieces = self.properties.encode() + pieces.insert(0, struct.pack('>HxxQ', self.properties.INDEX, + self.body_size)) + return self._marshal(pieces) + + +class Body(Frame): + """Body frame object mapping class. AMQP content body frames are mapped on + to this base class for getting/setting of attributes/data. + + """ + NAME = 'Body' + + def __init__(self, channel_number, fragment): + """ + Parameters: + + - channel_number: int + - fragment: unicode or str + """ + Frame.__init__(self, spec.FRAME_BODY, channel_number) + self.fragment = fragment + + def marshal(self): + """Return the AMQP binary encoded value of the frame + + :rtype: str + + """ + return self._marshal([self.fragment]) + + +class Heartbeat(Frame): + """Heartbeat frame object mapping class. AMQP Heartbeat frames are mapped + on to this class for a common access structure to the attributes/data + values. + + """ + NAME = 'Heartbeat' + + def __init__(self): + """Create a new instance of the Heartbeat frame""" + Frame.__init__(self, spec.FRAME_HEARTBEAT, 0) + + def marshal(self): + """Return the AMQP binary encoded value of the frame + + :rtype: str + + """ + return self._marshal(list()) + + +class ProtocolHeader(amqp_object.AMQPObject): + """AMQP Protocol header frame class which provides a pythonic interface + for creating AMQP Protocol headers + + """ + NAME = 'ProtocolHeader' + + def __init__(self, major=None, minor=None, revision=None): + """Construct a Protocol Header frame object for the specified AMQP + version + + :param int major: Major version number + :param int minor: Minor version number + :param int revision: Revision + + """ + self.frame_type = -1 + self.major = major or spec.PROTOCOL_VERSION[0] + self.minor = minor or spec.PROTOCOL_VERSION[1] + self.revision = revision or spec.PROTOCOL_VERSION[2] + + def marshal(self): + """Return the full AMQP wire protocol frame data representation of the + ProtocolHeader frame + + :rtype: str + + """ + return b'AMQP' + struct.pack('BBBB', 0, self.major, self.minor, + self.revision) + + +def decode_frame(data_in): + """Receives raw socket data and attempts to turn it into a frame. + Returns bytes used to make the frame and the frame + + :param str data_in: The raw data stream + :rtype: tuple(bytes consumed, frame) + :raises: pika.exceptions.InvalidFrameError + + """ + # Look to see if it's a protocol header frame + try: + if data_in[0:4] == b'AMQP': + major, minor, revision = struct.unpack_from('BBB', data_in, 5) + return 8, ProtocolHeader(major, minor, revision) + except (IndexError, struct.error): + return 0, None + + # Get the Frame Type, Channel Number and Frame Size + try: + (frame_type, channel_number, + frame_size) = struct.unpack('>BHL', data_in[0:7]) + except struct.error: + return 0, None + + # Get the frame data + frame_end = spec.FRAME_HEADER_SIZE + frame_size + spec.FRAME_END_SIZE + + # We don't have all of the frame yet + if frame_end > len(data_in): + return 0, None + + # The Frame termination chr is wrong + if data_in[frame_end - 1:frame_end] != byte(spec.FRAME_END): + raise exceptions.InvalidFrameError("Invalid FRAME_END marker") + + # Get the raw frame data + frame_data = data_in[spec.FRAME_HEADER_SIZE:frame_end - 1] + + if frame_type == spec.FRAME_METHOD: + + # Get the Method ID from the frame data + method_id = struct.unpack_from('>I', frame_data)[0] + + # Get a Method object for this method_id + method = spec.methods[method_id]() + + # Decode the content + method.decode(frame_data, 4) + + # Return the amount of data consumed and the Method object + return frame_end, Method(channel_number, method) + + elif frame_type == spec.FRAME_HEADER: + + # Return the header class and body size + class_id, weight, body_size = struct.unpack_from('>HHQ', frame_data) + + # Get the Properties type + properties = spec.props[class_id]() + + # Decode the properties + out = properties.decode(frame_data[12:]) + + # Return a Header frame + return frame_end, Header(channel_number, body_size, properties) + + elif frame_type == spec.FRAME_BODY: + + # Return the amount of data consumed and the Body frame w/ data + return frame_end, Body(channel_number, frame_data) + + elif frame_type == spec.FRAME_HEARTBEAT: + + # Return the amount of data and a Heartbeat frame + return frame_end, Heartbeat() + + raise exceptions.InvalidFrameError("Unknown frame type: %i" % frame_type) diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/pika/heartbeat.py b/NodeRed/NodeRedFiles/pika-0.13.1/pika/heartbeat.py new file mode 100644 index 000000000..cb9a1db05 --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/pika/heartbeat.py @@ -0,0 +1,214 @@ +"""Handle AMQP Heartbeats""" +import logging + +from pika import frame + +LOGGER = logging.getLogger(__name__) + + +class HeartbeatChecker(object): + """Sends heartbeats to the broker. The provided timeout is used to + determine if the connection is stale - no received heartbeats or + other activity will close the connection. See the parameter list for more + details. + + """ + _CONNECTION_FORCED = 320 + _STALE_CONNECTION = "No activity or too many missed heartbeats in the last %i seconds" + + def __init__(self, connection, timeout): + """Create an object that will check for activity on the provided + connection as well as receive heartbeat frames from the broker. The + timeout parameter defines a window within which this activity must + happen. If not, the connection is considered dead and closed. + + The value passed for timeout is also used to calculate an interval + at which a heartbeat frame is sent to the broker. The interval is + equal to the timeout value divided by two. + + :param pika.connection.Connection: Connection object + :param int timeout: Connection idle timeout. If no activity occurs on the + connection nor heartbeat frames received during the + timeout window the connection will be closed. The + interval used to send heartbeats is calculated from + this value by dividing it by two. + + """ + if timeout < 1: + raise ValueError('timeout must >= 0, but got %r' % (timeout,)) + + self._connection = connection + + # Note: see the following documents: + # https://www.rabbitmq.com/heartbeats.html#heartbeats-timeout + # https://github.com/pika/pika/pull/1072 + # https://groups.google.com/d/topic/rabbitmq-users/Fmfeqe5ocTY/discussion + # There is a certain amount of confusion around how client developers + # interpret the spec. The spec talks about 2 missed heartbeats as a + # *timeout*, plus that any activity on the connection counts for a + # heartbeat. This is to avoid edge cases and not to depend on network + # latency. + self._timeout = timeout + + self._send_interval = float(timeout) / 2 + + # Note: Pika will calculate the heartbeat / connectivity check interval + # by adding 5 seconds to the negotiated timeout to leave a bit of room + # for broker heartbeats that may be right at the edge of the timeout + # window. This is different behavior from the RabbitMQ Java client and + # the spec that suggests a check interval equivalent to two times the + # heartbeat timeout value. But, one advantage of adding a small amount + # is that bad connections will be detected faster. + # https://github.com/pika/pika/pull/1072#issuecomment-397850795 + # https://github.com/rabbitmq/rabbitmq-java-client/blob/b55bd20a1a236fc2d1ea9369b579770fa0237615/src/main/java/com/rabbitmq/client/impl/AMQConnection.java#L773-L780 + # https://github.com/ruby-amqp/bunny/blob/3259f3af2e659a49c38c2470aa565c8fb825213c/lib/bunny/session.rb#L1187-L1192 + self._check_interval = timeout + 5 + + LOGGER.debug('timeout: %f send_interval: %f check_interval: %f', + self._timeout, + self._send_interval, + self._check_interval) + + # Initialize counters + self._bytes_received = 0 + self._bytes_sent = 0 + self._heartbeat_frames_received = 0 + self._heartbeat_frames_sent = 0 + self._idle_byte_intervals = 0 + + self._send_timer = None + self._check_timer = None + self._start_send_timer() + self._start_check_timer() + + @property + def bytes_received_on_connection(self): + """Return the number of bytes received by the connection bytes object. + + :rtype int + + """ + return self._connection.bytes_received + + @property + def connection_is_idle(self): + """Returns true if the byte count hasn't changed in enough intervals + to trip the max idle threshold. + + """ + return self._idle_byte_intervals > 0 + + def received(self): + """Called when a heartbeat is received""" + LOGGER.debug('Received heartbeat frame') + self._heartbeat_frames_received += 1 + + def _send_heartbeat(self): + """Invoked by a timer to send a heartbeat when we need to. + + """ + LOGGER.debug('Sending heartbeat frame') + self._send_heartbeat_frame() + self._start_send_timer() + + def _check_heartbeat(self): + """Invoked by a timer to check for broker heartbeats. Checks to see + if we've missed any heartbeats and disconnect our connection if it's + been idle too long. + + """ + if self._has_received_data: + self._idle_byte_intervals = 0 + else: + # Connection has not received any data, increment the counter + self._idle_byte_intervals += 1 + + LOGGER.debug('Received %i heartbeat frames, sent %i, ' + 'idle intervals %i', + self._heartbeat_frames_received, + self._heartbeat_frames_sent, + self._idle_byte_intervals) + + if self.connection_is_idle: + self._close_connection() + return + + self._start_check_timer() + + def stop(self): + """Stop the heartbeat checker""" + if self._send_timer: + LOGGER.debug('Removing timer for next heartbeat send interval') + self._connection.remove_timeout(self._send_timer) # pylint: disable=W0212 + self._send_timer = None + if self._check_timer: + LOGGER.debug('Removing timer for next heartbeat check interval') + self._connection.remove_timeout(self._check_timer) # pylint: disable=W0212 + self._check_timer = None + + def _close_connection(self): + """Close the connection with the AMQP Connection-Forced value.""" + LOGGER.info('Connection is idle, %i stale byte intervals', + self._idle_byte_intervals) + text = HeartbeatChecker._STALE_CONNECTION % self._timeout + + # NOTE: this won't achieve the perceived effect of sending + # Connection.Close to broker, because the frame will only get buffered + # in memory before the next statement terminates the connection. + self._connection.close(HeartbeatChecker._CONNECTION_FORCED, text) + + self._connection._on_terminate(HeartbeatChecker._CONNECTION_FORCED, # pylint: disable=W0212 + text) + + @property + def _has_received_data(self): + """Returns True if the connection has received data. + + :rtype: bool + + """ + return self._bytes_received != self.bytes_received_on_connection + + @staticmethod + def _new_heartbeat_frame(): + """Return a new heartbeat frame. + + :rtype pika.frame.Heartbeat + + """ + return frame.Heartbeat() + + def _send_heartbeat_frame(self): + """Send a heartbeat frame on the connection. + + """ + LOGGER.debug('Sending heartbeat frame') + self._connection._send_frame( # pylint: disable=W0212 + self._new_heartbeat_frame()) + self._heartbeat_frames_sent += 1 + + def _start_send_timer(self): + """Start a new heartbeat send timer.""" + self._send_timer = self._connection.add_timeout( # pylint: disable=W0212 + self._send_interval, + self._send_heartbeat) + + def _start_check_timer(self): + """Start a new heartbeat check timer.""" + # Note: update counters now to get current values + # at the start of the timeout window. Values will be + # checked against the connection's byte count at the + # end of the window + self._update_counters() + + self._check_timer = self._connection.add_timeout( # pylint: disable=W0212 + self._check_interval, + self._check_heartbeat) + + def _update_counters(self): + """Update the internal counters for bytes sent and received and the + number of frames received + + """ + self._bytes_sent = self._connection.bytes_sent + self._bytes_received = self._connection.bytes_received diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/pika/spec.py b/NodeRed/NodeRedFiles/pika-0.13.1/pika/spec.py new file mode 100644 index 000000000..f1fe225dc --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/pika/spec.py @@ -0,0 +1,2319 @@ +""" +AMQP Specification +================== +This module implements the constants and classes that comprise AMQP protocol +level constructs. It should rarely be directly referenced outside of Pika's +own internal use. + +.. note:: Auto-generated code by codegen.py, do not edit directly. Pull +requests to this file without accompanying ``utils/codegen.py`` changes will be +rejected. + +""" + +import struct +from pika import amqp_object +from pika import data +from pika.compat import str_or_bytes, unicode_type + +# Python 3 support for str object +str = bytes + +PROTOCOL_VERSION = (0, 9, 1) +PORT = 5672 + +ACCESS_REFUSED = 403 +CHANNEL_ERROR = 504 +COMMAND_INVALID = 503 +CONNECTION_FORCED = 320 +CONTENT_TOO_LARGE = 311 +FRAME_BODY = 3 +FRAME_END = 206 +FRAME_END_SIZE = 1 +FRAME_ERROR = 501 +FRAME_HEADER = 2 +FRAME_HEADER_SIZE = 7 +FRAME_HEARTBEAT = 8 +FRAME_MAX_SIZE = 131072 +FRAME_METHOD = 1 +FRAME_MIN_SIZE = 4096 +INTERNAL_ERROR = 541 +INVALID_PATH = 402 +NOT_ALLOWED = 530 +NOT_FOUND = 404 +NOT_IMPLEMENTED = 540 +NO_CONSUMERS = 313 +NO_ROUTE = 312 +PERSISTENT_DELIVERY_MODE = 2 +PRECONDITION_FAILED = 406 +REPLY_SUCCESS = 200 +RESOURCE_ERROR = 506 +RESOURCE_LOCKED = 405 +SYNTAX_ERROR = 502 +TRANSIENT_DELIVERY_MODE = 1 +UNEXPECTED_FRAME = 505 + + +class Connection(amqp_object.Class): + + INDEX = 0x000A # 10 + NAME = 'Connection' + + class Start(amqp_object.Method): + + INDEX = 0x000A000A # 10, 10; 655370 + NAME = 'Connection.Start' + + def __init__(self, version_major=0, version_minor=9, server_properties=None, mechanisms='PLAIN', locales='en_US'): + self.version_major = version_major + self.version_minor = version_minor + self.server_properties = server_properties + self.mechanisms = mechanisms + self.locales = locales + + @property + def synchronous(self): + return True + + def decode(self, encoded, offset=0): + self.version_major = struct.unpack_from('B', encoded, offset)[0] + offset += 1 + self.version_minor = struct.unpack_from('B', encoded, offset)[0] + offset += 1 + (self.server_properties, offset) = data.decode_table(encoded, offset) + length = struct.unpack_from('>I', encoded, offset)[0] + offset += 4 + self.mechanisms = encoded[offset:offset + length] + try: + self.mechanisms = str(self.mechanisms) + except UnicodeEncodeError: + pass + offset += length + length = struct.unpack_from('>I', encoded, offset)[0] + offset += 4 + self.locales = encoded[offset:offset + length] + try: + self.locales = str(self.locales) + except UnicodeEncodeError: + pass + offset += length + return self + + def encode(self): + pieces = list() + pieces.append(struct.pack('B', self.version_major)) + pieces.append(struct.pack('B', self.version_minor)) + data.encode_table(pieces, self.server_properties) + assert isinstance(self.mechanisms, str_or_bytes),\ + 'A non-string value was supplied for self.mechanisms' + value = self.mechanisms.encode('utf-8') if isinstance(self.mechanisms, unicode_type) else self.mechanisms + pieces.append(struct.pack('>I', len(value))) + pieces.append(value) + assert isinstance(self.locales, str_or_bytes),\ + 'A non-string value was supplied for self.locales' + value = self.locales.encode('utf-8') if isinstance(self.locales, unicode_type) else self.locales + pieces.append(struct.pack('>I', len(value))) + pieces.append(value) + return pieces + + class StartOk(amqp_object.Method): + + INDEX = 0x000A000B # 10, 11; 655371 + NAME = 'Connection.StartOk' + + def __init__(self, client_properties=None, mechanism='PLAIN', response=None, locale='en_US'): + self.client_properties = client_properties + self.mechanism = mechanism + self.response = response + self.locale = locale + + @property + def synchronous(self): + return False + + def decode(self, encoded, offset=0): + (self.client_properties, offset) = data.decode_table(encoded, offset) + self.mechanism, offset = data.decode_short_string(encoded, offset) + length = struct.unpack_from('>I', encoded, offset)[0] + offset += 4 + self.response = encoded[offset:offset + length] + try: + self.response = str(self.response) + except UnicodeEncodeError: + pass + offset += length + self.locale, offset = data.decode_short_string(encoded, offset) + return self + + def encode(self): + pieces = list() + data.encode_table(pieces, self.client_properties) + assert isinstance(self.mechanism, str_or_bytes),\ + 'A non-string value was supplied for self.mechanism' + data.encode_short_string(pieces, self.mechanism) + assert isinstance(self.response, str_or_bytes),\ + 'A non-string value was supplied for self.response' + value = self.response.encode('utf-8') if isinstance(self.response, unicode_type) else self.response + pieces.append(struct.pack('>I', len(value))) + pieces.append(value) + assert isinstance(self.locale, str_or_bytes),\ + 'A non-string value was supplied for self.locale' + data.encode_short_string(pieces, self.locale) + return pieces + + class Secure(amqp_object.Method): + + INDEX = 0x000A0014 # 10, 20; 655380 + NAME = 'Connection.Secure' + + def __init__(self, challenge=None): + self.challenge = challenge + + @property + def synchronous(self): + return True + + def decode(self, encoded, offset=0): + length = struct.unpack_from('>I', encoded, offset)[0] + offset += 4 + self.challenge = encoded[offset:offset + length] + try: + self.challenge = str(self.challenge) + except UnicodeEncodeError: + pass + offset += length + return self + + def encode(self): + pieces = list() + assert isinstance(self.challenge, str_or_bytes),\ + 'A non-string value was supplied for self.challenge' + value = self.challenge.encode('utf-8') if isinstance(self.challenge, unicode_type) else self.challenge + pieces.append(struct.pack('>I', len(value))) + pieces.append(value) + return pieces + + class SecureOk(amqp_object.Method): + + INDEX = 0x000A0015 # 10, 21; 655381 + NAME = 'Connection.SecureOk' + + def __init__(self, response=None): + self.response = response + + @property + def synchronous(self): + return False + + def decode(self, encoded, offset=0): + length = struct.unpack_from('>I', encoded, offset)[0] + offset += 4 + self.response = encoded[offset:offset + length] + try: + self.response = str(self.response) + except UnicodeEncodeError: + pass + offset += length + return self + + def encode(self): + pieces = list() + assert isinstance(self.response, str_or_bytes),\ + 'A non-string value was supplied for self.response' + value = self.response.encode('utf-8') if isinstance(self.response, unicode_type) else self.response + pieces.append(struct.pack('>I', len(value))) + pieces.append(value) + return pieces + + class Tune(amqp_object.Method): + + INDEX = 0x000A001E # 10, 30; 655390 + NAME = 'Connection.Tune' + + def __init__(self, channel_max=0, frame_max=0, heartbeat=0): + self.channel_max = channel_max + self.frame_max = frame_max + self.heartbeat = heartbeat + + @property + def synchronous(self): + return True + + def decode(self, encoded, offset=0): + self.channel_max = struct.unpack_from('>H', encoded, offset)[0] + offset += 2 + self.frame_max = struct.unpack_from('>I', encoded, offset)[0] + offset += 4 + self.heartbeat = struct.unpack_from('>H', encoded, offset)[0] + offset += 2 + return self + + def encode(self): + pieces = list() + pieces.append(struct.pack('>H', self.channel_max)) + pieces.append(struct.pack('>I', self.frame_max)) + pieces.append(struct.pack('>H', self.heartbeat)) + return pieces + + class TuneOk(amqp_object.Method): + + INDEX = 0x000A001F # 10, 31; 655391 + NAME = 'Connection.TuneOk' + + def __init__(self, channel_max=0, frame_max=0, heartbeat=0): + self.channel_max = channel_max + self.frame_max = frame_max + self.heartbeat = heartbeat + + @property + def synchronous(self): + return False + + def decode(self, encoded, offset=0): + self.channel_max = struct.unpack_from('>H', encoded, offset)[0] + offset += 2 + self.frame_max = struct.unpack_from('>I', encoded, offset)[0] + offset += 4 + self.heartbeat = struct.unpack_from('>H', encoded, offset)[0] + offset += 2 + return self + + def encode(self): + pieces = list() + pieces.append(struct.pack('>H', self.channel_max)) + pieces.append(struct.pack('>I', self.frame_max)) + pieces.append(struct.pack('>H', self.heartbeat)) + return pieces + + class Open(amqp_object.Method): + + INDEX = 0x000A0028 # 10, 40; 655400 + NAME = 'Connection.Open' + + def __init__(self, virtual_host='/', capabilities='', insist=False): + self.virtual_host = virtual_host + self.capabilities = capabilities + self.insist = insist + + @property + def synchronous(self): + return True + + def decode(self, encoded, offset=0): + self.virtual_host, offset = data.decode_short_string(encoded, offset) + self.capabilities, offset = data.decode_short_string(encoded, offset) + bit_buffer = struct.unpack_from('B', encoded, offset)[0] + offset += 1 + self.insist = (bit_buffer & (1 << 0)) != 0 + return self + + def encode(self): + pieces = list() + assert isinstance(self.virtual_host, str_or_bytes),\ + 'A non-string value was supplied for self.virtual_host' + data.encode_short_string(pieces, self.virtual_host) + assert isinstance(self.capabilities, str_or_bytes),\ + 'A non-string value was supplied for self.capabilities' + data.encode_short_string(pieces, self.capabilities) + bit_buffer = 0 + if self.insist: + bit_buffer = bit_buffer | (1 << 0) + pieces.append(struct.pack('B', bit_buffer)) + return pieces + + class OpenOk(amqp_object.Method): + + INDEX = 0x000A0029 # 10, 41; 655401 + NAME = 'Connection.OpenOk' + + def __init__(self, known_hosts=''): + self.known_hosts = known_hosts + + @property + def synchronous(self): + return False + + def decode(self, encoded, offset=0): + self.known_hosts, offset = data.decode_short_string(encoded, offset) + return self + + def encode(self): + pieces = list() + assert isinstance(self.known_hosts, str_or_bytes),\ + 'A non-string value was supplied for self.known_hosts' + data.encode_short_string(pieces, self.known_hosts) + return pieces + + class Close(amqp_object.Method): + + INDEX = 0x000A0032 # 10, 50; 655410 + NAME = 'Connection.Close' + + def __init__(self, reply_code=None, reply_text='', class_id=None, method_id=None): + self.reply_code = reply_code + self.reply_text = reply_text + self.class_id = class_id + self.method_id = method_id + + @property + def synchronous(self): + return True + + def decode(self, encoded, offset=0): + self.reply_code = struct.unpack_from('>H', encoded, offset)[0] + offset += 2 + self.reply_text, offset = data.decode_short_string(encoded, offset) + self.class_id = struct.unpack_from('>H', encoded, offset)[0] + offset += 2 + self.method_id = struct.unpack_from('>H', encoded, offset)[0] + offset += 2 + return self + + def encode(self): + pieces = list() + pieces.append(struct.pack('>H', self.reply_code)) + assert isinstance(self.reply_text, str_or_bytes),\ + 'A non-string value was supplied for self.reply_text' + data.encode_short_string(pieces, self.reply_text) + pieces.append(struct.pack('>H', self.class_id)) + pieces.append(struct.pack('>H', self.method_id)) + return pieces + + class CloseOk(amqp_object.Method): + + INDEX = 0x000A0033 # 10, 51; 655411 + NAME = 'Connection.CloseOk' + + def __init__(self): + pass + + @property + def synchronous(self): + return False + + def decode(self, encoded, offset=0): + return self + + def encode(self): + pieces = list() + return pieces + + class Blocked(amqp_object.Method): + + INDEX = 0x000A003C # 10, 60; 655420 + NAME = 'Connection.Blocked' + + def __init__(self, reason=''): + self.reason = reason + + @property + def synchronous(self): + return False + + def decode(self, encoded, offset=0): + self.reason, offset = data.decode_short_string(encoded, offset) + return self + + def encode(self): + pieces = list() + assert isinstance(self.reason, str_or_bytes),\ + 'A non-string value was supplied for self.reason' + data.encode_short_string(pieces, self.reason) + return pieces + + class Unblocked(amqp_object.Method): + + INDEX = 0x000A003D # 10, 61; 655421 + NAME = 'Connection.Unblocked' + + def __init__(self): + pass + + @property + def synchronous(self): + return False + + def decode(self, encoded, offset=0): + return self + + def encode(self): + pieces = list() + return pieces + + +class Channel(amqp_object.Class): + + INDEX = 0x0014 # 20 + NAME = 'Channel' + + class Open(amqp_object.Method): + + INDEX = 0x0014000A # 20, 10; 1310730 + NAME = 'Channel.Open' + + def __init__(self, out_of_band=''): + self.out_of_band = out_of_band + + @property + def synchronous(self): + return True + + def decode(self, encoded, offset=0): + self.out_of_band, offset = data.decode_short_string(encoded, offset) + return self + + def encode(self): + pieces = list() + assert isinstance(self.out_of_band, str_or_bytes),\ + 'A non-string value was supplied for self.out_of_band' + data.encode_short_string(pieces, self.out_of_band) + return pieces + + class OpenOk(amqp_object.Method): + + INDEX = 0x0014000B # 20, 11; 1310731 + NAME = 'Channel.OpenOk' + + def __init__(self, channel_id=''): + self.channel_id = channel_id + + @property + def synchronous(self): + return False + + def decode(self, encoded, offset=0): + length = struct.unpack_from('>I', encoded, offset)[0] + offset += 4 + self.channel_id = encoded[offset:offset + length] + try: + self.channel_id = str(self.channel_id) + except UnicodeEncodeError: + pass + offset += length + return self + + def encode(self): + pieces = list() + assert isinstance(self.channel_id, str_or_bytes),\ + 'A non-string value was supplied for self.channel_id' + value = self.channel_id.encode('utf-8') if isinstance(self.channel_id, unicode_type) else self.channel_id + pieces.append(struct.pack('>I', len(value))) + pieces.append(value) + return pieces + + class Flow(amqp_object.Method): + + INDEX = 0x00140014 # 20, 20; 1310740 + NAME = 'Channel.Flow' + + def __init__(self, active=None): + self.active = active + + @property + def synchronous(self): + return True + + def decode(self, encoded, offset=0): + bit_buffer = struct.unpack_from('B', encoded, offset)[0] + offset += 1 + self.active = (bit_buffer & (1 << 0)) != 0 + return self + + def encode(self): + pieces = list() + bit_buffer = 0 + if self.active: + bit_buffer = bit_buffer | (1 << 0) + pieces.append(struct.pack('B', bit_buffer)) + return pieces + + class FlowOk(amqp_object.Method): + + INDEX = 0x00140015 # 20, 21; 1310741 + NAME = 'Channel.FlowOk' + + def __init__(self, active=None): + self.active = active + + @property + def synchronous(self): + return False + + def decode(self, encoded, offset=0): + bit_buffer = struct.unpack_from('B', encoded, offset)[0] + offset += 1 + self.active = (bit_buffer & (1 << 0)) != 0 + return self + + def encode(self): + pieces = list() + bit_buffer = 0 + if self.active: + bit_buffer = bit_buffer | (1 << 0) + pieces.append(struct.pack('B', bit_buffer)) + return pieces + + class Close(amqp_object.Method): + + INDEX = 0x00140028 # 20, 40; 1310760 + NAME = 'Channel.Close' + + def __init__(self, reply_code=None, reply_text='', class_id=None, method_id=None): + self.reply_code = reply_code + self.reply_text = reply_text + self.class_id = class_id + self.method_id = method_id + + @property + def synchronous(self): + return True + + def decode(self, encoded, offset=0): + self.reply_code = struct.unpack_from('>H', encoded, offset)[0] + offset += 2 + self.reply_text, offset = data.decode_short_string(encoded, offset) + self.class_id = struct.unpack_from('>H', encoded, offset)[0] + offset += 2 + self.method_id = struct.unpack_from('>H', encoded, offset)[0] + offset += 2 + return self + + def encode(self): + pieces = list() + pieces.append(struct.pack('>H', self.reply_code)) + assert isinstance(self.reply_text, str_or_bytes),\ + 'A non-string value was supplied for self.reply_text' + data.encode_short_string(pieces, self.reply_text) + pieces.append(struct.pack('>H', self.class_id)) + pieces.append(struct.pack('>H', self.method_id)) + return pieces + + class CloseOk(amqp_object.Method): + + INDEX = 0x00140029 # 20, 41; 1310761 + NAME = 'Channel.CloseOk' + + def __init__(self): + pass + + @property + def synchronous(self): + return False + + def decode(self, encoded, offset=0): + return self + + def encode(self): + pieces = list() + return pieces + + +class Access(amqp_object.Class): + + INDEX = 0x001E # 30 + NAME = 'Access' + + class Request(amqp_object.Method): + + INDEX = 0x001E000A # 30, 10; 1966090 + NAME = 'Access.Request' + + def __init__(self, realm='/data', exclusive=False, passive=True, active=True, write=True, read=True): + self.realm = realm + self.exclusive = exclusive + self.passive = passive + self.active = active + self.write = write + self.read = read + + @property + def synchronous(self): + return True + + def decode(self, encoded, offset=0): + self.realm, offset = data.decode_short_string(encoded, offset) + bit_buffer = struct.unpack_from('B', encoded, offset)[0] + offset += 1 + self.exclusive = (bit_buffer & (1 << 0)) != 0 + self.passive = (bit_buffer & (1 << 1)) != 0 + self.active = (bit_buffer & (1 << 2)) != 0 + self.write = (bit_buffer & (1 << 3)) != 0 + self.read = (bit_buffer & (1 << 4)) != 0 + return self + + def encode(self): + pieces = list() + assert isinstance(self.realm, str_or_bytes),\ + 'A non-string value was supplied for self.realm' + data.encode_short_string(pieces, self.realm) + bit_buffer = 0 + if self.exclusive: + bit_buffer = bit_buffer | (1 << 0) + if self.passive: + bit_buffer = bit_buffer | (1 << 1) + if self.active: + bit_buffer = bit_buffer | (1 << 2) + if self.write: + bit_buffer = bit_buffer | (1 << 3) + if self.read: + bit_buffer = bit_buffer | (1 << 4) + pieces.append(struct.pack('B', bit_buffer)) + return pieces + + class RequestOk(amqp_object.Method): + + INDEX = 0x001E000B # 30, 11; 1966091 + NAME = 'Access.RequestOk' + + def __init__(self, ticket=1): + self.ticket = ticket + + @property + def synchronous(self): + return False + + def decode(self, encoded, offset=0): + self.ticket = struct.unpack_from('>H', encoded, offset)[0] + offset += 2 + return self + + def encode(self): + pieces = list() + pieces.append(struct.pack('>H', self.ticket)) + return pieces + + +class Exchange(amqp_object.Class): + + INDEX = 0x0028 # 40 + NAME = 'Exchange' + + class Declare(amqp_object.Method): + + INDEX = 0x0028000A # 40, 10; 2621450 + NAME = 'Exchange.Declare' + + def __init__(self, ticket=0, exchange=None, type='direct', passive=False, durable=False, auto_delete=False, internal=False, nowait=False, arguments={}): + self.ticket = ticket + self.exchange = exchange + self.type = type + self.passive = passive + self.durable = durable + self.auto_delete = auto_delete + self.internal = internal + self.nowait = nowait + self.arguments = arguments + + @property + def synchronous(self): + return True + + def decode(self, encoded, offset=0): + self.ticket = struct.unpack_from('>H', encoded, offset)[0] + offset += 2 + self.exchange, offset = data.decode_short_string(encoded, offset) + self.type, offset = data.decode_short_string(encoded, offset) + bit_buffer = struct.unpack_from('B', encoded, offset)[0] + offset += 1 + self.passive = (bit_buffer & (1 << 0)) != 0 + self.durable = (bit_buffer & (1 << 1)) != 0 + self.auto_delete = (bit_buffer & (1 << 2)) != 0 + self.internal = (bit_buffer & (1 << 3)) != 0 + self.nowait = (bit_buffer & (1 << 4)) != 0 + (self.arguments, offset) = data.decode_table(encoded, offset) + return self + + def encode(self): + pieces = list() + pieces.append(struct.pack('>H', self.ticket)) + assert isinstance(self.exchange, str_or_bytes),\ + 'A non-string value was supplied for self.exchange' + data.encode_short_string(pieces, self.exchange) + assert isinstance(self.type, str_or_bytes),\ + 'A non-string value was supplied for self.type' + data.encode_short_string(pieces, self.type) + bit_buffer = 0 + if self.passive: + bit_buffer = bit_buffer | (1 << 0) + if self.durable: + bit_buffer = bit_buffer | (1 << 1) + if self.auto_delete: + bit_buffer = bit_buffer | (1 << 2) + if self.internal: + bit_buffer = bit_buffer | (1 << 3) + if self.nowait: + bit_buffer = bit_buffer | (1 << 4) + pieces.append(struct.pack('B', bit_buffer)) + data.encode_table(pieces, self.arguments) + return pieces + + class DeclareOk(amqp_object.Method): + + INDEX = 0x0028000B # 40, 11; 2621451 + NAME = 'Exchange.DeclareOk' + + def __init__(self): + pass + + @property + def synchronous(self): + return False + + def decode(self, encoded, offset=0): + return self + + def encode(self): + pieces = list() + return pieces + + class Delete(amqp_object.Method): + + INDEX = 0x00280014 # 40, 20; 2621460 + NAME = 'Exchange.Delete' + + def __init__(self, ticket=0, exchange=None, if_unused=False, nowait=False): + self.ticket = ticket + self.exchange = exchange + self.if_unused = if_unused + self.nowait = nowait + + @property + def synchronous(self): + return True + + def decode(self, encoded, offset=0): + self.ticket = struct.unpack_from('>H', encoded, offset)[0] + offset += 2 + self.exchange, offset = data.decode_short_string(encoded, offset) + bit_buffer = struct.unpack_from('B', encoded, offset)[0] + offset += 1 + self.if_unused = (bit_buffer & (1 << 0)) != 0 + self.nowait = (bit_buffer & (1 << 1)) != 0 + return self + + def encode(self): + pieces = list() + pieces.append(struct.pack('>H', self.ticket)) + assert isinstance(self.exchange, str_or_bytes),\ + 'A non-string value was supplied for self.exchange' + data.encode_short_string(pieces, self.exchange) + bit_buffer = 0 + if self.if_unused: + bit_buffer = bit_buffer | (1 << 0) + if self.nowait: + bit_buffer = bit_buffer | (1 << 1) + pieces.append(struct.pack('B', bit_buffer)) + return pieces + + class DeleteOk(amqp_object.Method): + + INDEX = 0x00280015 # 40, 21; 2621461 + NAME = 'Exchange.DeleteOk' + + def __init__(self): + pass + + @property + def synchronous(self): + return False + + def decode(self, encoded, offset=0): + return self + + def encode(self): + pieces = list() + return pieces + + class Bind(amqp_object.Method): + + INDEX = 0x0028001E # 40, 30; 2621470 + NAME = 'Exchange.Bind' + + def __init__(self, ticket=0, destination=None, source=None, routing_key='', nowait=False, arguments={}): + self.ticket = ticket + self.destination = destination + self.source = source + self.routing_key = routing_key + self.nowait = nowait + self.arguments = arguments + + @property + def synchronous(self): + return True + + def decode(self, encoded, offset=0): + self.ticket = struct.unpack_from('>H', encoded, offset)[0] + offset += 2 + self.destination, offset = data.decode_short_string(encoded, offset) + self.source, offset = data.decode_short_string(encoded, offset) + self.routing_key, offset = data.decode_short_string(encoded, offset) + bit_buffer = struct.unpack_from('B', encoded, offset)[0] + offset += 1 + self.nowait = (bit_buffer & (1 << 0)) != 0 + (self.arguments, offset) = data.decode_table(encoded, offset) + return self + + def encode(self): + pieces = list() + pieces.append(struct.pack('>H', self.ticket)) + assert isinstance(self.destination, str_or_bytes),\ + 'A non-string value was supplied for self.destination' + data.encode_short_string(pieces, self.destination) + assert isinstance(self.source, str_or_bytes),\ + 'A non-string value was supplied for self.source' + data.encode_short_string(pieces, self.source) + assert isinstance(self.routing_key, str_or_bytes),\ + 'A non-string value was supplied for self.routing_key' + data.encode_short_string(pieces, self.routing_key) + bit_buffer = 0 + if self.nowait: + bit_buffer = bit_buffer | (1 << 0) + pieces.append(struct.pack('B', bit_buffer)) + data.encode_table(pieces, self.arguments) + return pieces + + class BindOk(amqp_object.Method): + + INDEX = 0x0028001F # 40, 31; 2621471 + NAME = 'Exchange.BindOk' + + def __init__(self): + pass + + @property + def synchronous(self): + return False + + def decode(self, encoded, offset=0): + return self + + def encode(self): + pieces = list() + return pieces + + class Unbind(amqp_object.Method): + + INDEX = 0x00280028 # 40, 40; 2621480 + NAME = 'Exchange.Unbind' + + def __init__(self, ticket=0, destination=None, source=None, routing_key='', nowait=False, arguments={}): + self.ticket = ticket + self.destination = destination + self.source = source + self.routing_key = routing_key + self.nowait = nowait + self.arguments = arguments + + @property + def synchronous(self): + return True + + def decode(self, encoded, offset=0): + self.ticket = struct.unpack_from('>H', encoded, offset)[0] + offset += 2 + self.destination, offset = data.decode_short_string(encoded, offset) + self.source, offset = data.decode_short_string(encoded, offset) + self.routing_key, offset = data.decode_short_string(encoded, offset) + bit_buffer = struct.unpack_from('B', encoded, offset)[0] + offset += 1 + self.nowait = (bit_buffer & (1 << 0)) != 0 + (self.arguments, offset) = data.decode_table(encoded, offset) + return self + + def encode(self): + pieces = list() + pieces.append(struct.pack('>H', self.ticket)) + assert isinstance(self.destination, str_or_bytes),\ + 'A non-string value was supplied for self.destination' + data.encode_short_string(pieces, self.destination) + assert isinstance(self.source, str_or_bytes),\ + 'A non-string value was supplied for self.source' + data.encode_short_string(pieces, self.source) + assert isinstance(self.routing_key, str_or_bytes),\ + 'A non-string value was supplied for self.routing_key' + data.encode_short_string(pieces, self.routing_key) + bit_buffer = 0 + if self.nowait: + bit_buffer = bit_buffer | (1 << 0) + pieces.append(struct.pack('B', bit_buffer)) + data.encode_table(pieces, self.arguments) + return pieces + + class UnbindOk(amqp_object.Method): + + INDEX = 0x00280033 # 40, 51; 2621491 + NAME = 'Exchange.UnbindOk' + + def __init__(self): + pass + + @property + def synchronous(self): + return False + + def decode(self, encoded, offset=0): + return self + + def encode(self): + pieces = list() + return pieces + + +class Queue(amqp_object.Class): + + INDEX = 0x0032 # 50 + NAME = 'Queue' + + class Declare(amqp_object.Method): + + INDEX = 0x0032000A # 50, 10; 3276810 + NAME = 'Queue.Declare' + + def __init__(self, ticket=0, queue='', passive=False, durable=False, exclusive=False, auto_delete=False, nowait=False, arguments={}): + self.ticket = ticket + self.queue = queue + self.passive = passive + self.durable = durable + self.exclusive = exclusive + self.auto_delete = auto_delete + self.nowait = nowait + self.arguments = arguments + + @property + def synchronous(self): + return True + + def decode(self, encoded, offset=0): + self.ticket = struct.unpack_from('>H', encoded, offset)[0] + offset += 2 + self.queue, offset = data.decode_short_string(encoded, offset) + bit_buffer = struct.unpack_from('B', encoded, offset)[0] + offset += 1 + self.passive = (bit_buffer & (1 << 0)) != 0 + self.durable = (bit_buffer & (1 << 1)) != 0 + self.exclusive = (bit_buffer & (1 << 2)) != 0 + self.auto_delete = (bit_buffer & (1 << 3)) != 0 + self.nowait = (bit_buffer & (1 << 4)) != 0 + (self.arguments, offset) = data.decode_table(encoded, offset) + return self + + def encode(self): + pieces = list() + pieces.append(struct.pack('>H', self.ticket)) + assert isinstance(self.queue, str_or_bytes),\ + 'A non-string value was supplied for self.queue' + data.encode_short_string(pieces, self.queue) + bit_buffer = 0 + if self.passive: + bit_buffer = bit_buffer | (1 << 0) + if self.durable: + bit_buffer = bit_buffer | (1 << 1) + if self.exclusive: + bit_buffer = bit_buffer | (1 << 2) + if self.auto_delete: + bit_buffer = bit_buffer | (1 << 3) + if self.nowait: + bit_buffer = bit_buffer | (1 << 4) + pieces.append(struct.pack('B', bit_buffer)) + data.encode_table(pieces, self.arguments) + return pieces + + class DeclareOk(amqp_object.Method): + + INDEX = 0x0032000B # 50, 11; 3276811 + NAME = 'Queue.DeclareOk' + + def __init__(self, queue=None, message_count=None, consumer_count=None): + self.queue = queue + self.message_count = message_count + self.consumer_count = consumer_count + + @property + def synchronous(self): + return False + + def decode(self, encoded, offset=0): + self.queue, offset = data.decode_short_string(encoded, offset) + self.message_count = struct.unpack_from('>I', encoded, offset)[0] + offset += 4 + self.consumer_count = struct.unpack_from('>I', encoded, offset)[0] + offset += 4 + return self + + def encode(self): + pieces = list() + assert isinstance(self.queue, str_or_bytes),\ + 'A non-string value was supplied for self.queue' + data.encode_short_string(pieces, self.queue) + pieces.append(struct.pack('>I', self.message_count)) + pieces.append(struct.pack('>I', self.consumer_count)) + return pieces + + class Bind(amqp_object.Method): + + INDEX = 0x00320014 # 50, 20; 3276820 + NAME = 'Queue.Bind' + + def __init__(self, ticket=0, queue='', exchange=None, routing_key='', nowait=False, arguments={}): + self.ticket = ticket + self.queue = queue + self.exchange = exchange + self.routing_key = routing_key + self.nowait = nowait + self.arguments = arguments + + @property + def synchronous(self): + return True + + def decode(self, encoded, offset=0): + self.ticket = struct.unpack_from('>H', encoded, offset)[0] + offset += 2 + self.queue, offset = data.decode_short_string(encoded, offset) + self.exchange, offset = data.decode_short_string(encoded, offset) + self.routing_key, offset = data.decode_short_string(encoded, offset) + bit_buffer = struct.unpack_from('B', encoded, offset)[0] + offset += 1 + self.nowait = (bit_buffer & (1 << 0)) != 0 + (self.arguments, offset) = data.decode_table(encoded, offset) + return self + + def encode(self): + pieces = list() + pieces.append(struct.pack('>H', self.ticket)) + assert isinstance(self.queue, str_or_bytes),\ + 'A non-string value was supplied for self.queue' + data.encode_short_string(pieces, self.queue) + assert isinstance(self.exchange, str_or_bytes),\ + 'A non-string value was supplied for self.exchange' + data.encode_short_string(pieces, self.exchange) + assert isinstance(self.routing_key, str_or_bytes),\ + 'A non-string value was supplied for self.routing_key' + data.encode_short_string(pieces, self.routing_key) + bit_buffer = 0 + if self.nowait: + bit_buffer = bit_buffer | (1 << 0) + pieces.append(struct.pack('B', bit_buffer)) + data.encode_table(pieces, self.arguments) + return pieces + + class BindOk(amqp_object.Method): + + INDEX = 0x00320015 # 50, 21; 3276821 + NAME = 'Queue.BindOk' + + def __init__(self): + pass + + @property + def synchronous(self): + return False + + def decode(self, encoded, offset=0): + return self + + def encode(self): + pieces = list() + return pieces + + class Purge(amqp_object.Method): + + INDEX = 0x0032001E # 50, 30; 3276830 + NAME = 'Queue.Purge' + + def __init__(self, ticket=0, queue='', nowait=False): + self.ticket = ticket + self.queue = queue + self.nowait = nowait + + @property + def synchronous(self): + return True + + def decode(self, encoded, offset=0): + self.ticket = struct.unpack_from('>H', encoded, offset)[0] + offset += 2 + self.queue, offset = data.decode_short_string(encoded, offset) + bit_buffer = struct.unpack_from('B', encoded, offset)[0] + offset += 1 + self.nowait = (bit_buffer & (1 << 0)) != 0 + return self + + def encode(self): + pieces = list() + pieces.append(struct.pack('>H', self.ticket)) + assert isinstance(self.queue, str_or_bytes),\ + 'A non-string value was supplied for self.queue' + data.encode_short_string(pieces, self.queue) + bit_buffer = 0 + if self.nowait: + bit_buffer = bit_buffer | (1 << 0) + pieces.append(struct.pack('B', bit_buffer)) + return pieces + + class PurgeOk(amqp_object.Method): + + INDEX = 0x0032001F # 50, 31; 3276831 + NAME = 'Queue.PurgeOk' + + def __init__(self, message_count=None): + self.message_count = message_count + + @property + def synchronous(self): + return False + + def decode(self, encoded, offset=0): + self.message_count = struct.unpack_from('>I', encoded, offset)[0] + offset += 4 + return self + + def encode(self): + pieces = list() + pieces.append(struct.pack('>I', self.message_count)) + return pieces + + class Delete(amqp_object.Method): + + INDEX = 0x00320028 # 50, 40; 3276840 + NAME = 'Queue.Delete' + + def __init__(self, ticket=0, queue='', if_unused=False, if_empty=False, nowait=False): + self.ticket = ticket + self.queue = queue + self.if_unused = if_unused + self.if_empty = if_empty + self.nowait = nowait + + @property + def synchronous(self): + return True + + def decode(self, encoded, offset=0): + self.ticket = struct.unpack_from('>H', encoded, offset)[0] + offset += 2 + self.queue, offset = data.decode_short_string(encoded, offset) + bit_buffer = struct.unpack_from('B', encoded, offset)[0] + offset += 1 + self.if_unused = (bit_buffer & (1 << 0)) != 0 + self.if_empty = (bit_buffer & (1 << 1)) != 0 + self.nowait = (bit_buffer & (1 << 2)) != 0 + return self + + def encode(self): + pieces = list() + pieces.append(struct.pack('>H', self.ticket)) + assert isinstance(self.queue, str_or_bytes),\ + 'A non-string value was supplied for self.queue' + data.encode_short_string(pieces, self.queue) + bit_buffer = 0 + if self.if_unused: + bit_buffer = bit_buffer | (1 << 0) + if self.if_empty: + bit_buffer = bit_buffer | (1 << 1) + if self.nowait: + bit_buffer = bit_buffer | (1 << 2) + pieces.append(struct.pack('B', bit_buffer)) + return pieces + + class DeleteOk(amqp_object.Method): + + INDEX = 0x00320029 # 50, 41; 3276841 + NAME = 'Queue.DeleteOk' + + def __init__(self, message_count=None): + self.message_count = message_count + + @property + def synchronous(self): + return False + + def decode(self, encoded, offset=0): + self.message_count = struct.unpack_from('>I', encoded, offset)[0] + offset += 4 + return self + + def encode(self): + pieces = list() + pieces.append(struct.pack('>I', self.message_count)) + return pieces + + class Unbind(amqp_object.Method): + + INDEX = 0x00320032 # 50, 50; 3276850 + NAME = 'Queue.Unbind' + + def __init__(self, ticket=0, queue='', exchange=None, routing_key='', arguments={}): + self.ticket = ticket + self.queue = queue + self.exchange = exchange + self.routing_key = routing_key + self.arguments = arguments + + @property + def synchronous(self): + return True + + def decode(self, encoded, offset=0): + self.ticket = struct.unpack_from('>H', encoded, offset)[0] + offset += 2 + self.queue, offset = data.decode_short_string(encoded, offset) + self.exchange, offset = data.decode_short_string(encoded, offset) + self.routing_key, offset = data.decode_short_string(encoded, offset) + (self.arguments, offset) = data.decode_table(encoded, offset) + return self + + def encode(self): + pieces = list() + pieces.append(struct.pack('>H', self.ticket)) + assert isinstance(self.queue, str_or_bytes),\ + 'A non-string value was supplied for self.queue' + data.encode_short_string(pieces, self.queue) + assert isinstance(self.exchange, str_or_bytes),\ + 'A non-string value was supplied for self.exchange' + data.encode_short_string(pieces, self.exchange) + assert isinstance(self.routing_key, str_or_bytes),\ + 'A non-string value was supplied for self.routing_key' + data.encode_short_string(pieces, self.routing_key) + data.encode_table(pieces, self.arguments) + return pieces + + class UnbindOk(amqp_object.Method): + + INDEX = 0x00320033 # 50, 51; 3276851 + NAME = 'Queue.UnbindOk' + + def __init__(self): + pass + + @property + def synchronous(self): + return False + + def decode(self, encoded, offset=0): + return self + + def encode(self): + pieces = list() + return pieces + + +class Basic(amqp_object.Class): + + INDEX = 0x003C # 60 + NAME = 'Basic' + + class Qos(amqp_object.Method): + + INDEX = 0x003C000A # 60, 10; 3932170 + NAME = 'Basic.Qos' + + def __init__(self, prefetch_size=0, prefetch_count=0, global_=False): + self.prefetch_size = prefetch_size + self.prefetch_count = prefetch_count + self.global_ = global_ + + @property + def synchronous(self): + return True + + def decode(self, encoded, offset=0): + self.prefetch_size = struct.unpack_from('>I', encoded, offset)[0] + offset += 4 + self.prefetch_count = struct.unpack_from('>H', encoded, offset)[0] + offset += 2 + bit_buffer = struct.unpack_from('B', encoded, offset)[0] + offset += 1 + self.global_ = (bit_buffer & (1 << 0)) != 0 + return self + + def encode(self): + pieces = list() + pieces.append(struct.pack('>I', self.prefetch_size)) + pieces.append(struct.pack('>H', self.prefetch_count)) + bit_buffer = 0 + if self.global_: + bit_buffer = bit_buffer | (1 << 0) + pieces.append(struct.pack('B', bit_buffer)) + return pieces + + class QosOk(amqp_object.Method): + + INDEX = 0x003C000B # 60, 11; 3932171 + NAME = 'Basic.QosOk' + + def __init__(self): + pass + + @property + def synchronous(self): + return False + + def decode(self, encoded, offset=0): + return self + + def encode(self): + pieces = list() + return pieces + + class Consume(amqp_object.Method): + + INDEX = 0x003C0014 # 60, 20; 3932180 + NAME = 'Basic.Consume' + + def __init__(self, ticket=0, queue='', consumer_tag='', no_local=False, no_ack=False, exclusive=False, nowait=False, arguments={}): + self.ticket = ticket + self.queue = queue + self.consumer_tag = consumer_tag + self.no_local = no_local + self.no_ack = no_ack + self.exclusive = exclusive + self.nowait = nowait + self.arguments = arguments + + @property + def synchronous(self): + return True + + def decode(self, encoded, offset=0): + self.ticket = struct.unpack_from('>H', encoded, offset)[0] + offset += 2 + self.queue, offset = data.decode_short_string(encoded, offset) + self.consumer_tag, offset = data.decode_short_string(encoded, offset) + bit_buffer = struct.unpack_from('B', encoded, offset)[0] + offset += 1 + self.no_local = (bit_buffer & (1 << 0)) != 0 + self.no_ack = (bit_buffer & (1 << 1)) != 0 + self.exclusive = (bit_buffer & (1 << 2)) != 0 + self.nowait = (bit_buffer & (1 << 3)) != 0 + (self.arguments, offset) = data.decode_table(encoded, offset) + return self + + def encode(self): + pieces = list() + pieces.append(struct.pack('>H', self.ticket)) + assert isinstance(self.queue, str_or_bytes),\ + 'A non-string value was supplied for self.queue' + data.encode_short_string(pieces, self.queue) + assert isinstance(self.consumer_tag, str_or_bytes),\ + 'A non-string value was supplied for self.consumer_tag' + data.encode_short_string(pieces, self.consumer_tag) + bit_buffer = 0 + if self.no_local: + bit_buffer = bit_buffer | (1 << 0) + if self.no_ack: + bit_buffer = bit_buffer | (1 << 1) + if self.exclusive: + bit_buffer = bit_buffer | (1 << 2) + if self.nowait: + bit_buffer = bit_buffer | (1 << 3) + pieces.append(struct.pack('B', bit_buffer)) + data.encode_table(pieces, self.arguments) + return pieces + + class ConsumeOk(amqp_object.Method): + + INDEX = 0x003C0015 # 60, 21; 3932181 + NAME = 'Basic.ConsumeOk' + + def __init__(self, consumer_tag=None): + self.consumer_tag = consumer_tag + + @property + def synchronous(self): + return False + + def decode(self, encoded, offset=0): + self.consumer_tag, offset = data.decode_short_string(encoded, offset) + return self + + def encode(self): + pieces = list() + assert isinstance(self.consumer_tag, str_or_bytes),\ + 'A non-string value was supplied for self.consumer_tag' + data.encode_short_string(pieces, self.consumer_tag) + return pieces + + class Cancel(amqp_object.Method): + + INDEX = 0x003C001E # 60, 30; 3932190 + NAME = 'Basic.Cancel' + + def __init__(self, consumer_tag=None, nowait=False): + self.consumer_tag = consumer_tag + self.nowait = nowait + + @property + def synchronous(self): + return True + + def decode(self, encoded, offset=0): + self.consumer_tag, offset = data.decode_short_string(encoded, offset) + bit_buffer = struct.unpack_from('B', encoded, offset)[0] + offset += 1 + self.nowait = (bit_buffer & (1 << 0)) != 0 + return self + + def encode(self): + pieces = list() + assert isinstance(self.consumer_tag, str_or_bytes),\ + 'A non-string value was supplied for self.consumer_tag' + data.encode_short_string(pieces, self.consumer_tag) + bit_buffer = 0 + if self.nowait: + bit_buffer = bit_buffer | (1 << 0) + pieces.append(struct.pack('B', bit_buffer)) + return pieces + + class CancelOk(amqp_object.Method): + + INDEX = 0x003C001F # 60, 31; 3932191 + NAME = 'Basic.CancelOk' + + def __init__(self, consumer_tag=None): + self.consumer_tag = consumer_tag + + @property + def synchronous(self): + return False + + def decode(self, encoded, offset=0): + self.consumer_tag, offset = data.decode_short_string(encoded, offset) + return self + + def encode(self): + pieces = list() + assert isinstance(self.consumer_tag, str_or_bytes),\ + 'A non-string value was supplied for self.consumer_tag' + data.encode_short_string(pieces, self.consumer_tag) + return pieces + + class Publish(amqp_object.Method): + + INDEX = 0x003C0028 # 60, 40; 3932200 + NAME = 'Basic.Publish' + + def __init__(self, ticket=0, exchange='', routing_key='', mandatory=False, immediate=False): + self.ticket = ticket + self.exchange = exchange + self.routing_key = routing_key + self.mandatory = mandatory + self.immediate = immediate + + @property + def synchronous(self): + return False + + def decode(self, encoded, offset=0): + self.ticket = struct.unpack_from('>H', encoded, offset)[0] + offset += 2 + self.exchange, offset = data.decode_short_string(encoded, offset) + self.routing_key, offset = data.decode_short_string(encoded, offset) + bit_buffer = struct.unpack_from('B', encoded, offset)[0] + offset += 1 + self.mandatory = (bit_buffer & (1 << 0)) != 0 + self.immediate = (bit_buffer & (1 << 1)) != 0 + return self + + def encode(self): + pieces = list() + pieces.append(struct.pack('>H', self.ticket)) + assert isinstance(self.exchange, str_or_bytes),\ + 'A non-string value was supplied for self.exchange' + data.encode_short_string(pieces, self.exchange) + assert isinstance(self.routing_key, str_or_bytes),\ + 'A non-string value was supplied for self.routing_key' + data.encode_short_string(pieces, self.routing_key) + bit_buffer = 0 + if self.mandatory: + bit_buffer = bit_buffer | (1 << 0) + if self.immediate: + bit_buffer = bit_buffer | (1 << 1) + pieces.append(struct.pack('B', bit_buffer)) + return pieces + + class Return(amqp_object.Method): + + INDEX = 0x003C0032 # 60, 50; 3932210 + NAME = 'Basic.Return' + + def __init__(self, reply_code=None, reply_text='', exchange=None, routing_key=None): + self.reply_code = reply_code + self.reply_text = reply_text + self.exchange = exchange + self.routing_key = routing_key + + @property + def synchronous(self): + return False + + def decode(self, encoded, offset=0): + self.reply_code = struct.unpack_from('>H', encoded, offset)[0] + offset += 2 + self.reply_text, offset = data.decode_short_string(encoded, offset) + self.exchange, offset = data.decode_short_string(encoded, offset) + self.routing_key, offset = data.decode_short_string(encoded, offset) + return self + + def encode(self): + pieces = list() + pieces.append(struct.pack('>H', self.reply_code)) + assert isinstance(self.reply_text, str_or_bytes),\ + 'A non-string value was supplied for self.reply_text' + data.encode_short_string(pieces, self.reply_text) + assert isinstance(self.exchange, str_or_bytes),\ + 'A non-string value was supplied for self.exchange' + data.encode_short_string(pieces, self.exchange) + assert isinstance(self.routing_key, str_or_bytes),\ + 'A non-string value was supplied for self.routing_key' + data.encode_short_string(pieces, self.routing_key) + return pieces + + class Deliver(amqp_object.Method): + + INDEX = 0x003C003C # 60, 60; 3932220 + NAME = 'Basic.Deliver' + + def __init__(self, consumer_tag=None, delivery_tag=None, redelivered=False, exchange=None, routing_key=None): + self.consumer_tag = consumer_tag + self.delivery_tag = delivery_tag + self.redelivered = redelivered + self.exchange = exchange + self.routing_key = routing_key + + @property + def synchronous(self): + return False + + def decode(self, encoded, offset=0): + self.consumer_tag, offset = data.decode_short_string(encoded, offset) + self.delivery_tag = struct.unpack_from('>Q', encoded, offset)[0] + offset += 8 + bit_buffer = struct.unpack_from('B', encoded, offset)[0] + offset += 1 + self.redelivered = (bit_buffer & (1 << 0)) != 0 + self.exchange, offset = data.decode_short_string(encoded, offset) + self.routing_key, offset = data.decode_short_string(encoded, offset) + return self + + def encode(self): + pieces = list() + assert isinstance(self.consumer_tag, str_or_bytes),\ + 'A non-string value was supplied for self.consumer_tag' + data.encode_short_string(pieces, self.consumer_tag) + pieces.append(struct.pack('>Q', self.delivery_tag)) + bit_buffer = 0 + if self.redelivered: + bit_buffer = bit_buffer | (1 << 0) + pieces.append(struct.pack('B', bit_buffer)) + assert isinstance(self.exchange, str_or_bytes),\ + 'A non-string value was supplied for self.exchange' + data.encode_short_string(pieces, self.exchange) + assert isinstance(self.routing_key, str_or_bytes),\ + 'A non-string value was supplied for self.routing_key' + data.encode_short_string(pieces, self.routing_key) + return pieces + + class Get(amqp_object.Method): + + INDEX = 0x003C0046 # 60, 70; 3932230 + NAME = 'Basic.Get' + + def __init__(self, ticket=0, queue='', no_ack=False): + self.ticket = ticket + self.queue = queue + self.no_ack = no_ack + + @property + def synchronous(self): + return True + + def decode(self, encoded, offset=0): + self.ticket = struct.unpack_from('>H', encoded, offset)[0] + offset += 2 + self.queue, offset = data.decode_short_string(encoded, offset) + bit_buffer = struct.unpack_from('B', encoded, offset)[0] + offset += 1 + self.no_ack = (bit_buffer & (1 << 0)) != 0 + return self + + def encode(self): + pieces = list() + pieces.append(struct.pack('>H', self.ticket)) + assert isinstance(self.queue, str_or_bytes),\ + 'A non-string value was supplied for self.queue' + data.encode_short_string(pieces, self.queue) + bit_buffer = 0 + if self.no_ack: + bit_buffer = bit_buffer | (1 << 0) + pieces.append(struct.pack('B', bit_buffer)) + return pieces + + class GetOk(amqp_object.Method): + + INDEX = 0x003C0047 # 60, 71; 3932231 + NAME = 'Basic.GetOk' + + def __init__(self, delivery_tag=None, redelivered=False, exchange=None, routing_key=None, message_count=None): + self.delivery_tag = delivery_tag + self.redelivered = redelivered + self.exchange = exchange + self.routing_key = routing_key + self.message_count = message_count + + @property + def synchronous(self): + return False + + def decode(self, encoded, offset=0): + self.delivery_tag = struct.unpack_from('>Q', encoded, offset)[0] + offset += 8 + bit_buffer = struct.unpack_from('B', encoded, offset)[0] + offset += 1 + self.redelivered = (bit_buffer & (1 << 0)) != 0 + self.exchange, offset = data.decode_short_string(encoded, offset) + self.routing_key, offset = data.decode_short_string(encoded, offset) + self.message_count = struct.unpack_from('>I', encoded, offset)[0] + offset += 4 + return self + + def encode(self): + pieces = list() + pieces.append(struct.pack('>Q', self.delivery_tag)) + bit_buffer = 0 + if self.redelivered: + bit_buffer = bit_buffer | (1 << 0) + pieces.append(struct.pack('B', bit_buffer)) + assert isinstance(self.exchange, str_or_bytes),\ + 'A non-string value was supplied for self.exchange' + data.encode_short_string(pieces, self.exchange) + assert isinstance(self.routing_key, str_or_bytes),\ + 'A non-string value was supplied for self.routing_key' + data.encode_short_string(pieces, self.routing_key) + pieces.append(struct.pack('>I', self.message_count)) + return pieces + + class GetEmpty(amqp_object.Method): + + INDEX = 0x003C0048 # 60, 72; 3932232 + NAME = 'Basic.GetEmpty' + + def __init__(self, cluster_id=''): + self.cluster_id = cluster_id + + @property + def synchronous(self): + return False + + def decode(self, encoded, offset=0): + self.cluster_id, offset = data.decode_short_string(encoded, offset) + return self + + def encode(self): + pieces = list() + assert isinstance(self.cluster_id, str_or_bytes),\ + 'A non-string value was supplied for self.cluster_id' + data.encode_short_string(pieces, self.cluster_id) + return pieces + + class Ack(amqp_object.Method): + + INDEX = 0x003C0050 # 60, 80; 3932240 + NAME = 'Basic.Ack' + + def __init__(self, delivery_tag=0, multiple=False): + self.delivery_tag = delivery_tag + self.multiple = multiple + + @property + def synchronous(self): + return False + + def decode(self, encoded, offset=0): + self.delivery_tag = struct.unpack_from('>Q', encoded, offset)[0] + offset += 8 + bit_buffer = struct.unpack_from('B', encoded, offset)[0] + offset += 1 + self.multiple = (bit_buffer & (1 << 0)) != 0 + return self + + def encode(self): + pieces = list() + pieces.append(struct.pack('>Q', self.delivery_tag)) + bit_buffer = 0 + if self.multiple: + bit_buffer = bit_buffer | (1 << 0) + pieces.append(struct.pack('B', bit_buffer)) + return pieces + + class Reject(amqp_object.Method): + + INDEX = 0x003C005A # 60, 90; 3932250 + NAME = 'Basic.Reject' + + def __init__(self, delivery_tag=None, requeue=True): + self.delivery_tag = delivery_tag + self.requeue = requeue + + @property + def synchronous(self): + return False + + def decode(self, encoded, offset=0): + self.delivery_tag = struct.unpack_from('>Q', encoded, offset)[0] + offset += 8 + bit_buffer = struct.unpack_from('B', encoded, offset)[0] + offset += 1 + self.requeue = (bit_buffer & (1 << 0)) != 0 + return self + + def encode(self): + pieces = list() + pieces.append(struct.pack('>Q', self.delivery_tag)) + bit_buffer = 0 + if self.requeue: + bit_buffer = bit_buffer | (1 << 0) + pieces.append(struct.pack('B', bit_buffer)) + return pieces + + class RecoverAsync(amqp_object.Method): + + INDEX = 0x003C0064 # 60, 100; 3932260 + NAME = 'Basic.RecoverAsync' + + def __init__(self, requeue=False): + self.requeue = requeue + + @property + def synchronous(self): + return False + + def decode(self, encoded, offset=0): + bit_buffer = struct.unpack_from('B', encoded, offset)[0] + offset += 1 + self.requeue = (bit_buffer & (1 << 0)) != 0 + return self + + def encode(self): + pieces = list() + bit_buffer = 0 + if self.requeue: + bit_buffer = bit_buffer | (1 << 0) + pieces.append(struct.pack('B', bit_buffer)) + return pieces + + class Recover(amqp_object.Method): + + INDEX = 0x003C006E # 60, 110; 3932270 + NAME = 'Basic.Recover' + + def __init__(self, requeue=False): + self.requeue = requeue + + @property + def synchronous(self): + return True + + def decode(self, encoded, offset=0): + bit_buffer = struct.unpack_from('B', encoded, offset)[0] + offset += 1 + self.requeue = (bit_buffer & (1 << 0)) != 0 + return self + + def encode(self): + pieces = list() + bit_buffer = 0 + if self.requeue: + bit_buffer = bit_buffer | (1 << 0) + pieces.append(struct.pack('B', bit_buffer)) + return pieces + + class RecoverOk(amqp_object.Method): + + INDEX = 0x003C006F # 60, 111; 3932271 + NAME = 'Basic.RecoverOk' + + def __init__(self): + pass + + @property + def synchronous(self): + return False + + def decode(self, encoded, offset=0): + return self + + def encode(self): + pieces = list() + return pieces + + class Nack(amqp_object.Method): + + INDEX = 0x003C0078 # 60, 120; 3932280 + NAME = 'Basic.Nack' + + def __init__(self, delivery_tag=0, multiple=False, requeue=True): + self.delivery_tag = delivery_tag + self.multiple = multiple + self.requeue = requeue + + @property + def synchronous(self): + return False + + def decode(self, encoded, offset=0): + self.delivery_tag = struct.unpack_from('>Q', encoded, offset)[0] + offset += 8 + bit_buffer = struct.unpack_from('B', encoded, offset)[0] + offset += 1 + self.multiple = (bit_buffer & (1 << 0)) != 0 + self.requeue = (bit_buffer & (1 << 1)) != 0 + return self + + def encode(self): + pieces = list() + pieces.append(struct.pack('>Q', self.delivery_tag)) + bit_buffer = 0 + if self.multiple: + bit_buffer = bit_buffer | (1 << 0) + if self.requeue: + bit_buffer = bit_buffer | (1 << 1) + pieces.append(struct.pack('B', bit_buffer)) + return pieces + + +class Tx(amqp_object.Class): + + INDEX = 0x005A # 90 + NAME = 'Tx' + + class Select(amqp_object.Method): + + INDEX = 0x005A000A # 90, 10; 5898250 + NAME = 'Tx.Select' + + def __init__(self): + pass + + @property + def synchronous(self): + return True + + def decode(self, encoded, offset=0): + return self + + def encode(self): + pieces = list() + return pieces + + class SelectOk(amqp_object.Method): + + INDEX = 0x005A000B # 90, 11; 5898251 + NAME = 'Tx.SelectOk' + + def __init__(self): + pass + + @property + def synchronous(self): + return False + + def decode(self, encoded, offset=0): + return self + + def encode(self): + pieces = list() + return pieces + + class Commit(amqp_object.Method): + + INDEX = 0x005A0014 # 90, 20; 5898260 + NAME = 'Tx.Commit' + + def __init__(self): + pass + + @property + def synchronous(self): + return True + + def decode(self, encoded, offset=0): + return self + + def encode(self): + pieces = list() + return pieces + + class CommitOk(amqp_object.Method): + + INDEX = 0x005A0015 # 90, 21; 5898261 + NAME = 'Tx.CommitOk' + + def __init__(self): + pass + + @property + def synchronous(self): + return False + + def decode(self, encoded, offset=0): + return self + + def encode(self): + pieces = list() + return pieces + + class Rollback(amqp_object.Method): + + INDEX = 0x005A001E # 90, 30; 5898270 + NAME = 'Tx.Rollback' + + def __init__(self): + pass + + @property + def synchronous(self): + return True + + def decode(self, encoded, offset=0): + return self + + def encode(self): + pieces = list() + return pieces + + class RollbackOk(amqp_object.Method): + + INDEX = 0x005A001F # 90, 31; 5898271 + NAME = 'Tx.RollbackOk' + + def __init__(self): + pass + + @property + def synchronous(self): + return False + + def decode(self, encoded, offset=0): + return self + + def encode(self): + pieces = list() + return pieces + + +class Confirm(amqp_object.Class): + + INDEX = 0x0055 # 85 + NAME = 'Confirm' + + class Select(amqp_object.Method): + + INDEX = 0x0055000A # 85, 10; 5570570 + NAME = 'Confirm.Select' + + def __init__(self, nowait=False): + self.nowait = nowait + + @property + def synchronous(self): + return True + + def decode(self, encoded, offset=0): + bit_buffer = struct.unpack_from('B', encoded, offset)[0] + offset += 1 + self.nowait = (bit_buffer & (1 << 0)) != 0 + return self + + def encode(self): + pieces = list() + bit_buffer = 0 + if self.nowait: + bit_buffer = bit_buffer | (1 << 0) + pieces.append(struct.pack('B', bit_buffer)) + return pieces + + class SelectOk(amqp_object.Method): + + INDEX = 0x0055000B # 85, 11; 5570571 + NAME = 'Confirm.SelectOk' + + def __init__(self): + pass + + @property + def synchronous(self): + return False + + def decode(self, encoded, offset=0): + return self + + def encode(self): + pieces = list() + return pieces + + +class BasicProperties(amqp_object.Properties): + + CLASS = Basic + INDEX = 0x003C # 60 + NAME = 'BasicProperties' + + FLAG_CONTENT_TYPE = (1 << 15) + FLAG_CONTENT_ENCODING = (1 << 14) + FLAG_HEADERS = (1 << 13) + FLAG_DELIVERY_MODE = (1 << 12) + FLAG_PRIORITY = (1 << 11) + FLAG_CORRELATION_ID = (1 << 10) + FLAG_REPLY_TO = (1 << 9) + FLAG_EXPIRATION = (1 << 8) + FLAG_MESSAGE_ID = (1 << 7) + FLAG_TIMESTAMP = (1 << 6) + FLAG_TYPE = (1 << 5) + FLAG_USER_ID = (1 << 4) + FLAG_APP_ID = (1 << 3) + FLAG_CLUSTER_ID = (1 << 2) + + def __init__(self, content_type=None, content_encoding=None, headers=None, delivery_mode=None, priority=None, correlation_id=None, reply_to=None, expiration=None, message_id=None, timestamp=None, type=None, user_id=None, app_id=None, cluster_id=None): + self.content_type = content_type + self.content_encoding = content_encoding + self.headers = headers + self.delivery_mode = delivery_mode + self.priority = priority + self.correlation_id = correlation_id + self.reply_to = reply_to + self.expiration = expiration + self.message_id = message_id + self.timestamp = timestamp + self.type = type + self.user_id = user_id + self.app_id = app_id + self.cluster_id = cluster_id + + def decode(self, encoded, offset=0): + flags = 0 + flagword_index = 0 + while True: + partial_flags = struct.unpack_from('>H', encoded, offset)[0] + offset += 2 + flags = flags | (partial_flags << (flagword_index * 16)) + if not (partial_flags & 1): + break + flagword_index += 1 + if flags & BasicProperties.FLAG_CONTENT_TYPE: + self.content_type, offset = data.decode_short_string(encoded, offset) + else: + self.content_type = None + if flags & BasicProperties.FLAG_CONTENT_ENCODING: + self.content_encoding, offset = data.decode_short_string(encoded, offset) + else: + self.content_encoding = None + if flags & BasicProperties.FLAG_HEADERS: + (self.headers, offset) = data.decode_table(encoded, offset) + else: + self.headers = None + if flags & BasicProperties.FLAG_DELIVERY_MODE: + self.delivery_mode = struct.unpack_from('B', encoded, offset)[0] + offset += 1 + else: + self.delivery_mode = None + if flags & BasicProperties.FLAG_PRIORITY: + self.priority = struct.unpack_from('B', encoded, offset)[0] + offset += 1 + else: + self.priority = None + if flags & BasicProperties.FLAG_CORRELATION_ID: + self.correlation_id, offset = data.decode_short_string(encoded, offset) + else: + self.correlation_id = None + if flags & BasicProperties.FLAG_REPLY_TO: + self.reply_to, offset = data.decode_short_string(encoded, offset) + else: + self.reply_to = None + if flags & BasicProperties.FLAG_EXPIRATION: + self.expiration, offset = data.decode_short_string(encoded, offset) + else: + self.expiration = None + if flags & BasicProperties.FLAG_MESSAGE_ID: + self.message_id, offset = data.decode_short_string(encoded, offset) + else: + self.message_id = None + if flags & BasicProperties.FLAG_TIMESTAMP: + self.timestamp = struct.unpack_from('>Q', encoded, offset)[0] + offset += 8 + else: + self.timestamp = None + if flags & BasicProperties.FLAG_TYPE: + self.type, offset = data.decode_short_string(encoded, offset) + else: + self.type = None + if flags & BasicProperties.FLAG_USER_ID: + self.user_id, offset = data.decode_short_string(encoded, offset) + else: + self.user_id = None + if flags & BasicProperties.FLAG_APP_ID: + self.app_id, offset = data.decode_short_string(encoded, offset) + else: + self.app_id = None + if flags & BasicProperties.FLAG_CLUSTER_ID: + self.cluster_id, offset = data.decode_short_string(encoded, offset) + else: + self.cluster_id = None + return self + + def encode(self): + pieces = list() + flags = 0 + if self.content_type is not None: + flags = flags | BasicProperties.FLAG_CONTENT_TYPE + assert isinstance(self.content_type, str_or_bytes),\ + 'A non-string value was supplied for self.content_type' + data.encode_short_string(pieces, self.content_type) + if self.content_encoding is not None: + flags = flags | BasicProperties.FLAG_CONTENT_ENCODING + assert isinstance(self.content_encoding, str_or_bytes),\ + 'A non-string value was supplied for self.content_encoding' + data.encode_short_string(pieces, self.content_encoding) + if self.headers is not None: + flags = flags | BasicProperties.FLAG_HEADERS + data.encode_table(pieces, self.headers) + if self.delivery_mode is not None: + flags = flags | BasicProperties.FLAG_DELIVERY_MODE + pieces.append(struct.pack('B', self.delivery_mode)) + if self.priority is not None: + flags = flags | BasicProperties.FLAG_PRIORITY + pieces.append(struct.pack('B', self.priority)) + if self.correlation_id is not None: + flags = flags | BasicProperties.FLAG_CORRELATION_ID + assert isinstance(self.correlation_id, str_or_bytes),\ + 'A non-string value was supplied for self.correlation_id' + data.encode_short_string(pieces, self.correlation_id) + if self.reply_to is not None: + flags = flags | BasicProperties.FLAG_REPLY_TO + assert isinstance(self.reply_to, str_or_bytes),\ + 'A non-string value was supplied for self.reply_to' + data.encode_short_string(pieces, self.reply_to) + if self.expiration is not None: + flags = flags | BasicProperties.FLAG_EXPIRATION + assert isinstance(self.expiration, str_or_bytes),\ + 'A non-string value was supplied for self.expiration' + data.encode_short_string(pieces, self.expiration) + if self.message_id is not None: + flags = flags | BasicProperties.FLAG_MESSAGE_ID + assert isinstance(self.message_id, str_or_bytes),\ + 'A non-string value was supplied for self.message_id' + data.encode_short_string(pieces, self.message_id) + if self.timestamp is not None: + flags = flags | BasicProperties.FLAG_TIMESTAMP + pieces.append(struct.pack('>Q', self.timestamp)) + if self.type is not None: + flags = flags | BasicProperties.FLAG_TYPE + assert isinstance(self.type, str_or_bytes),\ + 'A non-string value was supplied for self.type' + data.encode_short_string(pieces, self.type) + if self.user_id is not None: + flags = flags | BasicProperties.FLAG_USER_ID + assert isinstance(self.user_id, str_or_bytes),\ + 'A non-string value was supplied for self.user_id' + data.encode_short_string(pieces, self.user_id) + if self.app_id is not None: + flags = flags | BasicProperties.FLAG_APP_ID + assert isinstance(self.app_id, str_or_bytes),\ + 'A non-string value was supplied for self.app_id' + data.encode_short_string(pieces, self.app_id) + if self.cluster_id is not None: + flags = flags | BasicProperties.FLAG_CLUSTER_ID + assert isinstance(self.cluster_id, str_or_bytes),\ + 'A non-string value was supplied for self.cluster_id' + data.encode_short_string(pieces, self.cluster_id) + flag_pieces = list() + while True: + remainder = flags >> 16 + partial_flags = flags & 0xFFFE + if remainder != 0: + partial_flags |= 1 + flag_pieces.append(struct.pack('>H', partial_flags)) + flags = remainder + if not flags: + break + return flag_pieces + pieces + +methods = { + 0x000A000A: Connection.Start, + 0x000A000B: Connection.StartOk, + 0x000A0014: Connection.Secure, + 0x000A0015: Connection.SecureOk, + 0x000A001E: Connection.Tune, + 0x000A001F: Connection.TuneOk, + 0x000A0028: Connection.Open, + 0x000A0029: Connection.OpenOk, + 0x000A0032: Connection.Close, + 0x000A0033: Connection.CloseOk, + 0x000A003C: Connection.Blocked, + 0x000A003D: Connection.Unblocked, + 0x0014000A: Channel.Open, + 0x0014000B: Channel.OpenOk, + 0x00140014: Channel.Flow, + 0x00140015: Channel.FlowOk, + 0x00140028: Channel.Close, + 0x00140029: Channel.CloseOk, + 0x001E000A: Access.Request, + 0x001E000B: Access.RequestOk, + 0x0028000A: Exchange.Declare, + 0x0028000B: Exchange.DeclareOk, + 0x00280014: Exchange.Delete, + 0x00280015: Exchange.DeleteOk, + 0x0028001E: Exchange.Bind, + 0x0028001F: Exchange.BindOk, + 0x00280028: Exchange.Unbind, + 0x00280033: Exchange.UnbindOk, + 0x0032000A: Queue.Declare, + 0x0032000B: Queue.DeclareOk, + 0x00320014: Queue.Bind, + 0x00320015: Queue.BindOk, + 0x0032001E: Queue.Purge, + 0x0032001F: Queue.PurgeOk, + 0x00320028: Queue.Delete, + 0x00320029: Queue.DeleteOk, + 0x00320032: Queue.Unbind, + 0x00320033: Queue.UnbindOk, + 0x003C000A: Basic.Qos, + 0x003C000B: Basic.QosOk, + 0x003C0014: Basic.Consume, + 0x003C0015: Basic.ConsumeOk, + 0x003C001E: Basic.Cancel, + 0x003C001F: Basic.CancelOk, + 0x003C0028: Basic.Publish, + 0x003C0032: Basic.Return, + 0x003C003C: Basic.Deliver, + 0x003C0046: Basic.Get, + 0x003C0047: Basic.GetOk, + 0x003C0048: Basic.GetEmpty, + 0x003C0050: Basic.Ack, + 0x003C005A: Basic.Reject, + 0x003C0064: Basic.RecoverAsync, + 0x003C006E: Basic.Recover, + 0x003C006F: Basic.RecoverOk, + 0x003C0078: Basic.Nack, + 0x005A000A: Tx.Select, + 0x005A000B: Tx.SelectOk, + 0x005A0014: Tx.Commit, + 0x005A0015: Tx.CommitOk, + 0x005A001E: Tx.Rollback, + 0x005A001F: Tx.RollbackOk, + 0x0055000A: Confirm.Select, + 0x0055000B: Confirm.SelectOk +} + +props = { + 0x003C: BasicProperties +} + + +def has_content(methodNumber): + return methodNumber in ( + Basic.Publish.INDEX, + Basic.Return.INDEX, + Basic.Deliver.INDEX, + Basic.GetOk.INDEX, + ) diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/pika/tcp_socket_opts.py b/NodeRed/NodeRedFiles/pika-0.13.1/pika/tcp_socket_opts.py new file mode 100644 index 000000000..73d2062b1 --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/pika/tcp_socket_opts.py @@ -0,0 +1,43 @@ +import logging +import socket +import pika.compat + +LOGGER = logging.getLogger(__name__) + +_SUPPORTED_TCP_OPTIONS = {} + +try: + _SUPPORTED_TCP_OPTIONS['TCP_USER_TIMEOUT'] = socket.TCP_USER_TIMEOUT +except AttributeError: + if pika.compat.LINUX_VERSION and pika.compat.LINUX_VERSION >= (2, 6, 37): + # NB: this is not the timeout value, but the number corresponding + # to the constant in tcp.h + # https://github.com/torvalds/linux/blob/master/include/uapi/linux/tcp.h# + # #define TCP_USER_TIMEOUT 18 /* How long for loss retry before timeout */ + _SUPPORTED_TCP_OPTIONS['TCP_USER_TIMEOUT'] = 18 + +try: + _SUPPORTED_TCP_OPTIONS['TCP_KEEPIDLE'] = socket.TCP_KEEPIDLE + _SUPPORTED_TCP_OPTIONS['TCP_KEEPCNT'] = socket.TCP_KEEPCNT + _SUPPORTED_TCP_OPTIONS['TCP_KEEPINTVL'] = socket.TCP_KEEPINTVL +except AttributeError: + pass + + +def socket_requires_keepalive(tcp_options): + return 'TCP_KEEPIDLE' in tcp_options or 'TCP_KEEPCNT' in tcp_options or 'TCP_KEEPINTVL' in tcp_options + + +def set_sock_opts(tcp_options, sock): + if not tcp_options: + return + + if socket_requires_keepalive(tcp_options): + sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) + + for key, value in tcp_options.items(): + option = _SUPPORTED_TCP_OPTIONS.get(key) + if option: + sock.setsockopt(pika.compat.SOL_TCP, option, value) + else: + LOGGER.warning('Unsupported TCP option %s:%s', key, value) diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/pika/utils.py b/NodeRed/NodeRedFiles/pika-0.13.1/pika/utils.py new file mode 100644 index 000000000..57f93b0a6 --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/pika/utils.py @@ -0,0 +1,16 @@ +""" +Non-module specific functions shared by modules in the pika package + +""" +import collections + + +def is_callable(handle): + """Returns a bool value if the handle passed in is a callable + method/function + + :param any handle: The object to check + :rtype: bool + + """ + return isinstance(handle, collections.Callable) diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/pylintrc b/NodeRed/NodeRedFiles/pika-0.13.1/pylintrc new file mode 100644 index 000000000..4f96c7920 --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/pylintrc @@ -0,0 +1,391 @@ +[MASTER] + +# Specify a configuration file. +#rcfile= + +# Python code to execute, usually for sys.path manipulation such as +# pygtk.require(). +#init-hook= + +# Profiled execution. +profile=no + +# Add files or directories to the blacklist. They should be base names, not +# paths. +ignore=CVS + +# Pickle collected data for later comparisons. +persistent=no + +# List of plugins (as comma separated values of python modules names) to load, +# usually to register additional checkers. +load-plugins= + +# Deprecated. It was used to include message's id in output. Use --msg-template +# instead. +#include-ids=no + +# Deprecated. It was used to include symbolic ids of messages in output. Use +# --msg-template instead. +#symbols=no + +# Use multiple processes to speed up Pylint. +#jobs=1 + +# Allow loading of arbitrary C extensions. Extensions are imported into the +# active Python interpreter and may run arbitrary code. +#unsafe-load-any-extension=no + +# A comma-separated list of package or module names from where C extensions may +# be loaded. Extensions are loading into the active Python interpreter and may +# run arbitrary code +#extension-pkg-whitelist= + +# Allow optimization of some AST trees. This will activate a peephole AST +# optimizer, which will apply various small optimizations. For instance, it can +# be used to obtain the result of joining multiple strings with the addition +# operator. Joining a lot of strings can lead to a maximum recursion error in +# Pylint and this flag can prevent that. It has one side effect, the resulting +# AST will be different than the one from reality. +#optimize-ast=no + + +[MESSAGES CONTROL] + +# Only show warnings with the listed confidence levels. Leave empty to show +# all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED +confidence= + +# Enable the message, report, category or checker with the given id(s). You can +# either give multiple identifier separated by comma (,) or put this option +# multiple time. See also the "--disable" option for examples. +#enable= + +# Disable the message, report, category or checker with the given id(s). You +# can either give multiple identifiers separated by comma (,) or put this +# option multiple times (only on the command line, not in the configuration +# file where it should appear only once).You can also use "--disable=all" to +# disable everything first and then reenable specific checks. For example, if +# you want to run only the similarities checker, you can use "--disable=all +# --enable=similarities". If you want to run only the classes checker, but have +# no Warning level messages displayed, use"--disable=all --enable=classes +# --disable=W" +disable=R1705 + + +[REPORTS] + +# Set the output format. Available formats are text, parseable, colorized, msvs +# (visual studio) and html. You can also give a reporter class, eg +# mypackage.mymodule.MyReporterClass. +output-format=text + +# Put messages in a separate file for each module / package specified on the +# command line instead of printing them on stdout. Reports (if any) will be +# written in a file name "pylint_global.[txt|html]". +files-output=no + +# Tells whether to display a full report or only the messages +reports=no + +# Python expression which should return a note less than 10 (10 is the highest +# note). You have access to the variables errors warning, statement which +# respectively contain the number of errors / warnings messages and the total +# number of statements analyzed. This is used by the global evaluation report +# (RP0004). +evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10) + +# Add a comment according to your evaluation note. This is used by the global +# evaluation report (RP0004). +comment=no + +# Template used to display messages. This is a python new-style format string +# used to format the message information. See doc for all details +msg-template={msg_id}, {line:3d}:{column:2d} - {msg} ({symbol}) +#msg-template= + + +[BASIC] + +# Required attributes for module, separated by a comma +required-attributes= + +# List of builtins function names that should not be used, separated by a comma +bad-functions=map,filter,input + +# Good variable names which should always be accepted, separated by a comma +good-names=i,j,k,ex,fd,Run,_ + +# Bad variable names which should always be refused, separated by a comma +bad-names=foo,bar,baz,toto,tutu,tata + +# Colon-delimited sets of names that determine each other's naming style when +# the name regexes allow several styles. +name-group= + +# Include a hint for the correct naming format with invalid-name +include-naming-hint=no + +# Regular expression matching correct function names +function-rgx=[a-z_][a-z0-9_]{2,40}$ + +# Naming hint for function names +function-name-hint=[a-z_][a-z0-9_]{2,40}$ + +# Regular expression matching correct variable names +variable-rgx=[a-z_][a-z0-9_]{2,30}$ + +# Naming hint for variable names +variable-name-hint=[a-z_][a-z0-9_]{2,30}$ + +# Regular expression matching correct constant names +const-rgx=(([A-Z_][A-Z0-9_]*)|(__.*__))$ + +# Naming hint for constant names +const-name-hint=(([A-Z_][A-Z0-9_]*)|(__.*__))$ + +# Regular expression matching correct attribute names +attr-rgx=[a-z_][a-z0-9_]{2,40}$ + +# Naming hint for attribute names +attr-name-hint=[a-z_][a-z0-9_]{2,40}$ + +# Regular expression matching correct argument names +argument-rgx=[a-z_][a-z0-9_]{2,30}$ + +# Naming hint for argument names +argument-name-hint=[a-z_][a-z0-9_]{2,30}$ + +# Regular expression matching correct class attribute names +class-attribute-rgx=([A-Za-z_][A-Za-z0-9_]{2,40}|(__.*__))$ + +# Naming hint for class attribute names +class-attribute-name-hint=([A-Za-z_][A-Za-z0-9_]{2,40}|(__.*__))$ + +# Regular expression matching correct inline iteration names +inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$ + +# Naming hint for inline iteration names +inlinevar-name-hint=[A-Za-z_][A-Za-z0-9_]*$ + +# Regular expression matching correct class names +class-rgx=[A-Z_][a-zA-Z0-9]+$ + +# Naming hint for class names +class-name-hint=[A-Z_][a-zA-Z0-9]+$ + +# Regular expression matching correct module names +module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$ + +# Naming hint for module names +module-name-hint=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$ + +# Regular expression matching correct method names +method-rgx=[a-z_][a-z0-9_]{2,40}$ + +# Naming hint for method names +method-name-hint=[a-z_][a-z0-9_]{2,40}$ + +# Regular expression which should only match function or class names that do +# not require a docstring. +no-docstring-rgx=__.*__ + +# Minimum line length for functions/classes that require docstrings, shorter +# ones are exempt. +docstring-min-length=-1 + + +[FORMAT] + +# Maximum number of characters on a single line. +max-line-length=100 + +# Regexp for a line that is allowed to be longer than the limit. +ignore-long-lines=^\s*(# )??$ + +# Allow the body of an if to be on the same line as the test if there is no +# else. +single-line-if-stmt=no + +# List of optional constructs for which whitespace checking is disabled +no-space-check=trailing-comma,dict-separator + +# Maximum number of lines in a module +max-module-lines=1000 + +# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1 +# tab). +indent-string=' ' + +# Number of spaces of indent required inside a hanging or continued line. +indent-after-paren=4 + +# Expected format of line ending, e.g. empty (any line ending), LF or CRLF. +expected-line-ending-format= + + +[LOGGING] + +# Logging modules to check that the string format arguments are in logging +# function parameter format +logging-modules=logging + + +[MISCELLANEOUS] + +# List of note tags to take in consideration, separated by a comma. +notes=FIXME,XXX,TODO + + +[SIMILARITIES] + +# Minimum lines number of a similarity. +min-similarity-lines=4 + +# Ignore comments when computing similarities. +ignore-comments=yes + +# Ignore docstrings when computing similarities. +ignore-docstrings=yes + +# Ignore imports when computing similarities. +ignore-imports=no + + +[SPELLING] + +# Spelling dictionary name. Available dictionaries: none. To make it working +# install python-enchant package. +spelling-dict= + +# List of comma separated words that should not be checked. +spelling-ignore-words= + +# A path to a file that contains private dictionary; one word per line. +spelling-private-dict-file= + +# Tells whether to store unknown words to indicated private dictionary in +# --spelling-private-dict-file option instead of raising a message. +spelling-store-unknown-words=no + + +[TYPECHECK] + +# Tells whether missing members accessed in mixin class should be ignored. A +# mixin class is detected if its name ends with "mixin" (case insensitive). +ignore-mixin-members=yes + +# List of module names for which member attributes should not be checked +# (useful for modules/projects where namespaces are manipulated during runtime +# and thus existing member attributes cannot be deduced by static analysis +ignored-modules= + +# List of classes names for which member attributes should not be checked +# (useful for classes with attributes dynamically set). +ignored-classes=SQLObject + +# When zope mode is activated, add a predefined set of Zope acquired attributes +# to generated-members. +zope=no + +# List of members which are set dynamically and missed by pylint inference +# system, and so shouldn't trigger E0201 when accessed. Python regular +# expressions are accepted. +generated-members=REQUEST,acl_users,aq_parent + + +[VARIABLES] + +# Tells whether we should check for unused import in __init__ files. +init-import=no + +# A regular expression matching the name of dummy variables (i.e. expectedly +# not used). +dummy-variables-rgx=_|_$|dummy + +# List of additional names supposed to be defined in builtins. Remember that +# you should avoid to define new builtins when possible. +additional-builtins= + +# List of strings which can identify a callback function by name. A callback +# name must start or end with one of those strings. +callbacks=cb_,_cb + + +[CLASSES] + +# List of interface methods to ignore, separated by a comma. This is used for +# instance to not check methods defines in Zope's Interface base class. +ignore-iface-methods=isImplementedBy,deferred,extends,names,namesAndDescriptions,queryDescriptionFor,getBases,getDescriptionFor,getDoc,getName,getTaggedValue,getTaggedValueTags,isEqualOrExtendedBy,setTaggedValue,isImplementedByInstancesOf,adaptWith,is_implemented_by + +# List of method names used to declare (i.e. assign) instance attributes. +defining-attr-methods=__init__,__new__,setUp + +# List of valid names for the first argument in a class method. +valid-classmethod-first-arg=cls + +# List of valid names for the first argument in a metaclass class method. +valid-metaclass-classmethod-first-arg=mcs + +# List of member names, which should be excluded from the protected access +# warning. +exclude-protected=_asdict,_fields,_replace,_source,_make + + +[DESIGN] + +# Maximum number of arguments for function / method +max-args=10 + +# Argument names that match this expression will be ignored. Default to name +# with leading underscore +ignored-argument-names=_.* + +# Maximum number of locals for function / method body +max-locals=15 + +# Maximum number of return / yield for function / method body +max-returns=6 + +# Maximum number of branch for function / method body +max-branches=20 + +# Maximum number of statements in function / method body +max-statements=50 + +# Maximum number of parents for a class (see R0901). +max-parents=7 + +# Maximum number of attributes for a class (see R0902). +max-attributes=20 + +# Minimum number of public methods for a class (see R0903). +min-public-methods=0 + +# Maximum number of public methods for a class (see R0904). +max-public-methods=40 + + +[IMPORTS] + +# Deprecated modules which should not be used, separated by a comma +deprecated-modules=regsub,TERMIOS,Bastion,rexec + +# Create a graph of every (i.e. internal and external) dependencies in the +# given file (report RP0402 must not be disabled) +import-graph= + +# Create a graph of external dependencies in the given file (report RP0402 must +# not be disabled) +ext-import-graph= + +# Create a graph of internal dependencies in the given file (report RP0402 must +# not be disabled) +int-import-graph= + + +[EXCEPTIONS] + +# Exceptions that will emit a warning when being caught. Defaults to +# "Exception" +overgeneral-exceptions=Exception diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/setup.cfg b/NodeRed/NodeRedFiles/pika-0.13.1/setup.cfg new file mode 100644 index 000000000..3bac5afc9 --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/setup.cfg @@ -0,0 +1,16 @@ +[bdist_wheel] +universal = 1 + +[nosetests] +cover-branches = 1 +cover-erase = 1 +cover-html = 1 +cover-html-dir = build/coverage +cover-package = pika +cover-tests = 1 +logging-level = DEBUG +stop = 1 +tests=tests/unit,tests/acceptance +verbosity = 3 +with-coverage = 1 +detailed-errors = 1 diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/setup.py b/NodeRed/NodeRedFiles/pika-0.13.1/setup.py new file mode 100644 index 000000000..e64f5997d --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/setup.py @@ -0,0 +1,51 @@ +import setuptools +import os + +# Conditionally include additional modules for docs +on_rtd = os.environ.get('READTHEDOCS', None) == 'True' +requirements = list() +if on_rtd: + requirements.append('tornado') + requirements.append('twisted') + +long_description = ('Pika is a pure-Python implementation of the AMQP 0-9-1 ' + 'protocol that tries to stay fairly independent of the ' + 'underlying network support library. Pika was developed ' + 'primarily for use with RabbitMQ, but should also work ' + 'with other AMQP 0-9-1 brokers.') + +setuptools.setup( + name='pika', + version='0.13.1', + description='Pika Python AMQP Client Library', + long_description=open('README.rst').read(), + maintainer='Gavin M. Roy', + maintainer_email='gavinmroy@gmail.com', + url='https://pika.readthedocs.io', + packages=setuptools.find_packages(include=['pika', 'pika.*']), + license='BSD', + install_requires=requirements, + package_data={'': ['LICENSE', 'README.rst']}, + extras_require={'tornado': ['tornado'], + 'twisted': ['twisted']}, + classifiers=[ + 'Development Status :: 5 - Production/Stable', + 'Intended Audience :: Developers', + 'License :: OSI Approved :: BSD License', + 'Natural Language :: English', 'Operating System :: OS Independent', + 'Programming Language :: Python :: 2', + 'Programming Language :: Python :: 2.7', + 'Programming Language :: Python :: 3', + 'Programming Language :: Python :: 3.4', + 'Programming Language :: Python :: 3.5', + 'Programming Language :: Python :: 3.6', + 'Programming Language :: Python :: 3.7', + 'Programming Language :: Python :: Implementation :: CPython', + 'Programming Language :: Python :: Implementation :: Jython', + 'Programming Language :: Python :: Implementation :: PyPy', + 'Topic :: Communications', 'Topic :: Internet', + 'Topic :: Software Development :: Libraries', + 'Topic :: Software Development :: Libraries :: Python Modules', + 'Topic :: System :: Networking' + ], + zip_safe=True) diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/test-requirements.txt b/NodeRed/NodeRedFiles/pika-0.13.1/test-requirements.txt new file mode 100644 index 000000000..ced2cc220 --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/test-requirements.txt @@ -0,0 +1,6 @@ +coverage +codecov +mock +nose +tornado +twisted diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/testdata/certs/ca_certificate.pem b/NodeRed/NodeRedFiles/pika-0.13.1/testdata/certs/ca_certificate.pem new file mode 100644 index 000000000..a59971792 --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/testdata/certs/ca_certificate.pem @@ -0,0 +1,19 @@ +-----BEGIN CERTIFICATE----- +MIIDAjCCAeqgAwIBAgIJAIwXYB8fddi4MA0GCSqGSIb3DQEBCwUAMDExIDAeBgNV +BAMMF1RMU0dlblNlbGZTaWduZWR0Um9vdENBMQ0wCwYDVQQHDAQkJCQkMB4XDTE4 +MDIyNzIyMjkyMFoXDTI4MDIyNTIyMjkyMFowMTEgMB4GA1UEAwwXVExTR2VuU2Vs +ZlNpZ25lZHRSb290Q0ExDTALBgNVBAcMBCQkJCQwggEiMA0GCSqGSIb3DQEBAQUA +A4IBDwAwggEKAoIBAQDMHFlBCaj/wr9AToBRiEx4N8b+lLYyTgp2BA4j/+WyNXyQ +BlGOpqBiJ2XDyzykoQGeNDMao8JjhMOZVuZ/I9LxwRNDOuA5aTAOknuPf/M6VigW +OawsyZblcHW8X2QnX9UJi+MCDaoSFGDRfXwkXFkfEvkYYfXl7lrEdWXg0LsiphPJ +RflqJMhfM1R/b+NvJ6OJs7rM15J1V1AkQAqKWygM79FQzVOUb1tFVZfy/OrIqd4Z +3dDfqF1JqnLoGIoLWxXeheqiRgDYzM6hegDefWZtKmBFR2ZIL3ZRYP4A9Ftx1gan +Gi6u8J05sjDOHyrzg/pZbrK/8Nqc3QRlSxhbwG+hAgMBAAGjHTAbMAwGA1UdEwQF +MAMBAf8wCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBCwUAA4IBAQAMx1i0VogTZPYA +OJh/MdUSVNpI+DGZlId6ZPxglWDOQa53+DtjHlB/ur77RLnT89w3/HV2+xC+0yXP +W+MxRxbYe++Ja7mcByHHjEXMNT8GvffXrCSTT7hAUoQVlVX3VwCNLgjSY3NA6jw+ +Xhd/aOGDD8TmgNFdL2PbOiwbiiMP2nRmb11pxwvPUmGu4o2fn5biy8v47eq3zkvv +Wc64R0mrelVcEn2noFZBU9yfK4aCDD5kMG463UYZpj5/v20tPO44hYEc48MDMXOt +8jCaYaoh4P9zm1TK4syqY/b1fcCW44ri/HrZMfAoUGNktlbkBpnusMW7zwDg7ygG +gBBQadQA +-----END CERTIFICATE----- diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/testdata/certs/ca_key.pem b/NodeRed/NodeRedFiles/pika-0.13.1/testdata/certs/ca_key.pem new file mode 100644 index 000000000..8fbc4e144 --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/testdata/certs/ca_key.pem @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDMHFlBCaj/wr9A +ToBRiEx4N8b+lLYyTgp2BA4j/+WyNXyQBlGOpqBiJ2XDyzykoQGeNDMao8JjhMOZ +VuZ/I9LxwRNDOuA5aTAOknuPf/M6VigWOawsyZblcHW8X2QnX9UJi+MCDaoSFGDR +fXwkXFkfEvkYYfXl7lrEdWXg0LsiphPJRflqJMhfM1R/b+NvJ6OJs7rM15J1V1Ak +QAqKWygM79FQzVOUb1tFVZfy/OrIqd4Z3dDfqF1JqnLoGIoLWxXeheqiRgDYzM6h +egDefWZtKmBFR2ZIL3ZRYP4A9Ftx1ganGi6u8J05sjDOHyrzg/pZbrK/8Nqc3QRl +SxhbwG+hAgMBAAECggEBAKpjO+r8GnUvaKJRJfNqGZP91AOvtwz1cuwj5H4O3/vN +hKdibvDrjlWB2AUDgyNXONeNcd/aNqsHKJW4IoCeMjkYWXE1E/s5ISH5DGa1hCD9 +zUcIa/+TZYExSUewRhZMfLYUbbPIHmIrWstmupxL7yXum7zMAg8o0+LOsfZjqOR5 +SmbKja6nk+ywzTyVOSX4qJbfbxc+qswno1B7vGXgBXOjXR1jgfAqMjI3yaE5qyKy +GpGnHdYow5st8Yikjg91OoDjSaLPtm3+clkYpUl/oTh8g8wTFRrphrJjfWk/io/3 +IkNUpKuI/jRr3Br4Fx8tOfDC9pX4+nYcFjcc7Z5b/cECgYEA+LxFRWqI3RJQQTzE +8MQNbk8QdBKHtxziKUX8t3Skbe9s2/Fo4O5sQSfQ/+UtGlQP2LbJVJDiPYAEP2zu +ncmbXVmHgEWd9PcosN3li28Vk7d5Z5RGhb0BNyzslnUOF06xV84pDWRBKqTfk/iz +jpGwG70oz5K06jF8rJ81mwJni4kCgYEA0hJuUqw0NYNJAm/ALd64ffnHIkqjBsxi +pJruqGUf0DLROcVqv9SYDUmS23DHE4p7H1NXHwneTaBcdOUgTIdcjqJv3Nv+IDDi +unnaVAsBvtJ4YiCdXvNNMog2Ptx1Zcdy93fRmKHBNO349QGvhp4RPPMuoTCAmLXN +gm3qdJG9RVkCgYB671pxV5kzYmTGCYnw0YUt2ufv5mSrTRw+d/fSmFTYfPhZsHQ8 +j7pzbYFvqE5lb9yxKI5TPJSE/uuaiXVaCRW/yosdC8tpEmtLFzDnfEy2yHy5g+Bj +IyohohOAvXPscxlVo3BIzR8kO37BPK9KLJlU7GXqScEe6ryK+Nleto6EuQKBgFnH +qMDKehG4xzY0XnT8L+sfGh0sutoH9cyVrpPnjB4l6cd/+Ox9RnK/U/VXEK3oTFCK +BLzuMcUJWRpYZmJuo38OKzLADq7hVbUOqOGsRpWwS+TcPYW8A+0py8032TCjeh4L +ZleOIg2l+vVzP/oPihx7bh1TplIduPQaV850DukZAoGAOHvComT/TeGIHwTp1KyD +7w8uXfRmoo5nk+x8GnfbTi0+1XG79LA4061gtvvQkDPlkdZjUwJcz6bhXQVMlBwo +1ILIAj5mm89G0n5wbmshui6yCEs82fpYpg8UhXIq8/LmvdsJZjcJ7ySQxpuNqxCi +Q/L5/WmjSY+1bvvLkkUOF7k= +-----END PRIVATE KEY----- diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/testdata/certs/client_certificate.pem b/NodeRed/NodeRedFiles/pika-0.13.1/testdata/certs/client_certificate.pem new file mode 100644 index 000000000..43dd98c70 --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/testdata/certs/client_certificate.pem @@ -0,0 +1,19 @@ +-----BEGIN CERTIFICATE----- +MIIDADCCAeigAwIBAgIBAjANBgkqhkiG9w0BAQsFADAxMSAwHgYDVQQDDBdUTFNH +ZW5TZWxmU2lnbmVkdFJvb3RDQTENMAsGA1UEBwwEJCQkJDAeFw0xODAyMjcyMjI5 +MjBaFw0yODAyMjUyMjI5MjBaMCUxEjAQBgNVBAMMCWxvY2FsaG9zdDEPMA0GA1UE +CgwGY2xpZW50MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4wBF9bFL +nRZlRdUWQ9M6R2lxwJvIfL4O0UT3opqc95RGaPuqJjWgc3kFkFmsJMI7cSgiDcDY +XKYNp/Z/l1BOYrwwbuNX2V8V2SFbP5ksUU75jxwKJV8/bNnHSMfOrZ0wlq2jIrEA +hvLC38ujrNZsSzWusjhESKy8rNgAqq+Xyfy/R+MIVrHfD6wjxyGDGctj0z6bYDai +LPR5AVgzGHNUTLWSsyS9KoeuOXFOWht7+iEj/eNbU8bA29oOnVyb52o5OSx/E/Nx +qV7z0tv+LL8LTs4iXo4DwfrYB6BRwM2Qwzma4tmpZG2uvwwq/xIStMSfUIIOIUeZ +WLUs2V8d0mUslQIDAQABoy8wLTAJBgNVHRMEAjAAMAsGA1UdDwQEAwIFoDATBgNV +HSUEDDAKBggrBgEFBQcDAjANBgkqhkiG9w0BAQsFAAOCAQEAmvYPZjAFUvknD4Cm +AkTu7ZAbsXkMYgFn74wxIr9gXbRswWJDsPmVYDHDtFbynBmLTVOciqS2P3ccnbOQ +sy8lLQeZ4YNcTcTs8GONyo3G6SDUTTF19dB/uIUbi9mzxfufhFg/UcGMSy6bAW/J +uEQi9RrfwlJAHkce39ZHxu8/xsHDiiEFQLK907kXLzZixQ0bonjbejgKQGiCX5oB +/JQiaEmREmwyENFSmEyNEprzorkquzB6HoqAIxQxNQ+4xuEmy2wr+jecK9X4cGU9 +uPdPlF+9GSY8qIomxvTBOuXOCyY+ULl3zZZhRjjh6c4Nj8YlUyBOoQW4XOM5R8DM +I8gRgA== +-----END CERTIFICATE----- diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/testdata/certs/client_key.pem b/NodeRed/NodeRedFiles/pika-0.13.1/testdata/certs/client_key.pem new file mode 100644 index 000000000..b95461488 --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/testdata/certs/client_key.pem @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEpAIBAAKCAQEA4wBF9bFLnRZlRdUWQ9M6R2lxwJvIfL4O0UT3opqc95RGaPuq +JjWgc3kFkFmsJMI7cSgiDcDYXKYNp/Z/l1BOYrwwbuNX2V8V2SFbP5ksUU75jxwK +JV8/bNnHSMfOrZ0wlq2jIrEAhvLC38ujrNZsSzWusjhESKy8rNgAqq+Xyfy/R+MI +VrHfD6wjxyGDGctj0z6bYDaiLPR5AVgzGHNUTLWSsyS9KoeuOXFOWht7+iEj/eNb +U8bA29oOnVyb52o5OSx/E/NxqV7z0tv+LL8LTs4iXo4DwfrYB6BRwM2Qwzma4tmp +ZG2uvwwq/xIStMSfUIIOIUeZWLUs2V8d0mUslQIDAQABAoIBAQDcr81T+VPLmpRG +ec01j0tfVdHzMQCO1a9OIECn4qyrvYleUxyuHQCqgoO4PJWw/uwPLLc+q7ctC3rH +Skvs7XPnZZGonHkxqNFy0I0HnYCKY78XNGlgv+LHjknCJg52lxU/x/uLpI0gpS5z +qGStiaCq1bvLJAyuotCjMTQkvKVTBgHm70lC3ZNt4I8OaocyfGF4BJqbUxyjXFKz +sYxgAXssAdMPqKsSH5du2ii4YyAZvzYO+RJ4OByPaZZA3OfsKddsnGDFPqfw3+Aa +8QBCFbf/uGUepOL0P4rWDp7XhHDwCJS/kiP3qTUZ37dh660arIeXCN4qcI6ZUjMo +nJp8tjvBAoGBAP9huBC79WWid9CYskCO9m+zIk4RTe07FNQW46Kxpva9lULqmSj+ +MpB47kSvjCNnVYdn0FOxi3ipsTeM7R0+fZz1LM5vdwRWc7pZ5U3HvrB2zBCaftSL +gWlvxup02eXR2TrPwNzKd1iR4GoPlLXc8FxMSZLHzcxFZYWh42RAKV8NAoGBAOOM +9ubZVSW8GdviZobFalNG7HhAn06U3LPrN71vxFdE3tKePLxNI/RNDbUHo/ji5muV +Hx45uvIFT36BtH74DgiORHjLYdTaOF+TVUJEHEmPkBGPj4kdLu9MRAEYba7lBvbw +rvv1NI49GEUB1NhzNoYaHdyw98afgq3mO7C59+GpAoGAKykUtp9NhfPDVBm6ZnbC +53Xa4l7CUMmfZ4jGyARGN4Uq6LhFUkxDt274tdsFUCZyqgO9jad/7tCfBshmen7J +M/GrtOfZsX366Q+wVUjgzWoGavfxX3KEWJFviMhe2xxwHiRmb+o36VweFU60z1eb +t72c4ZWrDk7cLY2CpLrDQzECgYEAuQDr4GZEfwh+sbJRjzNELe7U5TQNEZOgGLud +tuv+4sEAtJaoZKQHHmHjShKrMvgvRLqZ8TYYkxrUNdN4j15X8obQjrE0mhzNho8/ +2z+LDBenl09z8JOEjFQiWg2lZ3OXhP/MFNeYYiiz6a8CgPSzGLZ1Hu/Wk2sukPpF +/3pDWfkCgYBIpMV122EYgKqfk7yayJUDez69X+/JmUR4mBtkI9CZoYM8xrft7Coi +VzsjRc+2yS21ZFRuB4g4xO2ViEVLqM8/g2tFDuuUkGb+vdBsolx3j64xYqoBs20T +0JjnFaxl2MCpn2y44bJ9ht134q5/Mm762rPyNuqdm4R7rhAi7g/7+w== +-----END RSA PRIVATE KEY----- diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/testdata/certs/server_certificate.pem b/NodeRed/NodeRedFiles/pika-0.13.1/testdata/certs/server_certificate.pem new file mode 100644 index 000000000..55b0703be --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/testdata/certs/server_certificate.pem @@ -0,0 +1,19 @@ +-----BEGIN CERTIFICATE----- +MIIDADCCAeigAwIBAgIBATANBgkqhkiG9w0BAQsFADAxMSAwHgYDVQQDDBdUTFNH +ZW5TZWxmU2lnbmVkdFJvb3RDQTENMAsGA1UEBwwEJCQkJDAeFw0xODAyMjcyMjI5 +MjBaFw0yODAyMjUyMjI5MjBaMCUxEjAQBgNVBAMMCWxvY2FsaG9zdDEPMA0GA1UE +CgwGc2VydmVyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA14xcFsbL +bhw2qunzyhzBXQs5xxi+DQKqK9CjVVEmBrUVR2qwzS2P3IFdkVzegRa9jZgsgVSI +TrbsCgF2xkTy0Bsz5sbasaFVQQHDI8PjZ82vmK5MAXyUzR3HQ4iBzyNIpmSNhKHK +qWQuXhqN/D1wgkl08/B0xlx+jaFDIy+hdbuLpB5+NXgHbKWqYq1jrKomnZucKbm7 +dahXvbomshF6fe6xWNU4CxCaC7+snym3Zug6kkXSgI5NEYQzh93RjTXbV8m4q8Az +8nwWZ3vWcIdtcYURHZ+wP/DdGQmObItZjVrTmQ6OI9750MCtGfDXv+IX/Iipcp7W +0OYkNPPPJCowMwIDAQABoy8wLTAJBgNVHRMEAjAAMAsGA1UdDwQEAwIFoDATBgNV +HSUEDDAKBggrBgEFBQcDATANBgkqhkiG9w0BAQsFAAOCAQEAcqduPpka+3O29X3U +BGKAdKGJjSoqHrn+K7QbQ9A/BbCJC9htZ8cUtmVgRm0Aw82x94zMREG+YF7jQhXM +qSoYVxLbqPWxMCRx2FmQihByHvGusCKfu2yBAHo6rBfFWitc2KHVQs2Tyku65bsa +3WnyRkRBW92UBdzM6aEjFeqzzDQaBezHT8DkKjj7NFsxI+lKuopInJWs1SckMmcT +yWat5d7hDTiNwObjaD9vsKH4/k11ftksBmmxvd+F/AIL1f4leU5hBGcfmoHyjyBU +FQlbOimj/YsGHB09ClH1/avqBqoHEVMzK61o7aZstDKSs7RIX2Iip1erhgC8YN8C +dkFM6g== +-----END CERTIFICATE----- diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/testdata/certs/server_key.pem b/NodeRed/NodeRedFiles/pika-0.13.1/testdata/certs/server_key.pem new file mode 100644 index 000000000..b65df5094 --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/testdata/certs/server_key.pem @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEpAIBAAKCAQEA14xcFsbLbhw2qunzyhzBXQs5xxi+DQKqK9CjVVEmBrUVR2qw +zS2P3IFdkVzegRa9jZgsgVSITrbsCgF2xkTy0Bsz5sbasaFVQQHDI8PjZ82vmK5M +AXyUzR3HQ4iBzyNIpmSNhKHKqWQuXhqN/D1wgkl08/B0xlx+jaFDIy+hdbuLpB5+ +NXgHbKWqYq1jrKomnZucKbm7dahXvbomshF6fe6xWNU4CxCaC7+snym3Zug6kkXS +gI5NEYQzh93RjTXbV8m4q8Az8nwWZ3vWcIdtcYURHZ+wP/DdGQmObItZjVrTmQ6O +I9750MCtGfDXv+IX/Iipcp7W0OYkNPPPJCowMwIDAQABAoIBAEgT1Ht9UGtqndE7 +WF1ejj5p0ZFFMdAx8uuh4exWrWuSxCHUiHij4rZuv/Yq4vCxxQMDPuakeMwxmO6j +nK8iQTvbzNg/6MN7WoHZcAKWr4V3n19j8WCR40RPz+FCVX4Jo3KYr0YJwDYynNq0 +8IPHm8bFf4lPAA2QwnTj1wp+E/TE+/48c+p5YiVpZZSv9LNvErUtWSXO7atbKA0+ +IlmfipdzC+u+8NW9a9CX5uM5UB05TLydsbnpwCsxptuPJqIuOO3oI6ByL6QJsqU1 +mk7/s5Vofb4JJna1xgo1NigsQBJf2NQCDDi5C0D6tnBPnZGBPp1QWbUp6xnzSEd8 +BMqxXQkCgYEA8RMCAX7Ol6akHSxZZDnDSyxHAdgERhwsSLBBqAUjn4iOEaP+KIjY +qElqT+vJSiHls1O0vKySotNH0UbOg6CmogRSat7CoOCzS0J+XLjqmPh+4VGdTU7q +/UKV60YzJA/LZBdZF/dNByN5lKEQVMxQRHglwvRM/kK5NXvyFONCWvcCgYEA5OTE +2c3hlRMq7XSAoNj3NarrazexeCxTcvuwdDYzHMWsp4YUpnvrUacAhoTbzYfPv9Gh +ujb0bubZRAUcOMzPk3V+UXk8g2ziZy/f2FqLx6Uq7Fp9YwZfuzplScUpVAfA24zv +qvcowaBA1FVvSMC45kJo3o5B9LuQuZAbOZvMKaUCgYEApyq8GFdbYNOgN86aCiL3 +5nfEoWWuyQMePiVi0eUGZ8jkYx0pz+fc/Q0zmEnzYeGRi8F+sdqlMB18ToVgDOxo +wC5pDEx9/9rw2T45q4havUqLiSj0ADi6QHZcyTH7ooUFT9nU4QaOtmWGGGd7kKHB +A0mhPcf0X9fa4FibbJqOV88CgYEAjQ01CYtH0hfnwkCi63wIizfyrzW41XdrTVYw +nMyxnq9qACouG5INp1mkh0DkOrnQmkJSyXAIHTeA99u2UoJUAGjNGOP/GHZG5pOn ++6mArdzooJH65sUMxVHtDRLErxXAEQu+vbplkTxx9udXFpw81Rhji5JarrfPLarS +PCP4IkkCgYBDHG+sNpdPridbD9paTFg53sG0zu0Yv66vubFJvWJSxMNHsTJsyaZv +R5K+VTL4+l/4WkbJRk8pR4SWtETCsPSXxUgnoJ99GtDSxX2J+LmzkiyR5N8k14st +6rtIxC259xAEYYAsu0pXly33pMlZUr2aIGykQOSnMIhwdE1PvWkSmg== +-----END RSA PRIVATE KEY----- diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/testdata/rabbitmq.conf.in b/NodeRed/NodeRedFiles/pika-0.13.1/testdata/rabbitmq.conf.in new file mode 100644 index 000000000..fb6e64afb --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/testdata/rabbitmq.conf.in @@ -0,0 +1,13 @@ +listeners.tcp.default = 5672 +listeners.ssl.default = 5671 +num_acceptors.tcp = 10 +num_acceptors.ssl = 10 +reverse_dns_lookups = false +loopback_users.guest = true +ssl_options.verify = verify_peer +ssl_options.fail_if_no_peer_cert = true +ssl_options.cacertfile = PIKA_DIR/testdata/certs/ca_certificate.pem +ssl_options.certfile = PIKA_DIR/testdata/certs/server_certificate.pem +ssl_options.keyfile = PIKA_DIR/testdata/certs/server_key.pem +log.console = false +log.console.level = debug diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/testdata/wait-epmd.ps1 b/NodeRed/NodeRedFiles/pika-0.13.1/testdata/wait-epmd.ps1 new file mode 100644 index 000000000..8971914c8 --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/testdata/wait-epmd.ps1 @@ -0,0 +1,21 @@ +$running = $false +[int]$count = 1 + +$epmd = [System.IO.Path]::Combine($env:ERLANG_HOME, $env:erlang_erts_version, "bin", "epmd.exe") + +Do { + $running = & $epmd -names | Select-String -CaseSensitive -SimpleMatch -Quiet -Pattern 'name rabbit at port 25672' + if ($running -eq $true) { + Write-Host '[INFO] epmd reports that RabbitMQ is at port 25672' + break + } + + if ($count -gt 120) { + throw '[ERROR] too many tries waiting for epmd to report RabbitMQ on port 25672' + } + + Write-Host "[INFO] epmd NOT reporting yet that RabbitMQ is at port 25672, count: $count" + $count = $count + 1 + Start-Sleep -Seconds 5 + +} While ($true) diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/testdata/wait-rabbitmq.ps1 b/NodeRed/NodeRedFiles/pika-0.13.1/testdata/wait-rabbitmq.ps1 new file mode 100644 index 000000000..1f602c307 --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/testdata/wait-rabbitmq.ps1 @@ -0,0 +1,21 @@ +[int]$count = 1 + +Do { + $proc_id = (Get-Process -Name erl).Id + if (-Not ($proc_id -is [array])) { + & "C:\Program Files\RabbitMQ Server\rabbitmq_server-$env:rabbitmq_version\sbin\rabbitmqctl.bat" wait -t 300000 -P $proc_id + if ($LASTEXITCODE -ne 0) { + throw "[ERROR] rabbitmqctl wait returned error: $LASTEXITCODE" + } + break + } + + if ($count -gt 120) { + throw '[ERROR] too many tries waiting for just one erl process to be running' + } + + Write-Host '[INFO] multiple erl instances running still' + $count = $count + 1 + Start-Sleep -Seconds 5 + +} While ($true) diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/tests/acceptance/async_adapter_tests.py b/NodeRed/NodeRedFiles/pika-0.13.1/tests/acceptance/async_adapter_tests.py new file mode 100644 index 000000000..b9946e10b --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/tests/acceptance/async_adapter_tests.py @@ -0,0 +1,587 @@ +# Suppress pylint messages concerning missing class and method docstrings +# pylint: disable=C0111 + +# Suppress pylint warning about attribute defined outside __init__ +# pylint: disable=W0201 + +# Suppress pylint warning about access to protected member +# pylint: disable=W0212 + +# Suppress pylint warning about unused argument +# pylint: disable=W0613 + +import functools +import threading +import time +import uuid + +from pika import spec +from pika.compat import as_bytes +import pika.connection +import pika.frame +import pika.spec + +from async_test_base import (AsyncTestCase, BoundQueueTestCase, AsyncAdapters) + + +class TestA_Connect(AsyncTestCase, AsyncAdapters): # pylint: disable=C0103 + DESCRIPTION = "Connect, open channel and disconnect" + + def begin(self, channel): + self.stop() + + +class TestConfirmSelect(AsyncTestCase, AsyncAdapters): + DESCRIPTION = "Receive confirmation of Confirm.Select" + + def begin(self, channel): + channel._on_selectok = self.on_complete + channel.confirm_delivery() + + def on_complete(self, frame): + self.assertIsInstance(frame.method, spec.Confirm.SelectOk) + self.stop() + + +class TestBlockingNonBlockingBlockingRPCWontStall(AsyncTestCase, AsyncAdapters): + DESCRIPTION = ("Verify that a sequence of blocking, non-blocking, blocking " + "RPC requests won't stall") + + def begin(self, channel): + # Queue declaration params table: queue name, nowait value + self._expected_queue_params = ( + ("blocking-non-blocking-stall-check-" + uuid.uuid1().hex, False), + ("blocking-non-blocking-stall-check-" + uuid.uuid1().hex, True), + ("blocking-non-blocking-stall-check-" + uuid.uuid1().hex, False) + ) + + self._declared_queue_names = [] + + for queue, nowait in self._expected_queue_params: + channel.queue_declare(callback=self._queue_declare_ok_cb + if not nowait else None, + queue=queue, + auto_delete=True, + nowait=nowait, + arguments={'x-expires': self.TIMEOUT * 1000}) + + def _queue_declare_ok_cb(self, declare_ok_frame): + self._declared_queue_names.append(declare_ok_frame.method.queue) + + if len(self._declared_queue_names) == 2: + # Initiate check for creation of queue declared with nowait=True + self.channel.queue_declare(callback=self._queue_declare_ok_cb, + queue=self._expected_queue_params[1][0], + passive=True, + nowait=False) + elif len(self._declared_queue_names) == 3: + self.assertSequenceEqual( + sorted(self._declared_queue_names), + sorted(item[0] for item in self._expected_queue_params)) + self.stop() + + +class TestConsumeCancel(AsyncTestCase, AsyncAdapters): + DESCRIPTION = "Consume and cancel" + + def begin(self, channel): + self.queue_name = self.__class__.__name__ + ':' + uuid.uuid1().hex + channel.queue_declare(self.on_queue_declared, queue=self.queue_name) + + def on_queue_declared(self, frame): + for i in range(0, 100): + msg_body = '{}:{}:{}'.format(self.__class__.__name__, i, + time.time()) + self.channel.basic_publish('', self.queue_name, msg_body) + self.ctag = self.channel.basic_consume(self.on_message, + queue=self.queue_name, + no_ack=True) + + def on_message(self, _channel, _frame, _header, body): + self.channel.basic_cancel(self.on_cancel, self.ctag) + + def on_cancel(self, _frame): + self.channel.queue_delete(self.on_deleted, self.queue_name) + + def on_deleted(self, _frame): + self.stop() + + +class TestExchangeDeclareAndDelete(AsyncTestCase, AsyncAdapters): + DESCRIPTION = "Create and delete and exchange" + + X_TYPE = 'direct' + + def begin(self, channel): + self.name = self.__class__.__name__ + ':' + uuid.uuid1().hex + channel.exchange_declare(self.on_exchange_declared, self.name, + exchange_type=self.X_TYPE, + passive=False, + durable=False, + auto_delete=True) + + def on_exchange_declared(self, frame): + self.assertIsInstance(frame.method, spec.Exchange.DeclareOk) + self.channel.exchange_delete(self.on_exchange_delete, self.name) + + def on_exchange_delete(self, frame): + self.assertIsInstance(frame.method, spec.Exchange.DeleteOk) + self.stop() + + +class TestExchangeRedeclareWithDifferentValues(AsyncTestCase, AsyncAdapters): + DESCRIPTION = "should close chan: re-declared exchange w/ diff params" + + X_TYPE1 = 'direct' + X_TYPE2 = 'topic' + + def begin(self, channel): + self.name = self.__class__.__name__ + ':' + uuid.uuid1().hex + self.channel.add_on_close_callback(self.on_channel_closed) + channel.exchange_declare(self.on_exchange_declared, self.name, + exchange_type=self.X_TYPE1, + passive=False, + durable=False, + auto_delete=True) + + def on_cleanup_channel(self, channel): + channel.exchange_delete(None, self.name, nowait=True) + self.stop() + + def on_channel_closed(self, channel, reply_code, reply_text): + self.connection.channel(self.on_cleanup_channel) + + def on_exchange_declared(self, frame): + self.channel.exchange_declare(self.on_bad_result, self.name, + exchange_type=self.X_TYPE2, + passive=False, + durable=False, + auto_delete=True) + + def on_bad_result(self, frame): + self.channel.exchange_delete(None, self.name, nowait=True) + raise AssertionError("Should not have received a Queue.DeclareOk") + + +class TestQueueDeclareAndDelete(AsyncTestCase, AsyncAdapters): + DESCRIPTION = "Create and delete a queue" + + def begin(self, channel): + channel.queue_declare(self.on_queue_declared, + passive=False, + durable=False, + exclusive=True, + auto_delete=False, + nowait=False, + arguments={'x-expires': self.TIMEOUT * 1000}) + + def on_queue_declared(self, frame): + self.assertIsInstance(frame.method, spec.Queue.DeclareOk) + self.channel.queue_delete(self.on_queue_delete, frame.method.queue) + + def on_queue_delete(self, frame): + self.assertIsInstance(frame.method, spec.Queue.DeleteOk) + self.stop() + + + +class TestQueueNameDeclareAndDelete(AsyncTestCase, AsyncAdapters): + DESCRIPTION = "Create and delete a named queue" + + def begin(self, channel): + self._q_name = self.__class__.__name__ + ':' + uuid.uuid1().hex + channel.queue_declare(self.on_queue_declared, self._q_name, + passive=False, + durable=False, + exclusive=True, + auto_delete=True, + nowait=False, + arguments={'x-expires': self.TIMEOUT * 1000}) + + def on_queue_declared(self, frame): + self.assertIsInstance(frame.method, spec.Queue.DeclareOk) + # Frame's method's queue is encoded (impl detail) + self.assertEqual(frame.method.queue, self._q_name) + self.channel.queue_delete(self.on_queue_delete, frame.method.queue) + + def on_queue_delete(self, frame): + self.assertIsInstance(frame.method, spec.Queue.DeleteOk) + self.stop() + + + +class TestQueueRedeclareWithDifferentValues(AsyncTestCase, AsyncAdapters): + DESCRIPTION = "Should close chan: re-declared queue w/ diff params" + + def begin(self, channel): + self._q_name = self.__class__.__name__ + ':' + uuid.uuid1().hex + self.channel.add_on_close_callback(self.on_channel_closed) + channel.queue_declare(self.on_queue_declared, self._q_name, + passive=False, + durable=False, + exclusive=True, + auto_delete=True, + nowait=False, + arguments={'x-expires': self.TIMEOUT * 1000}) + + def on_channel_closed(self, channel, reply_code, reply_text): + self.stop() + + def on_queue_declared(self, frame): + self.channel.queue_declare(self.on_bad_result, self._q_name, + passive=False, + durable=True, + exclusive=False, + auto_delete=True, + nowait=False, + arguments={'x-expires': self.TIMEOUT * 1000}) + + def on_bad_result(self, frame): + self.channel.queue_delete(None, self._q_name, nowait=True) + raise AssertionError("Should not have received a Queue.DeclareOk") + + + +class TestTX1_Select(AsyncTestCase, AsyncAdapters): # pylint: disable=C0103 + DESCRIPTION = "Receive confirmation of Tx.Select" + + def begin(self, channel): + channel.tx_select(self.on_complete) + + def on_complete(self, frame): + self.assertIsInstance(frame.method, spec.Tx.SelectOk) + self.stop() + + + +class TestTX2_Commit(AsyncTestCase, AsyncAdapters): # pylint: disable=C0103 + DESCRIPTION = "Start a transaction, and commit it" + + def begin(self, channel): + channel.tx_select(self.on_selectok) + + def on_selectok(self, frame): + self.assertIsInstance(frame.method, spec.Tx.SelectOk) + self.channel.tx_commit(self.on_commitok) + + def on_commitok(self, frame): + self.assertIsInstance(frame.method, spec.Tx.CommitOk) + self.stop() + + +class TestTX2_CommitFailure(AsyncTestCase, AsyncAdapters): # pylint: disable=C0103 + DESCRIPTION = "Close the channel: commit without a TX" + + def begin(self, channel): + self.channel.add_on_close_callback(self.on_channel_closed) + self.channel.tx_commit(self.on_commitok) + + def on_channel_closed(self, channel, reply_code, reply_text): + self.stop() + + def on_selectok(self, frame): + self.assertIsInstance(frame.method, spec.Tx.SelectOk) + + @staticmethod + def on_commitok(frame): + raise AssertionError("Should not have received a Tx.CommitOk") + + +class TestTX3_Rollback(AsyncTestCase, AsyncAdapters): # pylint: disable=C0103 + DESCRIPTION = "Start a transaction, then rollback" + + def begin(self, channel): + channel.tx_select(self.on_selectok) + + def on_selectok(self, frame): + self.assertIsInstance(frame.method, spec.Tx.SelectOk) + self.channel.tx_rollback(self.on_rollbackok) + + def on_rollbackok(self, frame): + self.assertIsInstance(frame.method, spec.Tx.RollbackOk) + self.stop() + + + +class TestTX3_RollbackFailure(AsyncTestCase, AsyncAdapters): # pylint: disable=C0103 + DESCRIPTION = "Close the channel: rollback without a TX" + + def begin(self, channel): + self.channel.add_on_close_callback(self.on_channel_closed) + self.channel.tx_rollback(self.on_commitok) + + def on_channel_closed(self, channel, reply_code, reply_text): + self.stop() + + @staticmethod + def on_commitok(frame): + raise AssertionError("Should not have received a Tx.RollbackOk") + + +class TestZ_PublishAndConsume(BoundQueueTestCase, AsyncAdapters): # pylint: disable=C0103 + DESCRIPTION = "Publish a message and consume it" + + def on_ready(self, frame): + self.ctag = self.channel.basic_consume(self.on_message, self.queue) + self.msg_body = "%s: %i" % (self.__class__.__name__, time.time()) + self.channel.basic_publish(self.exchange, self.routing_key, + self.msg_body) + + def on_cancelled(self, frame): + self.assertIsInstance(frame.method, spec.Basic.CancelOk) + self.stop() + + def on_message(self, channel, method, header, body): + self.assertIsInstance(method, spec.Basic.Deliver) + self.assertEqual(body, as_bytes(self.msg_body)) + self.channel.basic_ack(method.delivery_tag) + self.channel.basic_cancel(self.on_cancelled, self.ctag) + + + +class TestZ_PublishAndConsumeBig(BoundQueueTestCase, AsyncAdapters): # pylint: disable=C0103 + DESCRIPTION = "Publish a big message and consume it" + + @staticmethod + def _get_msg_body(): + return '\n'.join(["%s" % i for i in range(0, 2097152)]) + + def on_ready(self, frame): + self.ctag = self.channel.basic_consume(self.on_message, self.queue) + self.msg_body = self._get_msg_body() + self.channel.basic_publish(self.exchange, self.routing_key, + self.msg_body) + + def on_cancelled(self, frame): + self.assertIsInstance(frame.method, spec.Basic.CancelOk) + self.stop() + + def on_message(self, channel, method, header, body): + self.assertIsInstance(method, spec.Basic.Deliver) + self.assertEqual(body, as_bytes(self.msg_body)) + self.channel.basic_ack(method.delivery_tag) + self.channel.basic_cancel(self.on_cancelled, self.ctag) + + +class TestZ_PublishAndGet(BoundQueueTestCase, AsyncAdapters): # pylint: disable=C0103 + DESCRIPTION = "Publish a message and get it" + + def on_ready(self, frame): + self.msg_body = "%s: %i" % (self.__class__.__name__, time.time()) + self.channel.basic_publish(self.exchange, self.routing_key, + self.msg_body) + self.channel.basic_get(self.on_get, self.queue) + + def on_get(self, channel, method, header, body): + self.assertIsInstance(method, spec.Basic.GetOk) + self.assertEqual(body, as_bytes(self.msg_body)) + self.channel.basic_ack(method.delivery_tag) + self.stop() + + +class TestZ_AccessDenied(AsyncTestCase, AsyncAdapters): # pylint: disable=C0103 + DESCRIPTION = "Verify that access denied invokes on open error callback" + + def start(self, *args, **kwargs): + self.parameters.virtual_host = str(uuid.uuid4()) + self.error_captured = False + super(TestZ_AccessDenied, self).start(*args, **kwargs) + self.assertTrue(self.error_captured) + + def on_open_error(self, connection, error): + self.error_captured = True + self.stop() + + def on_open(self, connection): + super(TestZ_AccessDenied, self).on_open(connection) + self.stop() + + +class TestBlockedConnectionTimesOut(AsyncTestCase, AsyncAdapters): # pylint: disable=C0103 + DESCRIPTION = "Verify that blocked connection terminates on timeout" + + def start(self, *args, **kwargs): + self.parameters.blocked_connection_timeout = 0.001 + self.on_closed_pair = None + super(TestBlockedConnectionTimesOut, self).start(*args, **kwargs) + self.assertEqual( + self.on_closed_pair, + (pika.connection.InternalCloseReasons.BLOCKED_CONNECTION_TIMEOUT, + 'Blocked connection timeout expired')) + + def begin(self, channel): + + # Simulate Connection.Blocked + channel.connection._on_connection_blocked(pika.frame.Method( + 0, + pika.spec.Connection.Blocked('Testing blocked connection timeout'))) + + def on_closed(self, connection, reply_code, reply_text): + """called when the connection has finished closing""" + self.on_closed_pair = (reply_code, reply_text) + super(TestBlockedConnectionTimesOut, self).on_closed(connection, + reply_code, + reply_text) + + +class TestBlockedConnectionUnblocks(AsyncTestCase, AsyncAdapters): # pylint: disable=C0103 + DESCRIPTION = "Verify that blocked-unblocked connection closes normally" + + def start(self, *args, **kwargs): + self.parameters.blocked_connection_timeout = 0.001 + self.on_closed_pair = None + super(TestBlockedConnectionUnblocks, self).start(*args, **kwargs) + self.assertEqual( + self.on_closed_pair, + (200, 'Normal shutdown')) + + def begin(self, channel): + + # Simulate Connection.Blocked + channel.connection._on_connection_blocked(pika.frame.Method( + 0, + pika.spec.Connection.Blocked( + 'Testing blocked connection unblocks'))) + + # Simulate Connection.Unblocked + channel.connection._on_connection_unblocked(pika.frame.Method( + 0, + pika.spec.Connection.Unblocked())) + + # Schedule shutdown after blocked connection timeout would expire + channel.connection.add_timeout(0.005, self.on_cleanup_timer) + + def on_cleanup_timer(self): + self.stop() + + def on_closed(self, connection, reply_code, reply_text): + """called when the connection has finished closing""" + self.on_closed_pair = (reply_code, reply_text) + super(TestBlockedConnectionUnblocks, self).on_closed(connection, + reply_code, + reply_text) + + +class TestAddCallbackThreadsafeRequestBeforeIOLoopStarts(AsyncTestCase, AsyncAdapters): + DESCRIPTION = "Test add_callback_threadsafe request before ioloop starts." + + def _run_ioloop(self, *args, **kwargs): # pylint: disable=W0221 + """We intercept this method from AsyncTestCase in order to call + add_callback_threadsafe before AsyncTestCase starts the ioloop. + + """ + self.my_start_time = time.time() + # Request a callback from our current (ioloop's) thread + self.connection.add_callback_threadsafe(self.on_requested_callback) + + return super( + TestAddCallbackThreadsafeRequestBeforeIOLoopStarts, self)._run_ioloop( + *args, **kwargs) + + def start(self, *args, **kwargs): # pylint: disable=W0221 + self.loop_thread_ident = threading.current_thread().ident + self.my_start_time = None + self.got_callback = False + super(TestAddCallbackThreadsafeRequestBeforeIOLoopStarts, self).start(*args, **kwargs) + self.assertTrue(self.got_callback) + + def begin(self, channel): + self.stop() + + def on_requested_callback(self): + self.assertEqual(threading.current_thread().ident, + self.loop_thread_ident) + self.assertLess(time.time() - self.my_start_time, 0.25) + self.got_callback = True + + +class TestAddCallbackThreadsafeFromIOLoopThread(AsyncTestCase, AsyncAdapters): + DESCRIPTION = "Test add_callback_threadsafe request from same thread." + + def start(self, *args, **kwargs): + self.loop_thread_ident = threading.current_thread().ident + self.my_start_time = None + self.got_callback = False + super(TestAddCallbackThreadsafeFromIOLoopThread, self).start(*args, **kwargs) + self.assertTrue(self.got_callback) + + def begin(self, channel): + self.my_start_time = time.time() + # Request a callback from our current (ioloop's) thread + channel.connection.add_callback_threadsafe(self.on_requested_callback) + + def on_requested_callback(self): + self.assertEqual(threading.current_thread().ident, + self.loop_thread_ident) + self.assertLess(time.time() - self.my_start_time, 0.25) + self.got_callback = True + self.stop() + + +class TestAddCallbackThreadsafeFromAnotherThread(AsyncTestCase, AsyncAdapters): + DESCRIPTION = "Test add_callback_threadsafe request from another thread." + + def start(self, *args, **kwargs): + self.loop_thread_ident = threading.current_thread().ident + self.my_start_time = None + self.got_callback = False + super(TestAddCallbackThreadsafeFromAnotherThread, self).start(*args, **kwargs) + self.assertTrue(self.got_callback) + + def begin(self, channel): + self.my_start_time = time.time() + # Request a callback from ioloop while executing in another thread + timer = threading.Timer( + 0, + lambda: channel.connection.add_callback_threadsafe( + self.on_requested_callback)) + self.addCleanup(timer.cancel) + timer.start() + + def on_requested_callback(self): + self.assertEqual(threading.current_thread().ident, + self.loop_thread_ident) + self.assertLess(time.time() - self.my_start_time, 0.25) + self.got_callback = True + self.stop() + + +class TestIOLoopStopBeforeIOLoopStarts(AsyncTestCase, AsyncAdapters): + DESCRIPTION = "Test ioloop.stop() before ioloop starts causes ioloop to exit quickly." + + def _run_ioloop(self, *args, **kwargs): # pylint: disable=W0221 + """We intercept this method from AsyncTestCase in order to call + ioloop.stop() before AsyncTestCase starts the ioloop. + """ + # Request ioloop to stop before it starts + self.my_start_time = time.time() + self.stop_ioloop_only() + + return super( + TestIOLoopStopBeforeIOLoopStarts, self)._run_ioloop(*args, **kwargs) + + def start(self, *args, **kwargs): # pylint: disable=W0221 + self.loop_thread_ident = threading.current_thread().ident + self.my_start_time = None + super(TestIOLoopStopBeforeIOLoopStarts, self).start(*args, **kwargs) + self.assertLess(time.time() - self.my_start_time, 0.25) + + def begin(self, channel): + pass + + +class TestViabilityOfMultipleTimeoutsWithSameDeadlineAndCallback(AsyncTestCase, AsyncAdapters): # pylint: disable=C0103 + DESCRIPTION = "Test viability of multiple timeouts with same deadline and callback" + + def begin(self, channel): + timer1 = channel.connection.add_timeout(0, self.on_my_timer) + timer2 = channel.connection.add_timeout(0, self.on_my_timer) + + self.assertIsNot(timer1, timer2) + + channel.connection.remove_timeout(timer1) + + # Wait for timer2 to fire + + def on_my_timer(self): + self.stop() diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/tests/acceptance/async_test_base.py b/NodeRed/NodeRedFiles/pika-0.13.1/tests/acceptance/async_test_base.py new file mode 100644 index 000000000..bbe8ec63f --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/tests/acceptance/async_test_base.py @@ -0,0 +1,247 @@ +# Suppress pylint warnings concerning attribute defined outside __init__ +# pylint: disable=W0201 + +# Suppress pylint messages concerning missing docstrings +# pylint: disable=C0111 + +import datetime +import os +import select +import ssl +import sys +import logging +import unittest +import uuid + +try: + from unittest import mock +except ImportError: + import mock + + +import pika +from pika import adapters +from pika.adapters import select_connection + + +def enable_tls(): + if 'PIKA_TEST_TLS' in os.environ and \ + os.environ['PIKA_TEST_TLS'].lower() == 'true': + return True + return False + + +class AsyncTestCase(unittest.TestCase): + DESCRIPTION = "" + ADAPTER = None + TIMEOUT = 15 + + def setUp(self): + self.logger = logging.getLogger(self.__class__.__name__) + if enable_tls(): + self.logger.info('testing using TLS/SSL connection to port 5671') + url = 'amqps://localhost:5671/%2F?ssl_options=%7B%27ca_certs%27%3A%27testdata%2Fcerts%2Fca_certificate.pem%27%2C%27keyfile%27%3A%27testdata%2Fcerts%2Fclient_key.pem%27%2C%27certfile%27%3A%27testdata%2Fcerts%2Fclient_certificate.pem%27%7D' + self.parameters = pika.URLParameters(url) + else: + self.parameters = pika.ConnectionParameters(host='localhost', port=5672) + self._timed_out = False + super(AsyncTestCase, self).setUp() + + def tearDown(self): + self._stop() + + def shortDescription(self): + method_desc = super(AsyncTestCase, self).shortDescription() + if self.DESCRIPTION: + return "%s (%s)" % (self.DESCRIPTION, method_desc) + else: + return method_desc + + def begin(self, channel): # pylint: disable=R0201,W0613 + """Extend to start the actual tests on the channel""" + self.fail("AsyncTestCase.begin_test not extended") + + def start(self, adapter, ioloop_factory): + self.logger.info('start at %s', datetime.datetime.utcnow()) + self.adapter = adapter or self.ADAPTER + + self.connection = self.adapter(self.parameters, + self.on_open, + self.on_open_error, + self.on_closed, + custom_ioloop=ioloop_factory()) + try: + self.timeout = self.connection.add_timeout(self.TIMEOUT, + self.on_timeout) + self._run_ioloop() + self.assertFalse(self._timed_out) + finally: + self.connection.ioloop.close() + self.connection = None + + def stop_ioloop_only(self): + """Request stopping of the connection's ioloop to end the test without + closing the connection + """ + self._safe_remove_test_timeout() + self.connection.ioloop.stop() + + def stop(self): + """close the connection and stop the ioloop""" + self.logger.info("Stopping test") + self._safe_remove_test_timeout() + self.connection.close() # NOTE: on_closed() will stop the ioloop + + def _run_ioloop(self): + """Some tests need to subclass this in order to bootstrap their test + logic after we instantiate the connection and assign it to + `self.connection`, but before we run the ioloop + """ + self.connection.ioloop.start() + + def _safe_remove_test_timeout(self): + if hasattr(self, 'timeout') and self.timeout is not None: + self.logger.info("Removing timeout") + if hasattr(self, 'connection') and self.connection is not None: + self.connection.remove_timeout(self.timeout) + self.timeout = None + + def _stop(self): + self._safe_remove_test_timeout() + if hasattr(self, 'connection') and self.connection is not None: + self.logger.info("Stopping ioloop") + self.connection.ioloop.stop() + + def on_closed(self, connection, reply_code, reply_text): + """called when the connection has finished closing""" + self.logger.info('on_closed: %r %r %r', connection, + reply_code, reply_text) + self._stop() + + def on_open(self, connection): + self.logger.debug('on_open: %r', connection) + self.channel = connection.channel(self.begin) + + def on_open_error(self, connection, error): + self.logger.error('on_open_error: %r %r', connection, error) + connection.ioloop.stop() + raise AssertionError('Error connecting to RabbitMQ') + + def on_timeout(self): + """called when stuck waiting for connection to close""" + self.logger.error('%s timed out; on_timeout called at %s', + self, datetime.datetime.utcnow()) + self.timeout = None # the dispatcher should have removed it + self._timed_out = True + # initiate cleanup + self.stop() + + +class BoundQueueTestCase(AsyncTestCase): + + def start(self, adapter, ioloop_factory): + # PY3 compat encoding + self.exchange = 'e-' + self.__class__.__name__ + ':' + uuid.uuid1().hex + self.queue = 'q-' + self.__class__.__name__ + ':' + uuid.uuid1().hex + self.routing_key = self.__class__.__name__ + super(BoundQueueTestCase, self).start(adapter, ioloop_factory) + + def begin(self, channel): + self.channel.exchange_declare(self.on_exchange_declared, self.exchange, + exchange_type='direct', + passive=False, + durable=False, + auto_delete=True) + + def on_exchange_declared(self, frame): # pylint: disable=W0613 + self.channel.queue_declare(self.on_queue_declared, self.queue, + passive=False, + durable=False, + exclusive=True, + auto_delete=True, + nowait=False, + arguments={'x-expires': self.TIMEOUT * 1000}) + + def on_queue_declared(self, frame): # pylint: disable=W0613 + self.channel.queue_bind(self.on_ready, self.queue, self.exchange, + self.routing_key) + + def on_ready(self, frame): + raise NotImplementedError + + +# +# In order to write test cases that will tested using all the Async Adapters +# write a class that inherits both from one of TestCase classes above and +# from the AsyncAdapters class below. This allows you to avoid duplicating the +# test methods for each adapter in each test class. +# + +class AsyncAdapters(object): + + def start(self, adapter_class, ioloop_factory): + """ + + :param adapter_class: pika connection adapter class to test. + :param ioloop_factory: to be called without args to instantiate a + non-shared ioloop to be passed as the `custom_ioloop` arg to the + `adapter_class` constructor. This is needed because some of the + adapters default to using a singleton ioloop, which results in + tests errors after prior tests close the ioloop to release resources, + in order to eliminate ResourceWarning warnings concerning unclosed + sockets from our adapters. + :return: + """ + raise NotImplementedError + + def select_default_test(self): + """SelectConnection:DefaultPoller""" + with mock.patch.multiple(select_connection, SELECT_TYPE=None): + self.start(adapters.SelectConnection, select_connection.IOLoop) + + def select_select_test(self): + """SelectConnection:select""" + + with mock.patch.multiple(select_connection, SELECT_TYPE='select'): + self.start(adapters.SelectConnection, select_connection.IOLoop) + + @unittest.skipIf( + not hasattr(select, 'poll') or + not hasattr(select.poll(), 'modify'), "poll not supported") # pylint: disable=E1101 + def select_poll_test(self): + """SelectConnection:poll""" + + with mock.patch.multiple(select_connection, SELECT_TYPE='poll'): + self.start(adapters.SelectConnection, select_connection.IOLoop) + + @unittest.skipIf(not hasattr(select, 'epoll'), "epoll not supported") + def select_epoll_test(self): + """SelectConnection:epoll""" + + with mock.patch.multiple(select_connection, SELECT_TYPE='epoll'): + self.start(adapters.SelectConnection, select_connection.IOLoop) + + @unittest.skipIf(not hasattr(select, 'kqueue'), "kqueue not supported") + def select_kqueue_test(self): + """SelectConnection:kqueue""" + + with mock.patch.multiple(select_connection, SELECT_TYPE='kqueue'): + self.start(adapters.SelectConnection, select_connection.IOLoop) + + def tornado_test(self): + """TornadoConnection""" + ioloop_factory = None + if adapters.tornado_connection.TornadoConnection is not None: + import tornado.ioloop + ioloop_factory = tornado.ioloop.IOLoop + self.start(adapters.tornado_connection.TornadoConnection, ioloop_factory) + + @unittest.skipIf(sys.version_info < (3, 4), "Asyncio available for Python 3.4+") + def asyncio_test(self): + """AsyncioConnection""" + ioloop_factory = None + if adapters.asyncio_connection.AsyncioConnection is not None: + import asyncio + ioloop_factory = asyncio.new_event_loop + + self.start(adapters.asyncio_connection.AsyncioConnection, ioloop_factory) diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/tests/acceptance/blocking_adapter_test.py b/NodeRed/NodeRedFiles/pika-0.13.1/tests/acceptance/blocking_adapter_test.py new file mode 100644 index 000000000..749e812ce --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/tests/acceptance/blocking_adapter_test.py @@ -0,0 +1,2791 @@ +"""blocking adapter test""" +from datetime import datetime +import functools +import logging +import socket +import threading +import time +import unittest +import uuid + +from forward_server import ForwardServer +from test_utils import retry_assertion + +import pika +from pika.adapters import blocking_connection +from pika.compat import as_bytes +import pika.connection +import pika.exceptions + +# Disable warning about access to protected member +# pylint: disable=W0212 + +# Disable warning Attribute defined outside __init__ +# pylint: disable=W0201 + +# Disable warning Missing docstring +# pylint: disable=C0111 + +# Disable warning Too many public methods +# pylint: disable=R0904 + +# Disable warning Invalid variable name +# pylint: disable=C0103 + + +LOGGER = logging.getLogger(__name__) + +PARAMS_URL_TEMPLATE = ( + 'amqp://guest:guest@127.0.0.1:%(port)s/%%2f?socket_timeout=1') +DEFAULT_URL = PARAMS_URL_TEMPLATE % {'port': 5672} +DEFAULT_PARAMS = pika.URLParameters(DEFAULT_URL) +DEFAULT_TIMEOUT = 15 + + + +def setUpModule(): + logging.basicConfig(level=logging.DEBUG) + + +class BlockingTestCaseBase(unittest.TestCase): + + TIMEOUT = DEFAULT_TIMEOUT + + def _connect(self, + url=DEFAULT_URL, + connection_class=pika.BlockingConnection, + impl_class=None): + parameters = pika.URLParameters(url) + connection = connection_class(parameters, _impl_class=impl_class) + self.addCleanup(lambda: connection.close() + if connection.is_open else None) + + connection._impl.add_timeout( + self.TIMEOUT, # pylint: disable=E1101 + self._on_test_timeout) + + return connection + + def _on_test_timeout(self): + """Called when test times out""" + LOGGER.info('%s TIMED OUT (%s)', datetime.utcnow(), self) + self.fail('Test timed out') + + @retry_assertion(TIMEOUT/2) + def _assert_exact_message_count_with_retries(self, + channel, + queue, + expected_count): + frame = channel.queue_declare(queue, passive=True) + self.assertEqual(frame.method.message_count, expected_count) + + +class TestCreateAndCloseConnection(BlockingTestCaseBase): + + def test(self): + """BlockingConnection: Create and close connection""" + connection = self._connect() + self.assertIsInstance(connection, pika.BlockingConnection) + self.assertTrue(connection.is_open) + self.assertFalse(connection.is_closed) + self.assertFalse(connection.is_closing) + + connection.close() + self.assertTrue(connection.is_closed) + self.assertFalse(connection.is_open) + self.assertFalse(connection.is_closing) + + +class TestMultiCloseConnection(BlockingTestCaseBase): + + def test(self): + """BlockingConnection: Close connection twice""" + connection = self._connect() + self.assertIsInstance(connection, pika.BlockingConnection) + self.assertTrue(connection.is_open) + self.assertFalse(connection.is_closed) + self.assertFalse(connection.is_closing) + + connection.close() + self.assertTrue(connection.is_closed) + self.assertFalse(connection.is_open) + self.assertFalse(connection.is_closing) + + # Second close call shouldn't crash + connection.close() + + +class TestConnectionContextManagerClosesConnection(BlockingTestCaseBase): + def test(self): + """BlockingConnection: connection context manager closes connection""" + with self._connect() as connection: + self.assertIsInstance(connection, pika.BlockingConnection) + self.assertTrue(connection.is_open) + + self.assertTrue(connection.is_closed) + + +class TestConnectionContextManagerClosesConnectionAndPassesOriginalException(BlockingTestCaseBase): + def test(self): + """BlockingConnection: connection context manager closes connection and passes original exception""" # pylint: disable=C0301 + class MyException(Exception): + pass + + with self.assertRaises(MyException): + with self._connect() as connection: + self.assertTrue(connection.is_open) + + raise MyException() + + self.assertTrue(connection.is_closed) + + +class TestConnectionContextManagerClosesConnectionAndPassesSystemException(BlockingTestCaseBase): + def test(self): + """BlockingConnection: connection context manager closes connection and passes system exception""" # pylint: disable=C0301 + with self.assertRaises(SystemExit): + with self._connect() as connection: + self.assertTrue(connection.is_open) + raise SystemExit() + + self.assertTrue(connection.is_closed) + + +class TestLostConnectionResultsInIsClosedConnectionAndChannel(BlockingTestCaseBase): + def test(self): + connection = self._connect() + channel = connection.channel() + + # Simulate the server dropping the socket connection + connection._impl.socket.shutdown(socket.SHUT_RDWR) + + with self.assertRaises(pika.exceptions.ConnectionClosed): + # Changing QoS should result in ConnectionClosed + channel.basic_qos() + + # Now check is_open/is_closed on channel and connection + self.assertFalse(channel.is_open) + self.assertTrue(channel.is_closed) + self.assertFalse(connection.is_open) + self.assertTrue(connection.is_closed) + + +class TestInvalidExchangeTypeRaisesConnectionClosed(BlockingTestCaseBase): + def test(self): + """BlockingConnection: ConnectionClosed raised when creating exchange with invalid type""" # pylint: disable=C0301 + # This test exploits behavior specific to RabbitMQ whereby the broker + # closes the connection if an attempt is made to declare an exchange + # with an invalid exchange type + connection = self._connect() + ch = connection.channel() + + exg_name = ("TestInvalidExchangeTypeRaisesConnectionClosed_" + + uuid.uuid1().hex) + + with self.assertRaises(pika.exceptions.ConnectionClosed) as ex_cm: + # Attempt to create an exchange with invalid exchange type + ch.exchange_declare(exg_name, exchange_type='ZZwwInvalid') + + self.assertEqual(ex_cm.exception.args[0], 503) + + +class TestCreateAndCloseConnectionWithChannelAndConsumer(BlockingTestCaseBase): + + def test(self): + """BlockingConnection: Create and close connection with channel and consumer""" # pylint: disable=C0301 + connection = self._connect() + + ch = connection.channel() + + q_name = ( + 'TestCreateAndCloseConnectionWithChannelAndConsumer_q' + + uuid.uuid1().hex) + + body1 = 'a' * 1024 + + # Declare a new queue + ch.queue_declare(q_name, auto_delete=True) + self.addCleanup(self._connect().channel().queue_delete, q_name) + + # Publish the message to the queue by way of default exchange + ch.publish(exchange='', routing_key=q_name, body=body1) + + # Create a non-ackable consumer + ch.basic_consume(lambda *x: None, q_name, no_ack=True, + exclusive=False, arguments=None) + + connection.close() + self.assertTrue(connection.is_closed) + self.assertFalse(connection.is_open) + self.assertFalse(connection.is_closing) + + self.assertFalse(connection._impl._channels) + + self.assertFalse(ch._consumer_infos) + self.assertFalse(ch._impl._consumers) + + +class TestSuddenBrokerDisconnectBeforeChannel(BlockingTestCaseBase): + + def test(self): + """BlockingConnection resets properly on TCP/IP drop during channel() + """ + with ForwardServer( + remote_addr=(DEFAULT_PARAMS.host, DEFAULT_PARAMS.port), + local_linger_args=(1, 0)) as fwd: + + self.connection = self._connect( + PARAMS_URL_TEMPLATE % {"port": fwd.server_address[1]}) + + # Once outside the context, the connection is broken + + # BlockingConnection should raise ConnectionClosed + with self.assertRaises(pika.exceptions.ConnectionClosed): + self.connection.channel() + + self.assertTrue(self.connection.is_closed) + self.assertFalse(self.connection.is_open) + self.assertIsNone(self.connection._impl.socket) + + +class TestNoAccessToFileDescriptorAfterConnectionClosed(BlockingTestCaseBase): + + def test(self): + """BlockingConnection no access file descriptor after ConnectionClosed + """ + with ForwardServer( + remote_addr=(DEFAULT_PARAMS.host, DEFAULT_PARAMS.port), + local_linger_args=(1, 0)) as fwd: + + self.connection = self._connect( + PARAMS_URL_TEMPLATE % {"port": fwd.server_address[1]}) + + # Once outside the context, the connection is broken + + # BlockingConnection should raise ConnectionClosed + with self.assertRaises(pika.exceptions.ConnectionClosed): + self.connection.channel() + + self.assertTrue(self.connection.is_closed) + self.assertFalse(self.connection.is_open) + self.assertIsNone(self.connection._impl.socket) + + # Attempt to operate on the connection once again after ConnectionClosed + self.assertIsNone(self.connection._impl.socket) + with self.assertRaises(pika.exceptions.ConnectionClosed): + self.connection.channel() + + +class TestConnectWithDownedBroker(BlockingTestCaseBase): + + def test(self): + """ BlockingConnection to downed broker results in AMQPConnectionError + + """ + # Reserve a port for use in connect + sock = socket.socket() + self.addCleanup(sock.close) + + sock.bind(("127.0.0.1", 0)) + + port = sock.getsockname()[1] + + sock.close() + + with self.assertRaises(pika.exceptions.AMQPConnectionError): + self.connection = self._connect( + PARAMS_URL_TEMPLATE % {"port": port}) + + +class TestDisconnectDuringConnectionStart(BlockingTestCaseBase): + + def test(self): + """ BlockingConnection TCP/IP connection loss in CONNECTION_START + """ + fwd = ForwardServer( + remote_addr=(DEFAULT_PARAMS.host, DEFAULT_PARAMS.port), + local_linger_args=(1, 0)) + + fwd.start() + self.addCleanup(lambda: fwd.stop() if fwd.running else None) + + class MySelectConnection(pika.SelectConnection): + assert hasattr(pika.SelectConnection, '_on_connection_start') + + def _on_connection_start(self, *args, **kwargs): + fwd.stop() + return super(MySelectConnection, self)._on_connection_start( + *args, **kwargs) + + with self.assertRaises(pika.exceptions.ProbableAuthenticationError): + self._connect( + PARAMS_URL_TEMPLATE % {"port": fwd.server_address[1]}, + impl_class=MySelectConnection) + + +class TestDisconnectDuringConnectionTune(BlockingTestCaseBase): + + def test(self): + """ BlockingConnection TCP/IP connection loss in CONNECTION_TUNE + """ + fwd = ForwardServer( + remote_addr=(DEFAULT_PARAMS.host, DEFAULT_PARAMS.port), + local_linger_args=(1, 0)) + fwd.start() + self.addCleanup(lambda: fwd.stop() if fwd.running else None) + + class MySelectConnection(pika.SelectConnection): + assert hasattr(pika.SelectConnection, '_on_connection_tune') + + def _on_connection_tune(self, *args, **kwargs): + fwd.stop() + return super(MySelectConnection, self)._on_connection_tune( + *args, **kwargs) + + with self.assertRaises(pika.exceptions.ProbableAccessDeniedError): + self._connect( + PARAMS_URL_TEMPLATE % {"port": fwd.server_address[1]}, + impl_class=MySelectConnection) + + +class TestDisconnectDuringConnectionProtocol(BlockingTestCaseBase): + + def test(self): + """ BlockingConnection TCP/IP connection loss in CONNECTION_PROTOCOL + """ + fwd = ForwardServer( + remote_addr=(DEFAULT_PARAMS.host, DEFAULT_PARAMS.port), + local_linger_args=(1, 0)) + + fwd.start() + self.addCleanup(lambda: fwd.stop() if fwd.running else None) + + class MySelectConnection(pika.SelectConnection): + assert hasattr(pika.SelectConnection, '_on_connected') + + def _on_connected(self, *args, **kwargs): + fwd.stop() + return super(MySelectConnection, self)._on_connected( + *args, **kwargs) + + with self.assertRaises(pika.exceptions.IncompatibleProtocolError): + self._connect(PARAMS_URL_TEMPLATE % {"port": fwd.server_address[1]}, + impl_class=MySelectConnection) + + +class TestProcessDataEvents(BlockingTestCaseBase): + + def test(self): + """BlockingConnection.process_data_events""" + connection = self._connect() + + # Try with time_limit=0 + start_time = time.time() + connection.process_data_events(time_limit=0) + elapsed = time.time() - start_time + self.assertLess(elapsed, 0.25) + + # Try with time_limit=0.005 + start_time = time.time() + connection.process_data_events(time_limit=0.005) + elapsed = time.time() - start_time + self.assertGreaterEqual(elapsed, 0.005) + self.assertLess(elapsed, 0.25) + + +class TestConnectionRegisterForBlockAndUnblock(BlockingTestCaseBase): + + def test(self): + """BlockingConnection register for Connection.Blocked/Unblocked""" + connection = self._connect() + + # NOTE: I haven't figured out yet how to coerce RabbitMQ to emit + # Connection.Block and Connection.Unblock from the test, so we'll + # just call the registration functions for now, to make sure that + # registration doesn't crash + + connection.add_on_connection_blocked_callback(lambda frame: None) + + blocked_buffer = [] + evt = blocking_connection._ConnectionBlockedEvt( + lambda f: blocked_buffer.append("blocked"), + pika.frame.Method(1, pika.spec.Connection.Blocked('reason'))) + repr(evt) + evt.dispatch() + self.assertEqual(blocked_buffer, ["blocked"]) + + unblocked_buffer = [] + connection.add_on_connection_unblocked_callback(lambda frame: None) + evt = blocking_connection._ConnectionUnblockedEvt( + lambda f: unblocked_buffer.append("unblocked"), + pika.frame.Method(1, pika.spec.Connection.Unblocked())) + repr(evt) + evt.dispatch() + self.assertEqual(unblocked_buffer, ["unblocked"]) + + +class TestBlockedConnectionTimeout(BlockingTestCaseBase): + + def test(self): + """BlockingConnection Connection.Blocked timeout """ + url = DEFAULT_URL + '&blocked_connection_timeout=0.001' + conn = self._connect(url=url) + + # NOTE: I haven't figured out yet how to coerce RabbitMQ to emit + # Connection.Block and Connection.Unblock from the test, so we'll + # simulate it for now + + # Simulate Connection.Blocked + conn._impl._on_connection_blocked(pika.frame.Method( + 0, + pika.spec.Connection.Blocked('TestBlockedConnectionTimeout'))) + + # Wait for connection teardown + with self.assertRaises(pika.exceptions.ConnectionClosed) as excCtx: + while True: + conn.process_data_events(time_limit=1) + + self.assertEqual( + excCtx.exception.args, + (pika.connection.InternalCloseReasons.BLOCKED_CONNECTION_TIMEOUT, + 'Blocked connection timeout expired')) + + +class TestAddCallbackThreadsafeFromSameThread(BlockingTestCaseBase): + + def test(self): + """BlockingConnection.add_callback_threadsafe from same thread""" + connection = self._connect() + + # Test timer completion + start_time = time.time() + rx_callback = [] + connection.add_callback_threadsafe( + lambda: rx_callback.append(time.time())) + while not rx_callback: + connection.process_data_events(time_limit=None) + + self.assertEqual(len(rx_callback), 1) + elapsed = time.time() - start_time + self.assertLess(elapsed, 0.25) + + +class TestAddCallbackThreadsafeFromAnotherThread(BlockingTestCaseBase): + + def test(self): + """BlockingConnection.add_callback_threadsafe from another thread""" + connection = self._connect() + + # Test timer completion + start_time = time.time() + rx_callback = [] + timer = threading.Timer( + 0, + functools.partial(connection.add_callback_threadsafe, + lambda: rx_callback.append(time.time()))) + self.addCleanup(timer.cancel) + timer.start() + while not rx_callback: + connection.process_data_events(time_limit=None) + + self.assertEqual(len(rx_callback), 1) + elapsed = time.time() - start_time + self.assertLess(elapsed, 0.25) + + +class TestAddTimeoutRemoveTimeout(BlockingTestCaseBase): + + def test(self): + """BlockingConnection.add_timeout and remove_timeout""" + connection = self._connect() + + # Test timer completion + start_time = time.time() + rx_callback = [] + timer_id = connection.add_timeout( + 0.005, + lambda: rx_callback.append(time.time())) + while not rx_callback: + connection.process_data_events(time_limit=None) + + self.assertEqual(len(rx_callback), 1) + elapsed = time.time() - start_time + self.assertLess(elapsed, 0.25) + + # Test removing triggered timeout + connection.remove_timeout(timer_id) + + + # Test aborted timer + rx_callback = [] + timer_id = connection.add_timeout( + 0.001, + lambda: rx_callback.append(time.time())) + connection.remove_timeout(timer_id) + connection.process_data_events(time_limit=0.1) + self.assertFalse(rx_callback) + + # Make sure _TimerEvt repr doesn't crash + evt = blocking_connection._TimerEvt(lambda: None) + repr(evt) + + +class TestViabilityOfMultipleTimeoutsWithSameDeadlineAndCallback(BlockingTestCaseBase): + + def test(self): + """BlockingConnection viability of multiple timeouts with same deadline and callback""" + connection = self._connect() + + rx_callback = [] + + def callback(): + rx_callback.append(1) + + timer1 = connection.add_timeout(0, callback) + timer2 = connection.add_timeout(0, callback) + + self.assertIsNot(timer1, timer2) + + connection.remove_timeout(timer1) + + # Wait for second timer to fire + start_wait_time = time.time() + while not rx_callback and time.time() - start_wait_time < 0.25: + connection.process_data_events(time_limit=0.001) + + self.assertListEqual(rx_callback, [1]) + + +class TestRemoveTimeoutFromTimeoutCallback(BlockingTestCaseBase): + + def test(self): + """BlockingConnection.remove_timeout from timeout callback""" + connection = self._connect() + + # Test timer completion + timer_id1 = connection.add_timeout(5, lambda: 0/0) + + rx_timer2 = [] + def on_timer2(): + connection.remove_timeout(timer_id1) + connection.remove_timeout(timer_id2) + rx_timer2.append(1) + + timer_id2 = connection.add_timeout(0, on_timer2) + + while not rx_timer2: + connection.process_data_events(time_limit=None) + + self.assertIsNone(timer_id1.callback) + self.assertFalse(connection._ready_events) + + +class TestSleep(BlockingTestCaseBase): + + def test(self): + """BlockingConnection.sleep""" + connection = self._connect() + + # Try with duration=0 + start_time = time.time() + connection.sleep(duration=0) + elapsed = time.time() - start_time + self.assertLess(elapsed, 0.25) + + # Try with duration=0.005 + start_time = time.time() + connection.sleep(duration=0.005) + elapsed = time.time() - start_time + self.assertGreaterEqual(elapsed, 0.005) + self.assertLess(elapsed, 0.25) + + +class TestConnectionProperties(BlockingTestCaseBase): + + def test(self): + """Test BlockingConnection properties""" + connection = self._connect() + + self.assertTrue(connection.is_open) + self.assertFalse(connection.is_closing) + self.assertFalse(connection.is_closed) + + self.assertTrue(connection.basic_nack_supported) + self.assertTrue(connection.consumer_cancel_notify_supported) + self.assertTrue(connection.exchange_exchange_bindings_supported) + self.assertTrue(connection.publisher_confirms_supported) + + connection.close() + self.assertFalse(connection.is_open) + self.assertFalse(connection.is_closing) + self.assertTrue(connection.is_closed) + + + +class TestCreateAndCloseChannel(BlockingTestCaseBase): + + def test(self): + """BlockingChannel: Create and close channel""" + connection = self._connect() + + ch = connection.channel() + self.assertIsInstance(ch, blocking_connection.BlockingChannel) + self.assertTrue(ch.is_open) + self.assertFalse(ch.is_closed) + self.assertFalse(ch.is_closing) + self.assertIs(ch.connection, connection) + + ch.close() + self.assertTrue(ch.is_closed) + self.assertFalse(ch.is_open) + self.assertFalse(ch.is_closing) + + +class TestExchangeDeclareAndDelete(BlockingTestCaseBase): + + def test(self): + """BlockingChannel: Test exchange_declare and exchange_delete""" + connection = self._connect() + + ch = connection.channel() + + name = "TestExchangeDeclareAndDelete_" + uuid.uuid1().hex + + # Declare a new exchange + frame = ch.exchange_declare(name, exchange_type='direct') + self.addCleanup(connection.channel().exchange_delete, name) + + self.assertIsInstance(frame.method, pika.spec.Exchange.DeclareOk) + + # Check if it exists by declaring it passively + frame = ch.exchange_declare(name, passive=True) + self.assertIsInstance(frame.method, pika.spec.Exchange.DeclareOk) + + # Delete the exchange + frame = ch.exchange_delete(name) + self.assertIsInstance(frame.method, pika.spec.Exchange.DeleteOk) + + # Verify that it's been deleted + with self.assertRaises(pika.exceptions.ChannelClosed) as cm: + ch.exchange_declare(name, passive=True) + + self.assertEqual(cm.exception.args[0], 404) + + +class TestExchangeBindAndUnbind(BlockingTestCaseBase): + + def test(self): + """BlockingChannel: Test exchange_bind and exchange_unbind""" + connection = self._connect() + + ch = connection.channel() + + q_name = 'TestExchangeBindAndUnbind_q' + uuid.uuid1().hex + src_exg_name = 'TestExchangeBindAndUnbind_src_exg_' + uuid.uuid1().hex + dest_exg_name = 'TestExchangeBindAndUnbind_dest_exg_' + uuid.uuid1().hex + routing_key = 'TestExchangeBindAndUnbind' + + # Place channel in publisher-acknowledgments mode so that we may test + # whether the queue is reachable by publishing with mandatory=True + res = ch.confirm_delivery() + self.assertIsNone(res) + + # Declare both exchanges + ch.exchange_declare(src_exg_name, exchange_type='direct') + self.addCleanup(connection.channel().exchange_delete, src_exg_name) + ch.exchange_declare(dest_exg_name, exchange_type='direct') + self.addCleanup(connection.channel().exchange_delete, dest_exg_name) + + # Declare a new queue + ch.queue_declare(q_name, auto_delete=True) + self.addCleanup(self._connect().channel().queue_delete, q_name) + + # Bind the queue to the destination exchange + ch.queue_bind(q_name, exchange=dest_exg_name, routing_key=routing_key) + + + # Verify that the queue is unreachable without exchange-exchange binding + with self.assertRaises(pika.exceptions.UnroutableError): + ch.publish(src_exg_name, routing_key, body='', mandatory=True) + + # Bind the exchanges + frame = ch.exchange_bind(destination=dest_exg_name, source=src_exg_name, + routing_key=routing_key) + self.assertIsInstance(frame.method, pika.spec.Exchange.BindOk) + + # Publish a message via the source exchange + ch.publish(src_exg_name, routing_key, body='TestExchangeBindAndUnbind', + mandatory=True) + + # Check that the queue now has one message + self._assert_exact_message_count_with_retries(channel=ch, + queue=q_name, + expected_count=1) + + # Unbind the exchanges + frame = ch.exchange_unbind(destination=dest_exg_name, + source=src_exg_name, + routing_key=routing_key) + self.assertIsInstance(frame.method, pika.spec.Exchange.UnbindOk) + + # Verify that the queue is now unreachable via the source exchange + with self.assertRaises(pika.exceptions.UnroutableError): + ch.publish(src_exg_name, routing_key, body='', mandatory=True) + + +class TestQueueDeclareAndDelete(BlockingTestCaseBase): + + def test(self): + """BlockingChannel: Test queue_declare and queue_delete""" + connection = self._connect() + + ch = connection.channel() + + q_name = 'TestQueueDeclareAndDelete_' + uuid.uuid1().hex + + # Declare a new queue + frame = ch.queue_declare(q_name, auto_delete=True) + self.addCleanup(self._connect().channel().queue_delete, q_name) + + self.assertIsInstance(frame.method, pika.spec.Queue.DeclareOk) + + # Check if it exists by declaring it passively + frame = ch.queue_declare(q_name, passive=True) + self.assertIsInstance(frame.method, pika.spec.Queue.DeclareOk) + + # Delete the queue + frame = ch.queue_delete(q_name) + self.assertIsInstance(frame.method, pika.spec.Queue.DeleteOk) + + # Verify that it's been deleted + with self.assertRaises(pika.exceptions.ChannelClosed) as cm: + ch.queue_declare(q_name, passive=True) + + self.assertEqual(cm.exception.args[0], 404) + + +class TestPassiveQueueDeclareOfUnknownQueueRaisesChannelClosed( + BlockingTestCaseBase): + def test(self): + """BlockingChannel: ChannelClosed raised when passive-declaring unknown queue""" # pylint: disable=C0301 + connection = self._connect() + ch = connection.channel() + + q_name = ("TestPassiveQueueDeclareOfUnknownQueueRaisesChannelClosed_q_" + + uuid.uuid1().hex) + + with self.assertRaises(pika.exceptions.ChannelClosed) as ex_cm: + ch.queue_declare(q_name, passive=True) + + self.assertEqual(ex_cm.exception.args[0], 404) + + +class TestQueueBindAndUnbindAndPurge(BlockingTestCaseBase): + + def test(self): + """BlockingChannel: Test queue_bind and queue_unbind""" + connection = self._connect() + + ch = connection.channel() + + q_name = 'TestQueueBindAndUnbindAndPurge_q' + uuid.uuid1().hex + exg_name = 'TestQueueBindAndUnbindAndPurge_exg_' + uuid.uuid1().hex + routing_key = 'TestQueueBindAndUnbindAndPurge' + + # Place channel in publisher-acknowledgments mode so that we may test + # whether the queue is reachable by publishing with mandatory=True + res = ch.confirm_delivery() + self.assertIsNone(res) + + # Declare a new exchange + ch.exchange_declare(exg_name, exchange_type='direct') + self.addCleanup(connection.channel().exchange_delete, exg_name) + + # Declare a new queue + ch.queue_declare(q_name, auto_delete=True) + self.addCleanup(self._connect().channel().queue_delete, q_name) + + # Bind the queue to the exchange using routing key + frame = ch.queue_bind(q_name, exchange=exg_name, + routing_key=routing_key) + self.assertIsInstance(frame.method, pika.spec.Queue.BindOk) + + # Check that the queue is empty + frame = ch.queue_declare(q_name, passive=True) + self.assertEqual(frame.method.message_count, 0) + + # Deposit a message in the queue + ch.publish(exg_name, routing_key, body='TestQueueBindAndUnbindAndPurge', + mandatory=True) + + # Check that the queue now has one message + frame = ch.queue_declare(q_name, passive=True) + self.assertEqual(frame.method.message_count, 1) + + # Unbind the queue + frame = ch.queue_unbind(queue=q_name, exchange=exg_name, + routing_key=routing_key) + self.assertIsInstance(frame.method, pika.spec.Queue.UnbindOk) + + # Verify that the queue is now unreachable via that binding + with self.assertRaises(pika.exceptions.UnroutableError): + ch.publish(exg_name, routing_key, + body='TestQueueBindAndUnbindAndPurge-2', + mandatory=True) + + # Purge the queue and verify that 1 message was purged + frame = ch.queue_purge(q_name) + self.assertIsInstance(frame.method, pika.spec.Queue.PurgeOk) + self.assertEqual(frame.method.message_count, 1) + + # Verify that the queue is now empty + frame = ch.queue_declare(q_name, passive=True) + self.assertEqual(frame.method.message_count, 0) + + +class TestBasicGet(BlockingTestCaseBase): + + def tearDown(self): + LOGGER.info('%s TEARING DOWN (%s)', datetime.utcnow(), self) + + def test(self): + """BlockingChannel.basic_get""" + LOGGER.info('%s STARTED (%s)', datetime.utcnow(), self) + + connection = self._connect() + LOGGER.info('%s CONNECTED (%s)', datetime.utcnow(), self) + + ch = connection.channel() + LOGGER.info('%s CREATED CHANNEL (%s)', datetime.utcnow(), self) + + q_name = 'TestBasicGet_q' + uuid.uuid1().hex + + # Place channel in publisher-acknowledgments mode so that the message + # may be delivered synchronously to the queue by publishing it with + # mandatory=True + ch.confirm_delivery() + LOGGER.info('%s ENABLED PUB-ACKS (%s)', datetime.utcnow(), self) + + # Declare a new queue + ch.queue_declare(q_name, auto_delete=True) + self.addCleanup(self._connect().channel().queue_delete, q_name) + LOGGER.info('%s DECLARED QUEUE (%s)', datetime.utcnow(), self) + + # Verify result of getting a message from an empty queue + msg = ch.basic_get(q_name, no_ack=False) + self.assertTupleEqual(msg, (None, None, None)) + LOGGER.info('%s GOT FROM EMPTY QUEUE (%s)', datetime.utcnow(), self) + + body = 'TestBasicGet' + # Deposit a message in the queue via default exchange + ch.publish(exchange='', routing_key=q_name, + body=body, + mandatory=True) + LOGGER.info('%s PUBLISHED (%s)', datetime.utcnow(), self) + + # Get the message + (method, properties, body) = ch.basic_get(q_name, no_ack=False) + LOGGER.info('%s GOT FROM NON-EMPTY QUEUE (%s)', datetime.utcnow(), self) + self.assertIsInstance(method, pika.spec.Basic.GetOk) + self.assertEqual(method.delivery_tag, 1) + self.assertFalse(method.redelivered) + self.assertEqual(method.exchange, '') + self.assertEqual(method.routing_key, q_name) + self.assertEqual(method.message_count, 0) + + self.assertIsInstance(properties, pika.BasicProperties) + self.assertIsNone(properties.headers) + self.assertEqual(body, as_bytes(body)) + + # Ack it + ch.basic_ack(delivery_tag=method.delivery_tag) + LOGGER.info('%s ACKED (%s)', datetime.utcnow(), self) + + # Verify that the queue is now empty + self._assert_exact_message_count_with_retries(channel=ch, + queue=q_name, + expected_count=0) + + +class TestBasicReject(BlockingTestCaseBase): + + def test(self): + """BlockingChannel.basic_reject""" + connection = self._connect() + + ch = connection.channel() + + q_name = 'TestBasicReject_q' + uuid.uuid1().hex + + # Place channel in publisher-acknowledgments mode so that the message + # may be delivered synchronously to the queue by publishing it with + # mandatory=True + ch.confirm_delivery() + + # Declare a new queue + ch.queue_declare(q_name, auto_delete=True) + self.addCleanup(self._connect().channel().queue_delete, q_name) + + # Deposit two messages in the queue via default exchange + ch.publish(exchange='', routing_key=q_name, + body='TestBasicReject1', + mandatory=True) + ch.publish(exchange='', routing_key=q_name, + body='TestBasicReject2', + mandatory=True) + + # Get the messages + (rx_method, _, rx_body) = ch.basic_get(q_name, no_ack=False) + self.assertEqual(rx_body, as_bytes('TestBasicReject1')) + + (rx_method, _, rx_body) = ch.basic_get(q_name, no_ack=False) + self.assertEqual(rx_body, as_bytes('TestBasicReject2')) + + # Nack the second message + ch.basic_reject(rx_method.delivery_tag, requeue=True) + + # Verify that exactly one message is present in the queue, namely the + # second one + self._assert_exact_message_count_with_retries(channel=ch, + queue=q_name, + expected_count=1) + (rx_method, _, rx_body) = ch.basic_get(q_name, no_ack=False) + self.assertEqual(rx_body, as_bytes('TestBasicReject2')) + + +class TestBasicRejectNoRequeue(BlockingTestCaseBase): + + def test(self): + """BlockingChannel.basic_reject with requeue=False""" + connection = self._connect() + + ch = connection.channel() + + q_name = 'TestBasicRejectNoRequeue_q' + uuid.uuid1().hex + + # Place channel in publisher-acknowledgments mode so that the message + # may be delivered synchronously to the queue by publishing it with + # mandatory=True + ch.confirm_delivery() + + # Declare a new queue + ch.queue_declare(q_name, auto_delete=True) + self.addCleanup(self._connect().channel().queue_delete, q_name) + + # Deposit two messages in the queue via default exchange + ch.publish(exchange='', routing_key=q_name, + body='TestBasicRejectNoRequeue1', + mandatory=True) + ch.publish(exchange='', routing_key=q_name, + body='TestBasicRejectNoRequeue2', + mandatory=True) + + # Get the messages + (rx_method, _, rx_body) = ch.basic_get(q_name, no_ack=False) + self.assertEqual(rx_body, + as_bytes('TestBasicRejectNoRequeue1')) + + (rx_method, _, rx_body) = ch.basic_get(q_name, no_ack=False) + self.assertEqual(rx_body, + as_bytes('TestBasicRejectNoRequeue2')) + + # Nack the second message + ch.basic_reject(rx_method.delivery_tag, requeue=False) + + # Verify that no messages are present in the queue + self._assert_exact_message_count_with_retries(channel=ch, + queue=q_name, + expected_count=0) + + +class TestBasicNack(BlockingTestCaseBase): + + def test(self): + """BlockingChannel.basic_nack single message""" + connection = self._connect() + + ch = connection.channel() + + q_name = 'TestBasicNack_q' + uuid.uuid1().hex + + # Place channel in publisher-acknowledgments mode so that the message + # may be delivered synchronously to the queue by publishing it with + # mandatory=True + ch.confirm_delivery() + + # Declare a new queue + ch.queue_declare(q_name, auto_delete=True) + self.addCleanup(self._connect().channel().queue_delete, q_name) + + # Deposit two messages in the queue via default exchange + ch.publish(exchange='', routing_key=q_name, + body='TestBasicNack1', + mandatory=True) + ch.publish(exchange='', routing_key=q_name, + body='TestBasicNack2', + mandatory=True) + + # Get the messages + (rx_method, _, rx_body) = ch.basic_get(q_name, no_ack=False) + self.assertEqual(rx_body, as_bytes('TestBasicNack1')) + + (rx_method, _, rx_body) = ch.basic_get(q_name, no_ack=False) + self.assertEqual(rx_body, as_bytes('TestBasicNack2')) + + # Nack the second message + ch.basic_nack(rx_method.delivery_tag, multiple=False, requeue=True) + + # Verify that exactly one message is present in the queue, namely the + # second one + self._assert_exact_message_count_with_retries(channel=ch, + queue=q_name, + expected_count=1) + (rx_method, _, rx_body) = ch.basic_get(q_name, no_ack=False) + self.assertEqual(rx_body, as_bytes('TestBasicNack2')) + + +class TestBasicNackNoRequeue(BlockingTestCaseBase): + + def test(self): + """BlockingChannel.basic_nack with requeue=False""" + connection = self._connect() + + ch = connection.channel() + + q_name = 'TestBasicNackNoRequeue_q' + uuid.uuid1().hex + + # Place channel in publisher-acknowledgments mode so that the message + # may be delivered synchronously to the queue by publishing it with + # mandatory=True + ch.confirm_delivery() + + # Declare a new queue + ch.queue_declare(q_name, auto_delete=True) + self.addCleanup(self._connect().channel().queue_delete, q_name) + + # Deposit two messages in the queue via default exchange + ch.publish(exchange='', routing_key=q_name, + body='TestBasicNackNoRequeue1', + mandatory=True) + ch.publish(exchange='', routing_key=q_name, + body='TestBasicNackNoRequeue2', + mandatory=True) + + # Get the messages + (rx_method, _, rx_body) = ch.basic_get(q_name, no_ack=False) + self.assertEqual(rx_body, + as_bytes('TestBasicNackNoRequeue1')) + + (rx_method, _, rx_body) = ch.basic_get(q_name, no_ack=False) + self.assertEqual(rx_body, + as_bytes('TestBasicNackNoRequeue2')) + + # Nack the second message + ch.basic_nack(rx_method.delivery_tag, requeue=False) + + # Verify that no messages are present in the queue + self._assert_exact_message_count_with_retries(channel=ch, + queue=q_name, + expected_count=0) + + +class TestBasicNackMultiple(BlockingTestCaseBase): + + def test(self): + """BlockingChannel.basic_nack multiple messages""" + connection = self._connect() + + ch = connection.channel() + + q_name = 'TestBasicNackMultiple_q' + uuid.uuid1().hex + + # Place channel in publisher-acknowledgments mode so that the message + # may be delivered synchronously to the queue by publishing it with + # mandatory=True + ch.confirm_delivery() + + # Declare a new queue + ch.queue_declare(q_name, auto_delete=True) + self.addCleanup(self._connect().channel().queue_delete, q_name) + + # Deposit two messages in the queue via default exchange + ch.publish(exchange='', routing_key=q_name, + body='TestBasicNackMultiple1', + mandatory=True) + ch.publish(exchange='', routing_key=q_name, + body='TestBasicNackMultiple2', + mandatory=True) + + # Get the messages + (rx_method, _, rx_body) = ch.basic_get(q_name, no_ack=False) + self.assertEqual(rx_body, + as_bytes('TestBasicNackMultiple1')) + + (rx_method, _, rx_body) = ch.basic_get(q_name, no_ack=False) + self.assertEqual(rx_body, + as_bytes('TestBasicNackMultiple2')) + + # Nack both messages via the "multiple" option + ch.basic_nack(rx_method.delivery_tag, multiple=True, requeue=True) + + # Verify that both messages are present in the queue + self._assert_exact_message_count_with_retries(channel=ch, + queue=q_name, + expected_count=2) + (rx_method, _, rx_body) = ch.basic_get(q_name, no_ack=False) + self.assertEqual(rx_body, + as_bytes('TestBasicNackMultiple1')) + (rx_method, _, rx_body) = ch.basic_get(q_name, no_ack=False) + self.assertEqual(rx_body, + as_bytes('TestBasicNackMultiple2')) + + +class TestBasicRecoverWithRequeue(BlockingTestCaseBase): + + def test(self): + """BlockingChannel.basic_recover with requeue=True. + + NOTE: the requeue=False option is not supported by RabbitMQ broker as + of this writing (using RabbitMQ 3.5.1) + """ + connection = self._connect() + + ch = connection.channel() + + q_name = ( + 'TestBasicRecoverWithRequeue_q' + uuid.uuid1().hex) + + # Place channel in publisher-acknowledgments mode so that the message + # may be delivered synchronously to the queue by publishing it with + # mandatory=True + ch.confirm_delivery() + + # Declare a new queue + ch.queue_declare(q_name, auto_delete=True) + self.addCleanup(self._connect().channel().queue_delete, q_name) + + # Deposit two messages in the queue via default exchange + ch.publish(exchange='', routing_key=q_name, + body='TestBasicRecoverWithRequeue1', + mandatory=True) + ch.publish(exchange='', routing_key=q_name, + body='TestBasicRecoverWithRequeue2', + mandatory=True) + + rx_messages = [] + num_messages = 0 + for msg in ch.consume(q_name, no_ack=False): + num_messages += 1 + + if num_messages == 2: + ch.basic_recover(requeue=True) + + if num_messages > 2: + rx_messages.append(msg) + + if num_messages == 4: + break + else: + self.fail('consumer aborted prematurely') + + # Get the messages + (_, _, rx_body) = rx_messages[0] + self.assertEqual(rx_body, + as_bytes('TestBasicRecoverWithRequeue1')) + + (_, _, rx_body) = rx_messages[1] + self.assertEqual(rx_body, + as_bytes('TestBasicRecoverWithRequeue2')) + + +class TestTxCommit(BlockingTestCaseBase): + + def test(self): + """BlockingChannel.tx_commit""" + connection = self._connect() + + ch = connection.channel() + + q_name = 'TestTxCommit_q' + uuid.uuid1().hex + + # Declare a new queue + ch.queue_declare(q_name, auto_delete=True) + self.addCleanup(self._connect().channel().queue_delete, q_name) + + # Select standard transaction mode + frame = ch.tx_select() + self.assertIsInstance(frame.method, pika.spec.Tx.SelectOk) + + # Deposit a message in the queue via default exchange + ch.publish(exchange='', routing_key=q_name, + body='TestTxCommit1', + mandatory=True) + + # Verify that queue is still empty + frame = ch.queue_declare(q_name, passive=True) + self.assertEqual(frame.method.message_count, 0) + + # Commit the transaction + ch.tx_commit() + + # Verify that the queue has the expected message + frame = ch.queue_declare(q_name, passive=True) + self.assertEqual(frame.method.message_count, 1) + + (_, _, rx_body) = ch.basic_get(q_name, no_ack=False) + self.assertEqual(rx_body, as_bytes('TestTxCommit1')) + + +class TestTxRollback(BlockingTestCaseBase): + + def test(self): + """BlockingChannel.tx_commit""" + connection = self._connect() + + ch = connection.channel() + + q_name = 'TestTxRollback_q' + uuid.uuid1().hex + + # Declare a new queue + ch.queue_declare(q_name, auto_delete=True) + self.addCleanup(self._connect().channel().queue_delete, q_name) + + # Select standard transaction mode + frame = ch.tx_select() + self.assertIsInstance(frame.method, pika.spec.Tx.SelectOk) + + # Deposit a message in the queue via default exchange + ch.publish(exchange='', routing_key=q_name, + body='TestTxRollback1', + mandatory=True) + + # Verify that queue is still empty + frame = ch.queue_declare(q_name, passive=True) + self.assertEqual(frame.method.message_count, 0) + + # Roll back the transaction + ch.tx_rollback() + + # Verify that the queue continues to be empty + frame = ch.queue_declare(q_name, passive=True) + self.assertEqual(frame.method.message_count, 0) + + +class TestBasicConsumeFromUnknownQueueRaisesChannelClosed(BlockingTestCaseBase): + def test(self): + """ChannelClosed raised when consuming from unknown queue""" + connection = self._connect() + ch = connection.channel() + + q_name = ("TestBasicConsumeFromUnknownQueueRaisesChannelClosed_q_" + + uuid.uuid1().hex) + + with self.assertRaises(pika.exceptions.ChannelClosed) as ex_cm: + ch.basic_consume(lambda *args: None, q_name) + + self.assertEqual(ex_cm.exception.args[0], 404) + + +class TestPublishAndBasicPublishWithPubacksUnroutable(BlockingTestCaseBase): + + def test(self): # pylint: disable=R0914 + """BlockingChannel.publish amd basic_publish unroutable message with pubacks""" # pylint: disable=C0301 + connection = self._connect() + + ch = connection.channel() + + exg_name = ('TestPublishAndBasicPublishUnroutable_exg_' + + uuid.uuid1().hex) + routing_key = 'TestPublishAndBasicPublishUnroutable' + + # Place channel in publisher-acknowledgments mode so that publishing + # with mandatory=True will be synchronous + res = ch.confirm_delivery() + self.assertIsNone(res) + + # Declare a new exchange + ch.exchange_declare(exg_name, exchange_type='direct') + self.addCleanup(connection.channel().exchange_delete, exg_name) + + # Verify unroutable message handling using basic_publish + res = ch.basic_publish(exg_name, routing_key=routing_key, body='', + mandatory=True) + self.assertEqual(res, False) + + # Verify unroutable message handling using publish + msg2_headers = dict( + test_name='TestPublishAndBasicPublishWithPubacksUnroutable') + msg2_properties = pika.spec.BasicProperties(headers=msg2_headers) + with self.assertRaises(pika.exceptions.UnroutableError) as cm: + ch.publish(exg_name, routing_key=routing_key, body='', + properties=msg2_properties, mandatory=True) + (msg,) = cm.exception.messages + self.assertIsInstance(msg, blocking_connection.ReturnedMessage) + self.assertIsInstance(msg.method, pika.spec.Basic.Return) + self.assertEqual(msg.method.reply_code, 312) + self.assertEqual(msg.method.exchange, exg_name) + self.assertEqual(msg.method.routing_key, routing_key) + self.assertIsInstance(msg.properties, pika.BasicProperties) + self.assertEqual(msg.properties.headers, msg2_headers) + self.assertEqual(msg.body, as_bytes('')) + + +class TestConfirmDeliveryAfterUnroutableMessage(BlockingTestCaseBase): + + def test(self): # pylint: disable=R0914 + """BlockingChannel.confirm_delivery following unroutable message""" + connection = self._connect() + + ch = connection.channel() + + exg_name = ('TestConfirmDeliveryAfterUnroutableMessage_exg_' + + uuid.uuid1().hex) + routing_key = 'TestConfirmDeliveryAfterUnroutableMessage' + + # Declare a new exchange + ch.exchange_declare(exg_name, exchange_type='direct') + self.addCleanup(connection.channel().exchange_delete, exg_name) + + # Register on-return callback + returned_messages = [] + ch.add_on_return_callback(lambda *args: returned_messages.append(args)) + + # Emit unroutable message without pubacks + res = ch.basic_publish(exg_name, routing_key=routing_key, body='', + mandatory=True) + self.assertEqual(res, True) + + # Select delivery confirmations + ch.confirm_delivery() + + # Verify that unroutable message is in pending events + self.assertEqual(len(ch._pending_events), 1) + self.assertIsInstance(ch._pending_events[0], + blocking_connection._ReturnedMessageEvt) + # Verify that repr of _ReturnedMessageEvt instance does crash + repr(ch._pending_events[0]) + + # Dispach events + connection.process_data_events() + + self.assertEqual(len(ch._pending_events), 0) + + # Verify that unroutable message was dispatched + ((channel, method, properties, body,),) = returned_messages + self.assertIs(channel, ch) + self.assertIsInstance(method, pika.spec.Basic.Return) + self.assertEqual(method.reply_code, 312) + self.assertEqual(method.exchange, exg_name) + self.assertEqual(method.routing_key, routing_key) + self.assertIsInstance(properties, pika.BasicProperties) + self.assertEqual(body, as_bytes('')) + + +class TestUnroutableMessagesReturnedInNonPubackMode(BlockingTestCaseBase): + + def test(self): # pylint: disable=R0914 + """BlockingChannel: unroutable messages is returned in non-puback mode""" # pylint: disable=C0301 + connection = self._connect() + + ch = connection.channel() + + exg_name = ( + 'TestUnroutableMessageReturnedInNonPubackMode_exg_' + + uuid.uuid1().hex) + routing_key = 'TestUnroutableMessageReturnedInNonPubackMode' + + # Declare a new exchange + ch.exchange_declare(exg_name, exchange_type='direct') + self.addCleanup(connection.channel().exchange_delete, exg_name) + + # Register on-return callback + returned_messages = [] + ch.add_on_return_callback( + lambda *args: returned_messages.append(args)) + + # Emit unroutable messages without pubacks + ch.publish(exg_name, routing_key=routing_key, body='msg1', + mandatory=True) + + ch.publish(exg_name, routing_key=routing_key, body='msg2', + mandatory=True) + + # Process I/O until Basic.Return are dispatched + while len(returned_messages) < 2: + connection.process_data_events() + + self.assertEqual(len(returned_messages), 2) + + self.assertEqual(len(ch._pending_events), 0) + + # Verify returned messages + (channel, method, properties, body,) = returned_messages[0] + self.assertIs(channel, ch) + self.assertIsInstance(method, pika.spec.Basic.Return) + self.assertEqual(method.reply_code, 312) + self.assertEqual(method.exchange, exg_name) + self.assertEqual(method.routing_key, routing_key) + self.assertIsInstance(properties, pika.BasicProperties) + self.assertEqual(body, as_bytes('msg1')) + + (channel, method, properties, body,) = returned_messages[1] + self.assertIs(channel, ch) + self.assertIsInstance(method, pika.spec.Basic.Return) + self.assertEqual(method.reply_code, 312) + self.assertEqual(method.exchange, exg_name) + self.assertEqual(method.routing_key, routing_key) + self.assertIsInstance(properties, pika.BasicProperties) + self.assertEqual(body, as_bytes('msg2')) + + +class TestUnroutableMessageReturnedInPubackMode(BlockingTestCaseBase): + + def test(self): # pylint: disable=R0914 + """BlockingChannel: unroutable messages is returned in puback mode""" + connection = self._connect() + + ch = connection.channel() + + exg_name = ( + 'TestUnroutableMessageReturnedInPubackMode_exg_' + + uuid.uuid1().hex) + routing_key = 'TestUnroutableMessageReturnedInPubackMode' + + # Declare a new exchange + ch.exchange_declare(exg_name, exchange_type='direct') + self.addCleanup(connection.channel().exchange_delete, exg_name) + + # Select delivery confirmations + ch.confirm_delivery() + + # Register on-return callback + returned_messages = [] + ch.add_on_return_callback( + lambda *args: returned_messages.append(args)) + + # Emit unroutable messages with pubacks + res = ch.basic_publish(exg_name, routing_key=routing_key, body='msg1', + mandatory=True) + self.assertEqual(res, False) + + res = ch.basic_publish(exg_name, routing_key=routing_key, body='msg2', + mandatory=True) + self.assertEqual(res, False) + + # Verify that unroutable messages are already in pending events + self.assertEqual(len(ch._pending_events), 2) + self.assertIsInstance(ch._pending_events[0], + blocking_connection._ReturnedMessageEvt) + self.assertIsInstance(ch._pending_events[1], + blocking_connection._ReturnedMessageEvt) + # Verify that repr of _ReturnedMessageEvt instance does crash + repr(ch._pending_events[0]) + repr(ch._pending_events[1]) + + # Dispatch events + connection.process_data_events() + + self.assertEqual(len(ch._pending_events), 0) + + # Verify returned messages + (channel, method, properties, body,) = returned_messages[0] + self.assertIs(channel, ch) + self.assertIsInstance(method, pika.spec.Basic.Return) + self.assertEqual(method.reply_code, 312) + self.assertEqual(method.exchange, exg_name) + self.assertEqual(method.routing_key, routing_key) + self.assertIsInstance(properties, pika.BasicProperties) + self.assertEqual(body, as_bytes('msg1')) + + (channel, method, properties, body,) = returned_messages[1] + self.assertIs(channel, ch) + self.assertIsInstance(method, pika.spec.Basic.Return) + self.assertEqual(method.reply_code, 312) + self.assertEqual(method.exchange, exg_name) + self.assertEqual(method.routing_key, routing_key) + self.assertIsInstance(properties, pika.BasicProperties) + self.assertEqual(body, as_bytes('msg2')) + + +class TestBasicPublishDeliveredWhenPendingUnroutable(BlockingTestCaseBase): + + def test(self): # pylint: disable=R0914 + """BlockingChannel.basic_publish msg delivered despite pending unroutable message""" # pylint: disable=C0301 + connection = self._connect() + + ch = connection.channel() + + q_name = ('TestBasicPublishDeliveredWhenPendingUnroutable_q' + + uuid.uuid1().hex) + exg_name = ('TestBasicPublishDeliveredWhenPendingUnroutable_exg_' + + uuid.uuid1().hex) + routing_key = 'TestBasicPublishDeliveredWhenPendingUnroutable' + + + # Declare a new exchange + ch.exchange_declare(exg_name, exchange_type='direct') + self.addCleanup(connection.channel().exchange_delete, exg_name) + + # Declare a new queue + ch.queue_declare(q_name, auto_delete=True) + self.addCleanup(self._connect().channel().queue_delete, q_name) + + # Bind the queue to the exchange using routing key + ch.queue_bind(q_name, exchange=exg_name, routing_key=routing_key) + + # Attempt to send an unroutable message in the queue via basic_publish + res = ch.basic_publish(exg_name, routing_key='', + body='unroutable-message', + mandatory=True) + self.assertEqual(res, True) + + # Flush connection to force Basic.Return + connection.channel().close() + + # Deposit a routable message in the queue + res = ch.basic_publish(exg_name, routing_key=routing_key, + body='routable-message', + mandatory=True) + self.assertEqual(res, True) + + # Wait for the queue to get the routable message + self._assert_exact_message_count_with_retries(channel=ch, + queue=q_name, + expected_count=1) + + msg = ch.basic_get(q_name) + + # Check the first message + self.assertIsInstance(msg, tuple) + rx_method, rx_properties, rx_body = msg + self.assertIsInstance(rx_method, pika.spec.Basic.GetOk) + self.assertEqual(rx_method.delivery_tag, 1) + self.assertFalse(rx_method.redelivered) + self.assertEqual(rx_method.exchange, exg_name) + self.assertEqual(rx_method.routing_key, routing_key) + + self.assertIsInstance(rx_properties, pika.BasicProperties) + self.assertEqual(rx_body, as_bytes('routable-message')) + + # There shouldn't be any more events now + self.assertFalse(ch._pending_events) + + # Ack the message + ch.basic_ack(delivery_tag=rx_method.delivery_tag, multiple=False) + + # Verify that the queue is now empty + self._assert_exact_message_count_with_retries(channel=ch, + queue=q_name, + expected_count=0) + + +class TestPublishAndConsumeWithPubacksAndQosOfOne(BlockingTestCaseBase): + + def test(self): # pylint: disable=R0914,R0915 + """BlockingChannel.basic_publish, publish, basic_consume, QoS, \ + Basic.Cancel from broker + """ + connection = self._connect() + + ch = connection.channel() + + q_name = 'TestPublishAndConsumeAndQos_q' + uuid.uuid1().hex + exg_name = 'TestPublishAndConsumeAndQos_exg_' + uuid.uuid1().hex + routing_key = 'TestPublishAndConsumeAndQos' + + # Place channel in publisher-acknowledgments mode so that publishing + # with mandatory=True will be synchronous + res = ch.confirm_delivery() + self.assertIsNone(res) + + # Declare a new exchange + ch.exchange_declare(exg_name, exchange_type='direct') + self.addCleanup(connection.channel().exchange_delete, exg_name) + + # Declare a new queue + ch.queue_declare(q_name, auto_delete=True) + self.addCleanup(self._connect().channel().queue_delete, q_name) + + # Bind the queue to the exchange using routing key + ch.queue_bind(q_name, exchange=exg_name, routing_key=routing_key) + + # Deposit a message in the queue via basic_publish + msg1_headers = dict( + test_name='TestPublishAndConsumeWithPubacksAndQosOfOne') + msg1_properties = pika.spec.BasicProperties(headers=msg1_headers) + res = ch.basic_publish(exg_name, routing_key=routing_key, + body='via-basic_publish', + properties=msg1_properties, + mandatory=True) + self.assertEqual(res, True) + + # Deposit another message in the queue via publish + ch.publish(exg_name, routing_key, body='via-publish', + mandatory=True) + + # Check that the queue now has two messages + frame = ch.queue_declare(q_name, passive=True) + self.assertEqual(frame.method.message_count, 2) + + # Configure QoS for one message + ch.basic_qos(prefetch_size=0, prefetch_count=1, all_channels=False) + + # Create a consumer + rx_messages = [] + consumer_tag = ch.basic_consume( + lambda *args: rx_messages.append(args), + q_name, + no_ack=False, + exclusive=False, + arguments=None) + + # Wait for first message to arrive + while not rx_messages: + connection.process_data_events(time_limit=None) + + self.assertEqual(len(rx_messages), 1) + + # Check the first message + msg = rx_messages[0] + self.assertIsInstance(msg, tuple) + rx_ch, rx_method, rx_properties, rx_body = msg + self.assertIs(rx_ch, ch) + self.assertIsInstance(rx_method, pika.spec.Basic.Deliver) + self.assertEqual(rx_method.consumer_tag, consumer_tag) + self.assertEqual(rx_method.delivery_tag, 1) + self.assertFalse(rx_method.redelivered) + self.assertEqual(rx_method.exchange, exg_name) + self.assertEqual(rx_method.routing_key, routing_key) + + self.assertIsInstance(rx_properties, pika.BasicProperties) + self.assertEqual(rx_properties.headers, msg1_headers) + self.assertEqual(rx_body, as_bytes('via-basic_publish')) + + # There shouldn't be any more events now + self.assertFalse(ch._pending_events) + + # Ack the message so that the next one can arrive (we configured QoS + # with prefetch_count=1) + ch.basic_ack(delivery_tag=rx_method.delivery_tag, multiple=False) + + # Get the second message + while len(rx_messages) < 2: + connection.process_data_events(time_limit=None) + + self.assertEqual(len(rx_messages), 2) + + msg = rx_messages[1] + self.assertIsInstance(msg, tuple) + rx_ch, rx_method, rx_properties, rx_body = msg + self.assertIs(rx_ch, ch) + self.assertIsInstance(rx_method, pika.spec.Basic.Deliver) + self.assertEqual(rx_method.consumer_tag, consumer_tag) + self.assertEqual(rx_method.delivery_tag, 2) + self.assertFalse(rx_method.redelivered) + self.assertEqual(rx_method.exchange, exg_name) + self.assertEqual(rx_method.routing_key, routing_key) + + self.assertIsInstance(rx_properties, pika.BasicProperties) + self.assertEqual(rx_body, as_bytes('via-publish')) + + # There shouldn't be any more events now + self.assertFalse(ch._pending_events) + + ch.basic_ack(delivery_tag=rx_method.delivery_tag, multiple=False) + + # Verify that the queue is now empty + self._assert_exact_message_count_with_retries(channel=ch, + queue=q_name, + expected_count=0) + + # Attempt to consume again with a short timeout + connection.process_data_events(time_limit=0.005) + self.assertEqual(len(rx_messages), 2) + + # Delete the queue and wait for consumer cancellation + rx_cancellations = [] + ch.add_on_cancel_callback(rx_cancellations.append) + ch.queue_delete(q_name) + ch.start_consuming() + + self.assertEqual(len(rx_cancellations), 1) + frame, = rx_cancellations + self.assertEqual(frame.method.consumer_tag, consumer_tag) + + +class TestBasicConsumeWithAckFromAnotherThread(BlockingTestCaseBase): + + def test(self): # pylint: disable=R0914,R0915 + """BlockingChannel.basic_consume with ack from another thread and \ + requesting basic_ack via add_callback_threadsafe + """ + # This test simulates processing of a message on another thread and + # then requesting an ACK to be dispatched on the connection's thread + # via BlockingConnection.add_callback_threadsafe + + connection = self._connect() + + ch = connection.channel() + + q_name = 'TestBasicConsumeWithAckFromAnotherThread_q' + uuid.uuid1().hex + exg_name = ('TestBasicConsumeWithAckFromAnotherThread_exg' + + uuid.uuid1().hex) + routing_key = 'TestBasicConsumeWithAckFromAnotherThread' + + # Place channel in publisher-acknowledgments mode so that publishing + # with mandatory=True will be synchronous (for convenience) + res = ch.confirm_delivery() + self.assertIsNone(res) + + # Declare a new exchange + ch.exchange_declare(exg_name, exchange_type='direct') + self.addCleanup(connection.channel().exchange_delete, exg_name) + + # Declare a new queue + ch.queue_declare(q_name, auto_delete=True) + self.addCleanup(self._connect().channel().queue_delete, q_name) + + # Bind the queue to the exchange using routing key + ch.queue_bind(q_name, exchange=exg_name, routing_key=routing_key) + + # Publish 2 messages with mandatory=True for synchronous processing + ch.publish(exg_name, routing_key, body='msg1', mandatory=True) + ch.publish(exg_name, routing_key, body='last-msg', mandatory=True) + + # Configure QoS for one message so that the 2nd message will be + # delivered only after the 1st one is ACKed + ch.basic_qos(prefetch_size=0, prefetch_count=1, all_channels=False) + + # Create a consumer + rx_messages = [] + def ackAndEnqueueMessageViaAnotherThread(rx_ch, + rx_method, + rx_properties, # pylint: disable=W0613 + rx_body): + LOGGER.debug( + '%s: Got message body=%r; delivery-tag=%r', + datetime.now(), rx_body, rx_method.delivery_tag) + + # Request ACK dispatch via add_callback_threadsafe from other + # thread; if last message, cancel consumer so that start_consuming + # can return + + def processOnConnectionThread(): + LOGGER.debug('%s: ACKing message body=%r; delivery-tag=%r', + datetime.now(), + rx_body, + rx_method.delivery_tag) + ch.basic_ack(delivery_tag=rx_method.delivery_tag, + multiple=False) + rx_messages.append(rx_body) + + # NOTE on python3, `b'last-msg' != 'last-msg'` + if rx_body == b'last-msg': + LOGGER.debug('%s: Canceling consumer consumer-tag=%r', + datetime.now(), + rx_method.consumer_tag) + rx_ch.basic_cancel(rx_method.consumer_tag) + + # Spawn a thread to initiate ACKing + timer = threading.Timer(0, + lambda: connection.add_callback_threadsafe( + processOnConnectionThread)) + self.addCleanup(timer.cancel) + timer.start() + + consumer_tag = ch.basic_consume( + ackAndEnqueueMessageViaAnotherThread, + q_name, + no_ack=False, + exclusive=False, + arguments=None) + + # Wait for both messages + LOGGER.debug('%s: calling start_consuming(); consumer tag=%r', + datetime.now(), + consumer_tag) + ch.start_consuming() + LOGGER.debug('%s: Returned from start_consuming(); consumer tag=%r', + datetime.now(), + consumer_tag) + + self.assertEqual(len(rx_messages), 2) + self.assertEqual(rx_messages[0], b'msg1') + self.assertEqual(rx_messages[1], b'last-msg') + + +class TestConsumeGeneratorWithAckFromAnotherThread(BlockingTestCaseBase): + + def test(self): # pylint: disable=R0914,R0915 + """BlockingChannel.consume and requesting basic_ack from another \ + thread via add_callback_threadsafe + """ + connection = self._connect() + + ch = connection.channel() + + q_name = ('TestConsumeGeneratorWithAckFromAnotherThread_q' + + uuid.uuid1().hex) + exg_name = ('TestConsumeGeneratorWithAckFromAnotherThread_exg' + + uuid.uuid1().hex) + routing_key = 'TestConsumeGeneratorWithAckFromAnotherThread' + + # Place channel in publisher-acknowledgments mode so that publishing + # with mandatory=True will be synchronous (for convenience) + res = ch.confirm_delivery() + self.assertIsNone(res) + + # Declare a new exchange + ch.exchange_declare(exg_name, exchange_type='direct') + self.addCleanup(connection.channel().exchange_delete, exg_name) + + # Declare a new queue + ch.queue_declare(q_name, auto_delete=True) + self.addCleanup(self._connect().channel().queue_delete, q_name) + + # Bind the queue to the exchange using routing key + ch.queue_bind(q_name, exchange=exg_name, routing_key=routing_key) + + # Publish 2 messages with mandatory=True for synchronous processing + ch.publish(exg_name, routing_key, body='msg1', mandatory=True) + ch.publish(exg_name, routing_key, body='last-msg', mandatory=True) + + # Configure QoS for one message so that the 2nd message will be + # delivered only after the 1st one is ACKed + ch.basic_qos(prefetch_size=0, prefetch_count=1, all_channels=False) + + # Create a consumer + rx_messages = [] + def ackAndEnqueueMessageViaAnotherThread(rx_ch, + rx_method, + rx_properties, # pylint: disable=W0613 + rx_body): + LOGGER.debug( + '%s: Got message body=%r; delivery-tag=%r', + datetime.now(), rx_body, rx_method.delivery_tag) + + # Request ACK dispatch via add_callback_threadsafe from other + # thread; if last message, cancel consumer so that consumer + # generator completes + + def processOnConnectionThread(): + LOGGER.debug('%s: ACKing message body=%r; delivery-tag=%r', + datetime.now(), + rx_body, + rx_method.delivery_tag) + ch.basic_ack(delivery_tag=rx_method.delivery_tag, + multiple=False) + rx_messages.append(rx_body) + + # NOTE on python3, `b'last-msg' != 'last-msg'` + if rx_body == b'last-msg': + LOGGER.debug('%s: Canceling consumer consumer-tag=%r', + datetime.now(), + rx_method.consumer_tag) + # NOTE Need to use cancel() for the consumer generator + # instead of basic_cancel() + rx_ch.cancel() + + # Spawn a thread to initiate ACKing + timer = threading.Timer(0, + lambda: connection.add_callback_threadsafe( + processOnConnectionThread)) + self.addCleanup(timer.cancel) + timer.start() + + for method, properties, body in ch.consume(q_name, no_ack=False): + ackAndEnqueueMessageViaAnotherThread(rx_ch=ch, + rx_method=method, + rx_properties=properties, + rx_body=body) + + self.assertEqual(len(rx_messages), 2) + self.assertEqual(rx_messages[0], b'msg1') + self.assertEqual(rx_messages[1], b'last-msg') + + +class TestTwoBasicConsumersOnSameChannel(BlockingTestCaseBase): + + def test(self): # pylint: disable=R0914 + """BlockingChannel: two basic_consume consumers on same channel + """ + connection = self._connect() + + ch = connection.channel() + + exg_name = 'TestPublishAndConsumeAndQos_exg_' + uuid.uuid1().hex + q1_name = 'TestTwoBasicConsumersOnSameChannel_q1' + uuid.uuid1().hex + q2_name = 'TestTwoBasicConsumersOnSameChannel_q2' + uuid.uuid1().hex + q1_routing_key = 'TestTwoBasicConsumersOnSameChannel1' + q2_routing_key = 'TestTwoBasicConsumersOnSameChannel2' + + # Place channel in publisher-acknowledgments mode so that publishing + # with mandatory=True will be synchronous + ch.confirm_delivery() + + # Declare a new exchange + ch.exchange_declare(exg_name, exchange_type='direct') + self.addCleanup(connection.channel().exchange_delete, exg_name) + + # Declare the two new queues and bind them to the exchange + ch.queue_declare(q1_name, auto_delete=True) + self.addCleanup(self._connect().channel().queue_delete, q1_name) + ch.queue_bind(q1_name, exchange=exg_name, routing_key=q1_routing_key) + + ch.queue_declare(q2_name, auto_delete=True) + self.addCleanup(self._connect().channel().queue_delete, q2_name) + ch.queue_bind(q2_name, exchange=exg_name, routing_key=q2_routing_key) + + # Deposit messages in the queues + q1_tx_message_bodies = ['q1_message+%s' % (i,) + for i in pika.compat.xrange(100)] + for message_body in q1_tx_message_bodies: + ch.publish(exg_name, q1_routing_key, body=message_body, + mandatory=True) + + q2_tx_message_bodies = ['q2_message+%s' % (i,) + for i in pika.compat.xrange(150)] + for message_body in q2_tx_message_bodies: + ch.publish(exg_name, q2_routing_key, body=message_body, + mandatory=True) + + # Create the consumers + q1_rx_messages = [] + q1_consumer_tag = ch.basic_consume( + lambda *args: q1_rx_messages.append(args), + q1_name, + no_ack=False, + exclusive=False, + arguments=None) + + q2_rx_messages = [] + q2_consumer_tag = ch.basic_consume( + lambda *args: q2_rx_messages.append(args), + q2_name, + no_ack=False, + exclusive=False, + arguments=None) + + # Wait for all messages to be delivered + while (len(q1_rx_messages) < len(q1_tx_message_bodies) or + len(q2_rx_messages) < len(q2_tx_message_bodies)): + connection.process_data_events(time_limit=None) + + self.assertEqual(len(q2_rx_messages), len(q2_tx_message_bodies)) + + # Verify the messages + def validate_messages(rx_messages, + routing_key, + consumer_tag, + tx_message_bodies): + self.assertEqual(len(rx_messages), len(tx_message_bodies)) + + for msg, expected_body in zip(rx_messages, tx_message_bodies): + self.assertIsInstance(msg, tuple) + rx_ch, rx_method, rx_properties, rx_body = msg + self.assertIs(rx_ch, ch) + self.assertIsInstance(rx_method, pika.spec.Basic.Deliver) + self.assertEqual(rx_method.consumer_tag, consumer_tag) + self.assertFalse(rx_method.redelivered) + self.assertEqual(rx_method.exchange, exg_name) + self.assertEqual(rx_method.routing_key, routing_key) + + self.assertIsInstance(rx_properties, pika.BasicProperties) + self.assertEqual(rx_body, as_bytes(expected_body)) + + # Validate q1 consumed messages + validate_messages(rx_messages=q1_rx_messages, + routing_key=q1_routing_key, + consumer_tag=q1_consumer_tag, + tx_message_bodies=q1_tx_message_bodies) + + # Validate q2 consumed messages + validate_messages(rx_messages=q2_rx_messages, + routing_key=q2_routing_key, + consumer_tag=q2_consumer_tag, + tx_message_bodies=q2_tx_message_bodies) + + # There shouldn't be any more events now + self.assertFalse(ch._pending_events) + + +class TestBasicCancelPurgesPendingConsumerCancellationEvt(BlockingTestCaseBase): + + def test(self): + """BlockingChannel.basic_cancel purges pending _ConsumerCancellationEvt""" # pylint: disable=C0301 + connection = self._connect() + + ch = connection.channel() + + q_name = ('TestBasicCancelPurgesPendingConsumerCancellationEvt_q' + + uuid.uuid1().hex) + + ch.queue_declare(q_name) + self.addCleanup(self._connect().channel().queue_delete, q_name) + + ch.publish('', routing_key=q_name, body='via-publish', mandatory=True) + + # Create a consumer + rx_messages = [] + consumer_tag = ch.basic_consume( + lambda *args: rx_messages.append(args), + q_name, + no_ack=False, + exclusive=False, + arguments=None) + + # Wait for the published message to arrive, but don't consume it + while not ch._pending_events: + # Issue synchronous command that forces processing of incoming I/O + connection.channel().close() + + self.assertEqual(len(ch._pending_events), 1) + self.assertIsInstance(ch._pending_events[0], + blocking_connection._ConsumerDeliveryEvt) + + # Delete the queue and wait for broker-initiated consumer cancellation + ch.queue_delete(q_name) + while len(ch._pending_events) < 2: + # Issue synchronous command that forces processing of incoming I/O + connection.channel().close() + + self.assertEqual(len(ch._pending_events), 2) + self.assertIsInstance(ch._pending_events[1], + blocking_connection._ConsumerCancellationEvt) + + # Issue consumer cancellation and verify that the pending + # _ConsumerCancellationEvt instance was removed + messages = ch.basic_cancel(consumer_tag) + self.assertEqual(messages, []) + + self.assertEqual(len(ch._pending_events), 0) + + +class TestBasicPublishWithoutPubacks(BlockingTestCaseBase): + + def test(self): # pylint: disable=R0914,R0915 + """BlockingChannel.basic_publish without pubacks""" + connection = self._connect() + + ch = connection.channel() + + q_name = 'TestBasicPublishWithoutPubacks_q' + uuid.uuid1().hex + exg_name = 'TestBasicPublishWithoutPubacks_exg_' + uuid.uuid1().hex + routing_key = 'TestBasicPublishWithoutPubacks' + + # Declare a new exchange + ch.exchange_declare(exg_name, exchange_type='direct') + self.addCleanup(connection.channel().exchange_delete, exg_name) + + # Declare a new queue + ch.queue_declare(q_name, auto_delete=True) + self.addCleanup(self._connect().channel().queue_delete, q_name) + + # Bind the queue to the exchange using routing key + ch.queue_bind(q_name, exchange=exg_name, routing_key=routing_key) + + # Deposit a message in the queue via basic_publish and mandatory=True + msg1_headers = dict( + test_name='TestBasicPublishWithoutPubacks') + msg1_properties = pika.spec.BasicProperties(headers=msg1_headers) + res = ch.basic_publish(exg_name, routing_key=routing_key, + body='via-basic_publish_mandatory=True', + properties=msg1_properties, + mandatory=True) + self.assertEqual(res, True) + + # Deposit a message in the queue via basic_publish and mandatory=False + res = ch.basic_publish(exg_name, routing_key=routing_key, + body='via-basic_publish_mandatory=False', + mandatory=False) + self.assertEqual(res, True) + + # Wait for the messages to arrive in queue + self._assert_exact_message_count_with_retries(channel=ch, + queue=q_name, + expected_count=2) + + # Create a consumer + rx_messages = [] + consumer_tag = ch.basic_consume( + lambda *args: rx_messages.append(args), + q_name, + no_ack=False, + exclusive=False, + arguments=None) + + # Wait for first message to arrive + while not rx_messages: + connection.process_data_events(time_limit=None) + + self.assertGreaterEqual(len(rx_messages), 1) + + # Check the first message + msg = rx_messages[0] + self.assertIsInstance(msg, tuple) + rx_ch, rx_method, rx_properties, rx_body = msg + self.assertIs(rx_ch, ch) + self.assertIsInstance(rx_method, pika.spec.Basic.Deliver) + self.assertEqual(rx_method.consumer_tag, consumer_tag) + self.assertEqual(rx_method.delivery_tag, 1) + self.assertFalse(rx_method.redelivered) + self.assertEqual(rx_method.exchange, exg_name) + self.assertEqual(rx_method.routing_key, routing_key) + + self.assertIsInstance(rx_properties, pika.BasicProperties) + self.assertEqual(rx_properties.headers, msg1_headers) + self.assertEqual(rx_body, as_bytes('via-basic_publish_mandatory=True')) + + # There shouldn't be any more events now + self.assertFalse(ch._pending_events) + + # Ack the message so that the next one can arrive (we configured QoS + # with prefetch_count=1) + ch.basic_ack(delivery_tag=rx_method.delivery_tag, multiple=False) + + # Get the second message + while len(rx_messages) < 2: + connection.process_data_events(time_limit=None) + + self.assertEqual(len(rx_messages), 2) + + msg = rx_messages[1] + self.assertIsInstance(msg, tuple) + rx_ch, rx_method, rx_properties, rx_body = msg + self.assertIs(rx_ch, ch) + self.assertIsInstance(rx_method, pika.spec.Basic.Deliver) + self.assertEqual(rx_method.consumer_tag, consumer_tag) + self.assertEqual(rx_method.delivery_tag, 2) + self.assertFalse(rx_method.redelivered) + self.assertEqual(rx_method.exchange, exg_name) + self.assertEqual(rx_method.routing_key, routing_key) + + self.assertIsInstance(rx_properties, pika.BasicProperties) + self.assertEqual(rx_body, as_bytes('via-basic_publish_mandatory=False')) + + # There shouldn't be any more events now + self.assertFalse(ch._pending_events) + + ch.basic_ack(delivery_tag=rx_method.delivery_tag, multiple=False) + + # Verify that the queue is now empty + self._assert_exact_message_count_with_retries(channel=ch, + queue=q_name, + expected_count=0) + + # Attempt to consume again with a short timeout + connection.process_data_events(time_limit=0.005) + self.assertEqual(len(rx_messages), 2) + + +class TestPublishFromBasicConsumeCallback(BlockingTestCaseBase): + + def test(self): + """BlockingChannel.basic_publish from basic_consume callback + """ + connection = self._connect() + + ch = connection.channel() + + src_q_name = ( + 'TestPublishFromBasicConsumeCallback_src_q' + uuid.uuid1().hex) + dest_q_name = ( + 'TestPublishFromBasicConsumeCallback_dest_q' + uuid.uuid1().hex) + + # Place channel in publisher-acknowledgments mode so that publishing + # with mandatory=True will be synchronous + ch.confirm_delivery() + + # Declare source and destination queues + ch.queue_declare(src_q_name, auto_delete=True) + self.addCleanup(self._connect().channel().queue_delete, src_q_name) + ch.queue_declare(dest_q_name, auto_delete=True) + self.addCleanup(self._connect().channel().queue_delete, dest_q_name) + + # Deposit a message in the source queue + ch.publish('', + routing_key=src_q_name, + body='via-publish', + mandatory=True) + + # Create a consumer + def on_consume(channel, method, props, body): + channel.publish( + '', routing_key=dest_q_name, body=body, + properties=props, mandatory=True) + channel.basic_ack(method.delivery_tag) + + ch.basic_consume(on_consume, + src_q_name, + no_ack=False, + exclusive=False, + arguments=None) + + # Consume from destination queue + for _, _, rx_body in ch.consume(dest_q_name, no_ack=True): + self.assertEqual(rx_body, as_bytes('via-publish')) + break + else: + self.fail('failed to consume a messages from destination q') + + +class TestStopConsumingFromBasicConsumeCallback(BlockingTestCaseBase): + + def test(self): + """BlockingChannel.stop_consuming from basic_consume callback + """ + connection = self._connect() + + ch = connection.channel() + + q_name = ( + 'TestStopConsumingFromBasicConsumeCallback_q' + uuid.uuid1().hex) + + # Place channel in publisher-acknowledgments mode so that publishing + # with mandatory=True will be synchronous + ch.confirm_delivery() + + # Declare the queue + ch.queue_declare(q_name, auto_delete=False) + self.addCleanup(connection.channel().queue_delete, q_name) + + # Deposit two messages in the queue + ch.publish('', + routing_key=q_name, + body='via-publish1', + mandatory=True) + + ch.publish('', + routing_key=q_name, + body='via-publish2', + mandatory=True) + + # Create a consumer + def on_consume(channel, method, props, body): # pylint: disable=W0613 + channel.stop_consuming() + channel.basic_ack(method.delivery_tag) + + ch.basic_consume(on_consume, + q_name, + no_ack=False, + exclusive=False, + arguments=None) + + ch.start_consuming() + + ch.close() + + ch = connection.channel() + + # Verify that only the second message is present in the queue + _, _, rx_body = ch.basic_get(q_name) + self.assertEqual(rx_body, as_bytes('via-publish2')) + + msg = ch.basic_get(q_name) + self.assertTupleEqual(msg, (None, None, None)) + + +class TestCloseChannelFromBasicConsumeCallback(BlockingTestCaseBase): + + def test(self): + """BlockingChannel.close from basic_consume callback + """ + connection = self._connect() + + ch = connection.channel() + + q_name = ( + 'TestCloseChannelFromBasicConsumeCallback_q' + uuid.uuid1().hex) + + # Place channel in publisher-acknowledgments mode so that publishing + # with mandatory=True will be synchronous + ch.confirm_delivery() + + # Declare the queue + ch.queue_declare(q_name, auto_delete=False) + self.addCleanup(connection.channel().queue_delete, q_name) + + # Deposit two messages in the queue + ch.publish('', + routing_key=q_name, + body='via-publish1', + mandatory=True) + + ch.publish('', + routing_key=q_name, + body='via-publish2', + mandatory=True) + + # Create a consumer + def on_consume(channel, method, props, body): # pylint: disable=W0613 + channel.close() + + ch.basic_consume(on_consume, + q_name, + no_ack=False, + exclusive=False, + arguments=None) + + ch.start_consuming() + + self.assertTrue(ch.is_closed) + + + # Verify that both messages are present in the queue + ch = connection.channel() + _, _, rx_body = ch.basic_get(q_name) + self.assertEqual(rx_body, as_bytes('via-publish1')) + _, _, rx_body = ch.basic_get(q_name) + self.assertEqual(rx_body, as_bytes('via-publish2')) + + +class TestCloseConnectionFromBasicConsumeCallback(BlockingTestCaseBase): + + def test(self): + """BlockingConnection.close from basic_consume callback + """ + connection = self._connect() + + ch = connection.channel() + + q_name = ( + 'TestCloseConnectionFromBasicConsumeCallback_q' + uuid.uuid1().hex) + + # Place channel in publisher-acknowledgments mode so that publishing + # with mandatory=True will be synchronous + ch.confirm_delivery() + + # Declare the queue + ch.queue_declare(q_name, auto_delete=False) + self.addCleanup(self._connect().channel().queue_delete, q_name) + + # Deposit two messages in the queue + ch.publish('', + routing_key=q_name, + body='via-publish1', + mandatory=True) + + ch.publish('', + routing_key=q_name, + body='via-publish2', + mandatory=True) + + # Create a consumer + def on_consume(channel, method, props, body): # pylint: disable=W0613 + connection.close() + + ch.basic_consume(on_consume, + q_name, + no_ack=False, + exclusive=False, + arguments=None) + + ch.start_consuming() + + self.assertTrue(ch.is_closed) + self.assertTrue(connection.is_closed) + + + # Verify that both messages are present in the queue + ch = self._connect().channel() + _, _, rx_body = ch.basic_get(q_name) + self.assertEqual(rx_body, as_bytes('via-publish1')) + _, _, rx_body = ch.basic_get(q_name) + self.assertEqual(rx_body, as_bytes('via-publish2')) + + +class TestNonPubAckPublishAndConsumeHugeMessage(BlockingTestCaseBase): + + def test(self): + """BlockingChannel.publish/consume huge message""" + connection = self._connect() + + ch = connection.channel() + + q_name = 'TestPublishAndConsumeHugeMessage_q' + uuid.uuid1().hex + body = 'a' * 1000000 + + # Declare a new queue + ch.queue_declare(q_name, auto_delete=False) + self.addCleanup(self._connect().channel().queue_delete, q_name) + + # Publish a message to the queue by way of default exchange + ch.publish(exchange='', routing_key=q_name, body=body) + LOGGER.info('Published message body size=%s', len(body)) + + # Consume the message + for rx_method, rx_props, rx_body in ch.consume(q_name, no_ack=False, + exclusive=False, + arguments=None): + self.assertIsInstance(rx_method, pika.spec.Basic.Deliver) + self.assertEqual(rx_method.delivery_tag, 1) + self.assertFalse(rx_method.redelivered) + self.assertEqual(rx_method.exchange, '') + self.assertEqual(rx_method.routing_key, q_name) + + self.assertIsInstance(rx_props, pika.BasicProperties) + self.assertEqual(rx_body, as_bytes(body)) + + # Ack the message + ch.basic_ack(delivery_tag=rx_method.delivery_tag, multiple=False) + + break + + # There shouldn't be any more events now + self.assertFalse(ch._queue_consumer_generator.pending_events) + + # Verify that the queue is now empty + ch.close() + ch = connection.channel() + self._assert_exact_message_count_with_retries(channel=ch, + queue=q_name, + expected_count=0) + + +class TestNonPubackPublishAndConsumeManyMessages(BlockingTestCaseBase): + + def test(self): + """BlockingChannel non-pub-ack publish/consume many messages""" + connection = self._connect() + + ch = connection.channel() + + q_name = ('TestNonPubackPublishAndConsumeManyMessages_q' + + uuid.uuid1().hex) + body = 'b' * 1024 + + num_messages_to_publish = 500 + + # Declare a new queue + ch.queue_declare(q_name, auto_delete=False) + self.addCleanup(self._connect().channel().queue_delete, q_name) + + for _ in pika.compat.xrange(num_messages_to_publish): + # Publish a message to the queue by way of default exchange + ch.publish(exchange='', routing_key=q_name, body=body) + + # Consume the messages + num_consumed = 0 + for rx_method, rx_props, rx_body in ch.consume(q_name, + no_ack=False, + exclusive=False, + arguments=None): + num_consumed += 1 + self.assertIsInstance(rx_method, pika.spec.Basic.Deliver) + self.assertEqual(rx_method.delivery_tag, num_consumed) + self.assertFalse(rx_method.redelivered) + self.assertEqual(rx_method.exchange, '') + self.assertEqual(rx_method.routing_key, q_name) + + self.assertIsInstance(rx_props, pika.BasicProperties) + self.assertEqual(rx_body, as_bytes(body)) + + # Ack the message + ch.basic_ack(delivery_tag=rx_method.delivery_tag, multiple=False) + + if num_consumed >= num_messages_to_publish: + break + + # There shouldn't be any more events now + self.assertFalse(ch._queue_consumer_generator.pending_events) + + ch.close() + + self.assertIsNone(ch._queue_consumer_generator) + + # Verify that the queue is now empty + ch = connection.channel() + self._assert_exact_message_count_with_retries(channel=ch, + queue=q_name, + expected_count=0) + + +class TestBasicCancelWithNonAckableConsumer(BlockingTestCaseBase): + + def test(self): + """BlockingChannel user cancels non-ackable consumer via basic_cancel""" + connection = self._connect() + + ch = connection.channel() + + q_name = ( + 'TestBasicCancelWithNonAckableConsumer_q' + uuid.uuid1().hex) + + body1 = 'a' * 1024 + body2 = 'b' * 2048 + + # Declare a new queue + ch.queue_declare(q_name, auto_delete=False) + self.addCleanup(self._connect().channel().queue_delete, q_name) + + # Publish two messages to the queue by way of default exchange + ch.publish(exchange='', routing_key=q_name, body=body1) + ch.publish(exchange='', routing_key=q_name, body=body2) + + # Wait for queue to contain both messages + self._assert_exact_message_count_with_retries(channel=ch, + queue=q_name, + expected_count=2) + + # Create a non-ackable consumer + consumer_tag = ch.basic_consume(lambda *x: None, q_name, no_ack=True, + exclusive=False, arguments=None) + + # Wait for all messages to be sent by broker to client + self._assert_exact_message_count_with_retries(channel=ch, + queue=q_name, + expected_count=0) + + # Cancel the consumer + messages = ch.basic_cancel(consumer_tag) + + # Both messages should have been on their way when we cancelled + self.assertEqual(len(messages), 2) + + _, _, rx_body1 = messages[0] + self.assertEqual(rx_body1, as_bytes(body1)) + + _, _, rx_body2 = messages[1] + self.assertEqual(rx_body2, as_bytes(body2)) + + ch.close() + + ch = connection.channel() + + # Verify that the queue is now empty + frame = ch.queue_declare(q_name, passive=True) + self.assertEqual(frame.method.message_count, 0) + + +class TestBasicCancelWithAckableConsumer(BlockingTestCaseBase): + + def test(self): + """BlockingChannel user cancels ackable consumer via basic_cancel""" + connection = self._connect() + + ch = connection.channel() + + q_name = ( + 'TestBasicCancelWithAckableConsumer_q' + uuid.uuid1().hex) + + body1 = 'a' * 1024 + body2 = 'b' * 2048 + + # Declare a new queue + ch.queue_declare(q_name, auto_delete=False) + self.addCleanup(self._connect().channel().queue_delete, q_name) + + # Publish two messages to the queue by way of default exchange + ch.publish(exchange='', routing_key=q_name, body=body1) + ch.publish(exchange='', routing_key=q_name, body=body2) + + # Wait for queue to contain both messages + self._assert_exact_message_count_with_retries(channel=ch, + queue=q_name, + expected_count=2) + + # Create an ackable consumer + consumer_tag = ch.basic_consume(lambda *x: None, q_name, no_ack=False, + exclusive=False, arguments=None) + + # Wait for all messages to be sent by broker to client + self._assert_exact_message_count_with_retries(channel=ch, + queue=q_name, + expected_count=0) + + # Cancel the consumer + messages = ch.basic_cancel(consumer_tag) + + # Both messages should have been on their way when we cancelled + self.assertEqual(len(messages), 0) + + ch.close() + + ch = connection.channel() + + # Verify that canceling the ackable consumer restored both messages + self._assert_exact_message_count_with_retries(channel=ch, + queue=q_name, + expected_count=2) + + +class TestUnackedMessageAutoRestoredToQueueOnChannelClose(BlockingTestCaseBase): + + def test(self): + """BlockingChannel unacked message restored to q on channel close """ + connection = self._connect() + + ch = connection.channel() + + q_name = ('TestUnackedMessageAutoRestoredToQueueOnChannelClose_q' + + uuid.uuid1().hex) + + body1 = 'a' * 1024 + body2 = 'b' * 2048 + + # Declare a new queue + ch.queue_declare(q_name, auto_delete=False) + self.addCleanup(self._connect().channel().queue_delete, q_name) + + # Publish two messages to the queue by way of default exchange + ch.publish(exchange='', routing_key=q_name, body=body1) + ch.publish(exchange='', routing_key=q_name, body=body2) + + # Consume the events, but don't ack + rx_messages = [] + ch.basic_consume(lambda *args: rx_messages.append(args), + q_name, + no_ack=False, + exclusive=False, + arguments=None) + while len(rx_messages) != 2: + connection.process_data_events(time_limit=None) + + self.assertEqual(rx_messages[0][1].delivery_tag, 1) + self.assertEqual(rx_messages[1][1].delivery_tag, 2) + + # Verify no more ready messages in queue + frame = ch.queue_declare(q_name, passive=True) + self.assertEqual(frame.method.message_count, 0) + + # Closing channel should restore messages back to queue + ch.close() + + # Verify that there are two messages in q now + ch = connection.channel() + + self._assert_exact_message_count_with_retries(channel=ch, + queue=q_name, + expected_count=2) + + +class TestNoAckMessageNotRestoredToQueueOnChannelClose(BlockingTestCaseBase): + + def test(self): + """BlockingChannel unacked message restored to q on channel close """ + connection = self._connect() + + ch = connection.channel() + + q_name = ('TestNoAckMessageNotRestoredToQueueOnChannelClose_q' + + uuid.uuid1().hex) + + body1 = 'a' * 1024 + body2 = 'b' * 2048 + + # Declare a new queue + ch.queue_declare(q_name, auto_delete=False) + self.addCleanup(self._connect().channel().queue_delete, q_name) + + # Publish two messages to the queue by way of default exchange + ch.publish(exchange='', routing_key=q_name, body=body1) + ch.publish(exchange='', routing_key=q_name, body=body2) + + # Consume, but don't ack + num_messages = 0 + for rx_method, _, _ in ch.consume(q_name, no_ack=True, exclusive=False): + num_messages += 1 + + self.assertEqual(rx_method.delivery_tag, num_messages) + + if num_messages == 2: + break + else: + self.fail('expected 2 messages, but consumed %i' % (num_messages,)) + + # Verify no more ready messages in queue + frame = ch.queue_declare(q_name, passive=True) + self.assertEqual(frame.method.message_count, 0) + + # Closing channel should not restore no-ack messages back to queue + ch.close() + + # Verify that there are no messages in q now + ch = connection.channel() + frame = ch.queue_declare(q_name, passive=True) + self.assertEqual(frame.method.message_count, 0) + + +class TestConsumeInactivityTimeout(BlockingTestCaseBase): + + def test(self): + """BlockingChannel consume returns 3-tuple on inactivity timeout """ + connection = self._connect() + + ch = connection.channel() + + q_name = ('TestConsumeInactivityTimeout_q' + + uuid.uuid1().hex) + + # Declare a new queue + ch.queue_declare(q_name, auto_delete=True) + + # Consume, but don't ack + for msg in ch.consume(q_name, inactivity_timeout=0.1): + a, b, c = msg + self.assertIsNone(a) + self.assertIsNone(b) + self.assertIsNone(c) + break + else: + self.fail('expected (None, None, None), but got %s' % msg) + + ch.close() + + +class TestChannelFlow(BlockingTestCaseBase): + + def test(self): + """BlockingChannel Channel.Flow activate and deactivate """ + connection = self._connect() + + ch = connection.channel() + + q_name = ('TestChannelFlow_q' + uuid.uuid1().hex) + + # Declare a new queue + ch.queue_declare(q_name, auto_delete=False) + self.addCleanup(self._connect().channel().queue_delete, q_name) + + # Verify zero active consumers on the queue + frame = ch.queue_declare(q_name, passive=True) + self.assertEqual(frame.method.consumer_count, 0) + + # Create consumer + ch.basic_consume(lambda *args: None, q_name) + + # Verify one active consumer on the queue now + frame = ch.queue_declare(q_name, passive=True) + self.assertEqual(frame.method.consumer_count, 1) + + # Activate flow from default state (active by default) + active = ch.flow(True) + self.assertEqual(active, True) + + # Verify still one active consumer on the queue now + frame = ch.queue_declare(q_name, passive=True) + self.assertEqual(frame.method.consumer_count, 1) + + # active=False is not supported by RabbitMQ per + # https://www.rabbitmq.com/specification.html: + # "active=false is not supported by the server. Limiting prefetch with + # basic.qos provides much better control" +## # Deactivate flow +## active = ch.flow(False) +## self.assertEqual(active, False) +## +## # Verify zero active consumers on the queue now +## frame = ch.queue_declare(q_name, passive=True) +## self.assertEqual(frame.method.consumer_count, 0) +## +## # Re-activate flow +## active = ch.flow(True) +## self.assertEqual(active, True) +## +## # Verify one active consumers on the queue once again +## frame = ch.queue_declare(q_name, passive=True) +## self.assertEqual(frame.method.consumer_count, 1) + + +if __name__ == '__main__': + unittest.main() diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/tests/acceptance/enforce_one_basicget_test.py b/NodeRed/NodeRedFiles/pika-0.13.1/tests/acceptance/enforce_one_basicget_test.py new file mode 100644 index 000000000..8a65ac3d7 --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/tests/acceptance/enforce_one_basicget_test.py @@ -0,0 +1,29 @@ +import unittest + +from mock import MagicMock +from pika.frame import Method, Header +from pika.exceptions import DuplicateGetOkCallback +from pika.channel import Channel +from pika.connection import Connection + + +class OnlyOneBasicGetTestCase(unittest.TestCase): + def setUp(self): + self.channel = Channel(MagicMock(Connection)(), 0, None) + self.channel._state = Channel.OPEN + self.callback = MagicMock() + + def test_two_basic_get_with_callback(self): + self.channel.basic_get(self.callback) + self.channel._on_getok(MagicMock(Method)(), MagicMock(Header)(), '') + self.channel.basic_get(self.callback) + self.channel._on_getok(MagicMock(Method)(), MagicMock(Header)(), '') + self.assertEqual(self.callback.call_count, 2) + + def test_two_basic_get_without_callback(self): + self.channel.basic_get(self.callback) + with self.assertRaises(DuplicateGetOkCallback): + self.channel.basic_get(self.callback) + +if __name__ == '__main__': + unittest.main() diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/tests/acceptance/forward_server.py b/NodeRed/NodeRedFiles/pika-0.13.1/tests/acceptance/forward_server.py new file mode 100644 index 000000000..a2ea48261 --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/tests/acceptance/forward_server.py @@ -0,0 +1,526 @@ +"""TCP/IP forwarding/echo service for testing.""" + +from __future__ import print_function + +import array +from datetime import datetime +import errno +from functools import partial +import logging +import multiprocessing +import os +import socket +import struct +import sys +import threading +import traceback + +import pika.compat + +if pika.compat.PY3: + + def buffer(object, offset, size): # pylint: disable=W0622 + """array etc. have the buffer protocol""" + return object[offset:offset + size] + + +try: + import SocketServer +except ImportError: + import socketserver as SocketServer # pylint: disable=F0401 + + +def _trace(fmt, *args): + """Format and output the text to stderr""" + print((fmt % args) + "\n", end="", file=sys.stderr) + + +class ForwardServer(object): # pylint: disable=R0902 + """ Implement a TCP/IP forwarding/echo service for testing. Listens for + an incoming TCP/IP connection, accepts it, then connects to the given + remote address and forwards data back and forth between the two + endpoints. + + This is similar to the subset of `netcat` functionality, but without + dependency on any specific flavor of netcat + + Connection forwarding example; forward local connection to default + rabbitmq addr, connect to rabbit via forwarder, then disconnect + forwarder, then attempt another pika operation to see what happens + + with ForwardServer(("localhost", 5672)) as fwd: + params = pika.ConnectionParameters( + host=fwd.server_address[0], + port=fwd.server_address[1]) + conn = pika.BlockingConnection(params) + + # Once outside the context, the forwarder is disconnected + + # Let's see what happens in pika with a disconnected server + channel = conn.channel() + + Echo server example + def produce(sock): + sock.sendall("12345") + sock.shutdown(socket.SHUT_WR) + + with ForwardServer(None) as fwd: + sock = socket.socket() + sock.connect(fwd.server_address) + + worker = threading.Thread(target=produce, + args=[sock]) + worker.start() + + data = sock.makefile().read() + assert data == "12345", data + + worker.join() + + """ + # Amount of time, in seconds, we're willing to wait for the subprocess + _SUBPROC_TIMEOUT = 10 + + def __init__( + self, # pylint: disable=R0913 + remote_addr, + remote_addr_family=socket.AF_INET, + remote_socket_type=socket.SOCK_STREAM, + server_addr=("127.0.0.1", 0), + server_addr_family=socket.AF_INET, + server_socket_type=socket.SOCK_STREAM, + local_linger_args=None): + """ + :param tuple remote_addr: remote server's IP address, whose structure + depends on remote_addr_family; pair (host-or-ip-addr, port-number). + Pass None to have ForwardServer behave as echo server. + :param remote_addr_family: socket.AF_INET (the default), socket.AF_INET6 + or socket.AF_UNIX. + :param remote_socket_type: only socket.SOCK_STREAM is supported at this + time + :param server_addr: optional address for binding this server's listening + socket; the format depends on server_addr_family; defaults to + ("127.0.0.1", 0) + :param server_addr_family: Address family for this server's listening + socket; socket.AF_INET (the default), socket.AF_INET6 or + socket.AF_UNIX; defaults to socket.AF_INET + :param server_socket_type: only socket.SOCK_STREAM is supported at this + time + :param tuple local_linger_args: SO_LINGER sockoverride for the local + connection sockets, to be configured after connection is accepted. + None for default, which is to not change the SO_LINGER option. + Otherwise, its a two-tuple, where the first element is the `l_onoff` + switch, and the second element is the `l_linger` value, in seconds + """ + self._logger = logging.getLogger(__name__) + + self._remote_addr = remote_addr + self._remote_addr_family = remote_addr_family + assert remote_socket_type == socket.SOCK_STREAM, remote_socket_type + self._remote_socket_type = remote_socket_type + + assert server_addr is not None + self._server_addr = server_addr + + assert server_addr_family is not None + self._server_addr_family = server_addr_family + + assert server_socket_type == socket.SOCK_STREAM, server_socket_type + self._server_socket_type = server_socket_type + + self._local_linger_args = local_linger_args + + self._subproc = None + + @property + def running(self): + """Property: True if ForwardServer is active""" + return self._subproc is not None + + @property + def server_address_family(self): + """Property: Get listening socket's address family + + NOTE: undefined before server starts and after it shuts down + """ + assert self._server_addr_family is not None, "Not in context" + + return self._server_addr_family + + @property + def server_address(self): + """ Property: Get listening socket's address; the returned value + depends on the listening socket's address family + + NOTE: undefined before server starts and after it shuts down + """ + assert self._server_addr is not None, "Not in context" + + return self._server_addr + + def __enter__(self): + """ Context manager entry. Starts the forwarding server + + :returns: self + """ + return self.start() + + def __exit__(self, *args): + """ Context manager exit; stops the forwarding server + """ + self.stop() + + def start(self): + """ Start the server + + NOTE: The context manager is the recommended way to use + ForwardServer. start()/stop() are alternatives to the context manager + use case and are mutually exclusive with it. + + :returns: self + """ + queue = multiprocessing.Queue() + + self._subproc = multiprocessing.Process( + target=_run_server, + kwargs=dict( + local_addr=self._server_addr, + local_addr_family=self._server_addr_family, + local_socket_type=self._server_socket_type, + local_linger_args=self._local_linger_args, + remote_addr=self._remote_addr, + remote_addr_family=self._remote_addr_family, + remote_socket_type=self._remote_socket_type, + queue=queue)) + self._subproc.daemon = True + self._subproc.start() + + try: + # Get server socket info from subprocess + self._server_addr_family, self._server_addr = queue.get( + block=True, timeout=self._SUBPROC_TIMEOUT) + queue.close() + except Exception: # pylint: disable=W0703 + try: + self._logger.exception( + "Failed while waiting for local socket info") + # Preserve primary exception and traceback + raise + finally: + # Clean up + try: + self.stop() + except Exception: # pylint: disable=W0703 + # Suppress secondary exception in favor of the primary + self._logger.exception( + "Emergency subprocess shutdown failed") + + return self + + def stop(self): + """Stop the server + + NOTE: The context manager is the recommended way to use + ForwardServer. start()/stop() are alternatives to the context manager + use case and are mutually exclusive with it. + """ + self._logger.info("ForwardServer STOPPING") + + try: + self._subproc.terminate() + self._subproc.join(timeout=self._SUBPROC_TIMEOUT) + if self._subproc.is_alive(): + self._logger.error( + "ForwardServer failed to terminate, killing it") + os.kill(self._subproc.pid) + self._subproc.join(timeout=self._SUBPROC_TIMEOUT) + assert not self._subproc.is_alive(), self._subproc + + # Log subprocess's exit code; NOTE: negative signal.SIGTERM (usually + # -15) is normal on POSIX systems - it corresponds to SIGTERM + exit_code = self._subproc.exitcode + self._logger.info("ForwardServer terminated with exitcode=%s", + exit_code) + finally: + self._subproc = None + + +def _run_server( + local_addr, + local_addr_family, + local_socket_type, # pylint: disable=R0913 + local_linger_args, + remote_addr, + remote_addr_family, + remote_socket_type, + queue): + """ Run the server; executed in the subprocess + + :param local_addr: listening address + :param local_addr_family: listening address family; one of socket.AF_* + :param local_socket_type: listening socket type; typically + socket.SOCK_STREAM + :param tuple local_linger_args: SO_LINGER sockoverride for the local + connection sockets, to be configured after connection is accepted. + Pass None to not change SO_LINGER. Otherwise, its a two-tuple, where the + first element is the `l_onoff` switch, and the second element is the + `l_linger` value in seconds + :param remote_addr: address of the target server. Pass None to have + ForwardServer behave as echo server + :param remote_addr_family: address family for connecting to target server; + one of socket.AF_* + :param remote_socket_type: socket type for connecting to target server; + typically socket.SOCK_STREAM + :param multiprocessing.Queue queue: queue for depositing the forwarding + server's actual listening socket address family and bound address. The + parent process waits for this. + """ + + # NOTE: We define _ThreadedTCPServer class as a closure in order to + # override some of its class members dynamically + # NOTE: we add `object` to the base classes because `_ThreadedTCPServer` + # isn't derived from `object`, which prevents `super` from working properly + class _ThreadedTCPServer(SocketServer.ThreadingMixIn, + SocketServer.TCPServer, object): + """Threaded streaming server for forwarding""" + + # Override TCPServer's class members + address_family = local_addr_family + socket_type = local_socket_type + allow_reuse_address = True + + def __init__(self): + + handler_class_factory = partial( + _TCPHandler, + local_linger_args=local_linger_args, + remote_addr=remote_addr, + remote_addr_family=remote_addr_family, + remote_socket_type=remote_socket_type) + + super(_ThreadedTCPServer, self).__init__( + local_addr, handler_class_factory, bind_and_activate=True) + + server = _ThreadedTCPServer() + + # Send server socket info back to parent process + queue.put([server.socket.family, server.server_address]) + + queue.close() + + server.serve_forever() + + +# NOTE: we add `object` to the base classes because `StreamRequestHandler` isn't +# derived from `object`, which prevents `super` from working properly +class _TCPHandler(SocketServer.StreamRequestHandler, object): + """TCP/IP session handler instantiated by TCPServer upon incoming + connection. Implements forwarding/echo of the incoming connection. + """ + + _SOCK_RX_BUF_SIZE = 16 * 1024 + + def __init__( + self, # pylint: disable=R0913 + request, + client_address, + server, + local_linger_args, + remote_addr, + remote_addr_family, + remote_socket_type): + """ + :param request: for super + :param client_address: for super + "paarm server: for super + :param tuple local_linger_args: SO_LINGER sockoverride for the local + connection sockets, to be configured after connection is accepted. + Pass None to not change SO_LINGER. Otherwise, its a two-tuple, where + the first element is the `l_onoff` switch, and the second element is + the `l_linger` value in seconds + :param remote_addr: address of the target server. Pass None to have + ForwardServer behave as echo server. + :param remote_addr_family: address family for connecting to target + server; one of socket.AF_* + :param remote_socket_type: socket type for connecting to target server; + typically socket.SOCK_STREAM + :param **kwargs: kwargs for super class + """ + self._local_linger_args = local_linger_args + self._remote_addr = remote_addr + self._remote_addr_family = remote_addr_family + self._remote_socket_type = remote_socket_type + + super(_TCPHandler, self).__init__( + request=request, client_address=client_address, server=server) + + def handle(self): # pylint: disable=R0912 + """Connect to remote and forward data between local and remote""" + local_sock = self.connection + + if self._local_linger_args is not None: + # Set SO_LINGER socket options on local socket + l_onoff, l_linger = self._local_linger_args + local_sock.setsockopt(socket.SOL_SOCKET, socket.SO_LINGER, + struct.pack('ii', l_onoff, l_linger)) + + if self._remote_addr is not None: + # Forwarding set-up + remote_dest_sock = remote_src_sock = socket.socket( + family=self._remote_addr_family, + type=self._remote_socket_type, + proto=socket.IPPROTO_IP) + remote_dest_sock.connect(self._remote_addr) + _trace("%s _TCPHandler connected to remote %s", datetime.utcnow(), + remote_dest_sock.getpeername()) + else: + # Echo set-up + remote_dest_sock, remote_src_sock = \ + pika.compat._nonblocking_socketpair() + + try: + local_forwarder = threading.Thread( + target=self._forward, args=( + local_sock, + remote_dest_sock, + )) + local_forwarder.setDaemon(True) + local_forwarder.start() + + try: + self._forward(remote_src_sock, local_sock) + finally: + # Wait for local forwarder thread to exit + local_forwarder.join() + finally: + try: + try: + _safe_shutdown_socket(remote_dest_sock, socket.SHUT_RDWR) + finally: + if remote_src_sock is not remote_dest_sock: + _safe_shutdown_socket(remote_src_sock, socket.SHUT_RDWR) + finally: + remote_dest_sock.close() + if remote_src_sock is not remote_dest_sock: + remote_src_sock.close() + + def _forward(self, src_sock, dest_sock): # pylint: disable=R0912 + """Forward from src_sock to dest_sock""" + src_peername = src_sock.getpeername() + + _trace("%s forwarding from %s to %s", datetime.utcnow(), src_peername, + dest_sock.getpeername()) + try: + # NOTE: python 2.6 doesn't support bytearray with recv_into, so + # we use array.array instead; this is only okay as long as the + # array instance isn't shared across threads. See + # http://bugs.python.org/issue7827 and + # groups.google.com/forum/#!topic/comp.lang.python/M6Pqr-KUjQw + rx_buf = array.array("B", [0] * self._SOCK_RX_BUF_SIZE) + + while True: + try: + nbytes = src_sock.recv_into(rx_buf) + except pika.compat.SOCKET_ERROR as exc: + if exc.errno == errno.EINTR: + continue + elif exc.errno == errno.ECONNRESET: + # Source peer forcibly closed connection + _trace("%s errno.ECONNRESET from %s", datetime.utcnow(), + src_peername) + break + else: + _trace("%s Unexpected errno=%s from %s\n%s", + datetime.utcnow(), exc.errno, src_peername, + "".join(traceback.format_stack())) + raise + + if not nbytes: + # Source input EOF + _trace("%s EOF on %s", datetime.utcnow(), src_peername) + break + + try: + dest_sock.sendall(buffer(rx_buf, 0, nbytes)) + except pika.compat.SOCKET_ERROR as exc: + if exc.errno == errno.EPIPE: + # Destination peer closed its end of the connection + _trace("%s Destination peer %s closed its end of " + "the connection: errno.EPIPE", datetime.utcnow(), + dest_sock.getpeername()) + break + elif exc.errno == errno.ECONNRESET: + # Destination peer forcibly closed connection + _trace("%s Destination peer %s forcibly closed " + "connection: errno.ECONNRESET", + datetime.utcnow(), dest_sock.getpeername()) + break + else: + _trace("%s Unexpected errno=%s in sendall to %s\n%s", + datetime.utcnow(), exc.errno, + dest_sock.getpeername(), "".join( + traceback.format_stack())) + raise + except: + _trace("forward failed\n%s", "".join(traceback.format_exc())) + raise + finally: + _trace("%s done forwarding from %s", datetime.utcnow(), + src_peername) + try: + # Let source peer know we're done receiving + _safe_shutdown_socket(src_sock, socket.SHUT_RD) + finally: + # Let destination peer know we're done sending + _safe_shutdown_socket(dest_sock, socket.SHUT_WR) + + +def echo(port=0): + """ This function implements a simple echo server for testing the + Forwarder class. + + :param int port: port number on which to listen + + We run this function and it prints out the listening socket binding. + Then, we run Forwarder and point it at this echo "server". + Then, we run telnet and point it at forwarder and see if whatever we + type gets echoed back to us. + + This function exits when the remote end connects, then closes connection + """ + lsock = socket.socket() + lsock.bind(("", port)) + lsock.listen(1) + _trace("Listening on sockname=%s", lsock.getsockname()) + + sock, remote_addr = lsock.accept() + try: + _trace("Connection from peer=%s", remote_addr) + while True: + try: + data = sock.recv(4 * 1024) # pylint: disable=E1101 + except pika.compat.SOCKET_ERROR as exc: + if exc.errno == errno.EINTR: + continue + else: + raise + + if not data: + break + + sock.sendall(data) # pylint: disable=E1101 + finally: + try: + _safe_shutdown_socket(sock, socket.SHUT_RDWR) + finally: + sock.close() + + +def _safe_shutdown_socket(sock, how=socket.SHUT_RDWR): + """ Shutdown a socket, suppressing ENOTCONN + """ + try: + sock.shutdown(how) + except pika.compat.SOCKET_ERROR as exc: + if exc.errno != errno.ENOTCONN: + raise diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/tests/acceptance/test_utils.py b/NodeRed/NodeRedFiles/pika-0.13.1/tests/acceptance/test_utils.py new file mode 100644 index 000000000..adf5934cc --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/tests/acceptance/test_utils.py @@ -0,0 +1,73 @@ +"""Acceptance test utils""" + +import functools +import logging +import time +import traceback + + +def retry_assertion(timeout_sec, retry_interval_sec=0.1): + """Creates a decorator that retries the decorated function or + method only upon `AssertionError` exception at the given retry interval + not to exceed the overall given timeout. + + :param float timeout_sec: overall timeout in seconds + :param float retry_interval_sec: amount of time to sleep + between retries in seconds. + + :returns: decorator that implements the following behavior + + 1. This decorator guarantees to call the decorated function or method at + least once. + 2. It passes through all exceptions besides `AssertionError`, preserving the + original exception and its traceback. + 3. If no exception, it returns the return value from the decorated function/method. + 4. It sleeps `time.sleep(retry_interval_sec)` between retries. + 5. It checks for expiry of the overall timeout before sleeping. + 6. If the overall timeout is exceeded, it re-raises the latest `AssertionError`, + preserving its original traceback + """ + + def retry_assertion_decorator(func): + """Decorator""" + + @functools.wraps(func) + def retry_assertion_wrap(*args, **kwargs): + """The wrapper""" + + num_attempts = 0 + start_time = time.time() + + while True: + num_attempts += 1 + + try: + result = func(*args, **kwargs) + except AssertionError: + + now = time.time() + # Compensate for time adjustment + if now < start_time: + start_time = now + + if (now - start_time) > timeout_sec: + logging.exception( + 'Exceeded retry timeout of %s sec in %s attempts ' + 'with func %r. Caller\'s stack:\n%s', + timeout_sec, num_attempts, func, + ''.join(traceback.format_stack())) + raise + + logging.debug('Attempt %s failed; retrying %r in %s sec.', + num_attempts, func, retry_interval_sec) + + time.sleep(retry_interval_sec) + else: + logging.debug('%r succeeded at attempt %s', + func, num_attempts) + return result + + return retry_assertion_wrap + + return retry_assertion_decorator + diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/tests/unit/amqp_object_tests.py b/NodeRed/NodeRedFiles/pika-0.13.1/tests/unit/amqp_object_tests.py new file mode 100644 index 000000000..998a95b83 --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/tests/unit/amqp_object_tests.py @@ -0,0 +1,62 @@ +import unittest + +from pika import amqp_object + + +class AMQPObjectTests(unittest.TestCase): + def test_base_name(self): + self.assertEqual(amqp_object.AMQPObject().NAME, 'AMQPObject') + + def test_repr_no_items(self): + obj = amqp_object.AMQPObject() + self.assertEqual(repr(obj), '') + + def test_repr_items(self): + obj = amqp_object.AMQPObject() + setattr(obj, 'foo', 'bar') + setattr(obj, 'baz', 'qux') + self.assertEqual(repr(obj), "") + + +class ClassTests(unittest.TestCase): + def test_base_name(self): + self.assertEqual(amqp_object.Class().NAME, 'Unextended Class') + + +class MethodTests(unittest.TestCase): + def test_base_name(self): + self.assertEqual(amqp_object.Method().NAME, 'Unextended Method') + + def test_set_content_body(self): + properties = amqp_object.Properties() + body = 'This is a test' + obj = amqp_object.Method() + obj._set_content(properties, body) + self.assertEqual(obj._body, body) + + def test_set_content_properties(self): + properties = amqp_object.Properties() + body = 'This is a test' + obj = amqp_object.Method() + obj._set_content(properties, body) + self.assertEqual(obj._properties, properties) + + def test_get_body(self): + properties = amqp_object.Properties() + body = 'This is a test' + obj = amqp_object.Method() + obj._set_content(properties, body) + self.assertEqual(obj.get_body(), body) + + def test_get_properties(self): + properties = amqp_object.Properties() + body = 'This is a test' + obj = amqp_object.Method() + obj._set_content(properties, body) + self.assertEqual(obj.get_properties(), properties) + + +class PropertiesTests(unittest.TestCase): + def test_base_name(self): + self.assertEqual(amqp_object.Properties().NAME, + 'Unextended Properties') diff --git a/NodeRed/NodeRedFiles/pika-0.13.1/tests/unit/base_connection_tests.py b/NodeRed/NodeRedFiles/pika-0.13.1/tests/unit/base_connection_tests.py new file mode 100644 index 000000000..b010d729f --- /dev/null +++ b/NodeRed/NodeRedFiles/pika-0.13.1/tests/unit/base_connection_tests.py @@ -0,0 +1,85 @@ +""" +Tests for pika.base_connection.BaseConnection + +""" + +import socket +import unittest + +import mock + +import pika +import sys +import ssl + +import pika.tcp_socket_opts +from pika.adapters import base_connection + + +# If this is missing, set it manually. We need it to test tcp opt setting. +try: + socket.TCP_KEEPIDLE +except AttributeError: + socket.TCP_KEEPIDLE = 4 + + +class BaseConnectionTests(unittest.TestCase): + def setUp(self): + with mock.patch('pika.connection.Connection.connect'): + self.connection = base_connection.BaseConnection() + self.connection._set_connection_state( + base_connection.BaseConnection.CONNECTION_OPEN) + + def test_repr(self): + text = repr(self.connection) + self.assertTrue(text.startswith('I', encoded, offset)[0]") + print(prefix + "offset += 4") + print(prefix + "%s = encoded[offset:offset + length]" % cLvalue) + print(prefix + "try:") + print(prefix + " %s = str(%s)" % (cLvalue, cLvalue)) + print(prefix + "except UnicodeEncodeError:") + print(prefix + " pass") + print(prefix + "offset += length") + elif type == 'octet': + print(prefix + "%s = struct.unpack_from('B', encoded, offset)[0]" % + cLvalue) + print(prefix + "offset += 1") + elif type == 'short': + print(prefix + "%s = struct.unpack_from('>H', encoded, offset)[0]" % + cLvalue) + print(prefix + "offset += 2") + elif type == 'long': + print(prefix + "%s = struct.unpack_from('>I', encoded, offset)[0]" % + cLvalue) + print(prefix + "offset += 4") + elif type == 'longlong': + print(prefix + "%s = struct.unpack_from('>Q', encoded, offset)[0]" % + cLvalue) + print(prefix + "offset += 8") + elif type == 'timestamp': + print(prefix + "%s = struct.unpack_from('>Q', encoded, offset)[0]" % + cLvalue) + print(prefix + "offset += 8") + elif type == 'bit': + raise Exception("Can't decode bit in genSingleDecode") + elif type == 'table': + print(Exception(prefix + "(%s, offset) = data.decode_table(encoded, offset)" % + cLvalue)) + else: + raise Exception("Illegal domain in genSingleDecode", type) + + def genSingleEncode(prefix, cValue, unresolved_domain): + type = spec.resolveDomain(unresolved_domain) + if type == 'shortstr': + print(prefix + + "assert isinstance(%s, str_or_bytes),\\\n%s 'A non-string value was supplied for %s'" + % (cValue, prefix, cValue)) + print(prefix + "data.encode_short_string(pieces, %s)" % cValue) + elif type == 'longstr': + print(prefix + + "assert isinstance(%s, str_or_bytes),\\\n%s 'A non-string value was supplied for %s'" + % (cValue, prefix, cValue)) + print( + prefix + + "value = %s.encode('utf-8') if isinstance(%s, unicode_type) else %s" + % (cValue, cValue, cValue)) + print(prefix + "pieces.append(struct.pack('>I', len(value)))") + print(prefix + "pieces.append(value)") + elif type == 'octet': + print(prefix + "pieces.append(struct.pack('B', %s))" % cValue) + elif type == 'short': + print(prefix + "pieces.append(struct.pack('>H', %s))" % cValue) + elif type == 'long': + print(prefix + "pieces.append(struct.pack('>I', %s))" % cValue) + elif type == 'longlong': + print(prefix + "pieces.append(struct.pack('>Q', %s))" % cValue) + elif type == 'timestamp': + print(prefix + "pieces.append(struct.pack('>Q', %s))" % cValue) + elif type == 'bit': + raise Exception("Can't encode bit in genSingleEncode") + elif type == 'table': + print(Exception(prefix + "data.encode_table(pieces, %s)" % cValue)) + else: + raise Exception("Illegal domain in genSingleEncode", type) + + def genDecodeMethodFields(m): + print(" def decode(self, encoded, offset=0):") + bitindex = None + for f in m.arguments: + if spec.resolveDomain(f.domain) == 'bit': + if bitindex is None: + bitindex = 0 + if bitindex >= 8: + bitindex = 0 + if not bitindex: + print( + " bit_buffer = struct.unpack_from('B', encoded, offset)[0]") + print(" offset += 1") + print(" self.%s = (bit_buffer & (1 << %d)) != 0" % + (pyize(f.name), bitindex)) + bitindex += 1 + else: + bitindex = None + genSingleDecode(" ", "self.%s" % (pyize(f.name),), + f.domain) + print(" return self") + print('') + + def genDecodeProperties(c): + print(" def decode(self, encoded, offset=0):") + print(" flags = 0") + print(" flagword_index = 0") + print(" while True:") + print( + " partial_flags = struct.unpack_from('>H', encoded, offset)[0]") + print(" offset += 2") + print( + " flags = flags | (partial_flags << (flagword_index * 16))") + print(" if not (partial_flags & 1):") + print(" break") + print(" flagword_index += 1") + for f in c.fields: + if spec.resolveDomain(f.domain) == 'bit': + print(" self.%s = (flags & %s) != 0" % + (pyize(f.name), flagName(c, f))) + else: + print(" if flags & %s:" % (flagName(c, f),)) + genSingleDecode(" ", "self.%s" % (pyize(f.name),), + f.domain) + print(" else:") + print(" self.%s = None" % (pyize(f.name),)) + print(" return self") + print('') + + def genEncodeMethodFields(m): + print(" def encode(self):") + print(" pieces = list()") + bitindex = None + + def finishBits(): + if bitindex is not None: + print(" pieces.append(struct.pack('B', bit_buffer))") + + for f in m.arguments: + if spec.resolveDomain(f.domain) == 'bit': + if bitindex is None: + bitindex = 0 + print(" bit_buffer = 0") + if bitindex >= 8: + finishBits() + print(" bit_buffer = 0") + bitindex = 0 + print(" if self.%s:" % pyize(f.name)) + print(" bit_buffer = bit_buffer | (1 << %d)" % + bitindex) + bitindex += 1 + else: + finishBits() + bitindex = None + genSingleEncode(" ", "self.%s" % (pyize(f.name),), + f.domain) + finishBits() + print(" return pieces") + print('') + + def genEncodeProperties(c): + print(" def encode(self):") + print(" pieces = list()") + print(" flags = 0") + for f in c.fields: + if spec.resolveDomain(f.domain) == 'bit': + print(" if self.%s: flags = flags | %s" % + (pyize(f.name), flagName(c, f))) + else: + print(" if self.%s is not None:" % (pyize(f.name),)) + print(" flags = flags | %s" % (flagName(c, f),)) + genSingleEncode(" ", "self.%s" % (pyize(f.name),), + f.domain) + print(" flag_pieces = list()") + print(" while True:") + print(" remainder = flags >> 16") + print(" partial_flags = flags & 0xFFFE") + print(" if remainder != 0:") + print(" partial_flags |= 1") + print( + " flag_pieces.append(struct.pack('>H', partial_flags))") + print(" flags = remainder") + print(" if not flags:") + print(" break") + print(" return flag_pieces + pieces") + print('') + + def fieldDeclList(fields): + return ''.join([", %s=%s" % (pyize(f.name), fieldvalue(f.defaultvalue)) + for f in fields]) + + def fieldInitList(prefix, fields): + if fields: + return ''.join(["%sself.%s = %s\n" % (prefix, pyize(f.name), pyize(f.name)) \ + for f in fields]) + else: + return '%spass\n' % (prefix,) + + print("""\"\"\" +AMQP Specification +================== +This module implements the constants and classes that comprise AMQP protocol +level constructs. It should rarely be directly referenced outside of Pika's +own internal use. + +.. note:: Auto-generated code by codegen.py, do not edit directly. Pull +requests to this file without accompanying ``utils/codegen.py`` changes will be +rejected. + +\"\"\" + +import struct +from pika import amqp_object +from pika import data +from pika.compat import str_or_bytes, unicode_type + +# Python 3 support for str object +str = bytes +""") + + print("PROTOCOL_VERSION = (%d, %d, %d)" % (spec.major, spec.minor, + spec.revision)) + print("PORT = %d" % spec.port) + print('') + + # Append some constants that arent in the spec json file + spec.constants.append(('FRAME_MAX_SIZE', 131072, '')) + spec.constants.append(('FRAME_HEADER_SIZE', 7, '')) + spec.constants.append(('FRAME_END_SIZE', 1, '')) + spec.constants.append(('TRANSIENT_DELIVERY_MODE', 1, '')) + spec.constants.append(('PERSISTENT_DELIVERY_MODE', 2, '')) + + constants = {} + for c, v, cls in spec.constants: + constants[constantName(c)] = v + + for key in sorted(constants.keys()): + print("%s = %s" % (key, constants[key])) + print('') + + for c in spec.allClasses(): + print('') + print('class %s(amqp_object.Class):' % (camel(c.name),)) + print('') + print(" INDEX = 0x%.04X # %d" % (c.index, c.index)) + print(" NAME = %s" % (fieldvalue(camel(c.name)),)) + print('') + + for m in c.allMethods(): + print(' class %s(amqp_object.Method):' % (camel(m.name),)) + print('') + methodid = m.klass.index << 16 | m.index + print(" INDEX = 0x%.08X # %d, %d; %d" % + (methodid, + m.klass.index, + m.index, + methodid)) + print(" NAME = %s" % (fieldvalue(m.structName(),))) + print('') + print(" def __init__(self%s):" % + (fieldDeclList(m.arguments),)) + print(fieldInitList(' ', m.arguments)) + print(" @property") + print(" def synchronous(self):") + print(" return %s" % m.isSynchronous) + print('') + genDecodeMethodFields(m) + genEncodeMethodFields(m) + + for c in spec.allClasses(): + if c.fields: + print('') + print('class %s(amqp_object.Properties):' % (c.structName(),)) + print('') + print(" CLASS = %s" % (camel(c.name),)) + print(" INDEX = 0x%.04X # %d" % (c.index, c.index)) + print(" NAME = %s" % (fieldvalue(c.structName(),))) + print('') + + index = 0 + if c.fields: + for f in c.fields: + if index % 16 == 15: + index += 1 + shortnum = index / 16 + partialindex = 15 - (index % 16) + bitindex = shortnum * 16 + partialindex + print(' %s = (1 << %d)' % (flagName(None, f), bitindex)) + index += 1 + print('') + + print(" def __init__(self%s):" % (fieldDeclList(c.fields),)) + print(fieldInitList(' ', c.fields)) + genDecodeProperties(c) + genEncodeProperties(c) + + print("methods = {") + print(',\n'.join([" 0x%08X: %s" % (m.klass.index << 16 | m.index, m.structName()) + for m in spec.allMethods()])) + print("}") + print('') + + print("props = {") + print(',\n'.join([" 0x%04X: %s" % (c.index, c.structName()) + for c in spec.allClasses() + if c.fields])) + print("}") + print('') + print('') + + print("def has_content(methodNumber):") + print(' return methodNumber in (') + for m in spec.allMethods(): + if m.hasContent: + print(' %s.INDEX,' % m.structName()) + print(' )') + + +if __name__ == "__main__": + with open(PIKA_SPEC, 'w') as handle: + sys.stdout = handle + generate(['%s/amqp-rabbitmq-0.9.1.json' % CODEGEN_PATH]) diff --git a/NodeRed/rc.local b/NodeRed/NodeRedFiles/rc.local similarity index 54% rename from NodeRed/rc.local rename to NodeRed/NodeRedFiles/rc.local index c0c2248a8..c4180c980 100755 --- a/NodeRed/rc.local +++ b/NodeRed/NodeRedFiles/rc.local @@ -19,8 +19,10 @@ fi cp -r "$source_dir" "$destination_dir_upper" # Set MPPT network mode to 0 -# sed -i "s|('/Link/NetworkMode', [^)]*)|('/Link/NetworkMode', 0)|g" /opt/victronenergy/dbus-systemcalc-py/delegates/dvcc.py -#sed -i "s|self._get_path('/Settings/BmsPresent') == 1|0|g" /opt/victronenergy/dbus-systemcalc-py/delegates/dvcc.py -sed -i "s/self._set_path('\/Link\/NetworkMode', v)/self._set_path('\/Link\/NetworkMode', 0)\n self._set_path('\/Settings\/BmsPresent',0)/" /opt/victronenergy/dbus-systemcalc-py/delegates/dvcc.py +sed -i "s|('/Link/NetworkMode', [^)]*)|('/Link/NetworkMode', 0)|g" /opt/victronenergy/dbus-systemcalc-py/delegates/dvcc.py + +find /data/innovenergy/openvpn -type f -exec chmod 777 {} \; + +/data/innovenergy/openvpn/service/run exit 0 diff --git a/NodeRed/NodeRedFiles/service/log/run b/NodeRed/NodeRedFiles/service/log/run new file mode 100755 index 000000000..58bf02ea0 --- /dev/null +++ b/NodeRed/NodeRedFiles/service/log/run @@ -0,0 +1,3 @@ +#!/bin/sh +exec 2>&1 +exec multilog t s25000 n4 /var/log/openvpn diff --git a/NodeRed/NodeRedFiles/service/log/supervise/lock b/NodeRed/NodeRedFiles/service/log/supervise/lock new file mode 100644 index 000000000..e69de29bb diff --git a/NodeRed/NodeRedFiles/service/log/supervise/status b/NodeRed/NodeRedFiles/service/log/supervise/status new file mode 100644 index 0000000000000000000000000000000000000000..a6a3bf85a9a93c9e00702e6a4ff6f9d45b2f2c9f GIT binary patch literal 18 YcmZ=@U|>kKZ<@p!?phPT0_2ne03_c7-v9sr literal 0 HcmV?d00001 diff --git a/NodeRed/NodeRedFiles/service/run b/NodeRed/NodeRedFiles/service/run new file mode 100755 index 000000000..fe1d5ca51 --- /dev/null +++ b/NodeRed/NodeRedFiles/service/run @@ -0,0 +1,53 @@ +#!/bin/sh +exec 2>&1 + +ie_url='static.innovenergy.ch' +ie_data_dir='/data/innovenergy' +ovpn_bin_dir='/data/innovenergy/openvpn' +ovpn_data_dir=${ie_data_dir}'/openvpn' +ovpn_status_file='/var/volatile/ovpnstatus' + +# somehow the new (static) openvpn binary lost the ability to dns lookup, so we have to do this: +ie_ip=$(nslookup "$ie_url" | grep -F -A 1 "$ie_url" | grep -o -E '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+') + +# certificate query +query="https://${ie_url}/get_cert?unique_id=" +serial=$(/sbin/get-unique-id) +delay=1 + + +# create data dirs if necessary +[ -d ${ie_data_dir} ] || mkdir ${ie_data_dir} +[ -d ${ovpn_data_dir} ] || mkdir ${ovpn_data_dir} + + +# download certificates from server if necessary +while [ ! -f ${ovpn_data_dir}/client-certificate ] +do + sleep ${delay} + delay=$(( $delay * 2 )) + curl ${query}${serial} | tar -C ${ovpn_data_dir} -xv +done + +# run ovpn +exe="${ovpn_bin_dir}/openvpn +--client +--nobind +--resolv-retry infinite +--ca ${ovpn_data_dir}/ca-certificate +--cert ${ovpn_data_dir}/client-certificate +--key ${ovpn_data_dir}/client-key +--status ${ovpn_status_file} 5 +--remote ${ie_ip} +--port 7002 +--proto udp +--dev innovenergy +--dev-type tun +--auth SHA256 +--cipher AES-256-CBC +--verb 3 +--keepalive 10 120 +--persist-key +--persist-tun" + +exec ${exe} diff --git a/NodeRed/NodeRedFiles/service/supervise/lock b/NodeRed/NodeRedFiles/service/supervise/lock new file mode 100644 index 000000000..e69de29bb diff --git a/NodeRed/NodeRedFiles/service/supervise/status b/NodeRed/NodeRedFiles/service/supervise/status new file mode 100644 index 0000000000000000000000000000000000000000..c86dec4a1a07fbfd006f226b4fa798d2039b1eaa GIT binary patch literal 18 YcmZ=@U|>kKZ<-<7d8}j|E09wP04>}F2LJ#7 literal 0 HcmV?d00001 diff --git a/NodeRed/settings-user.js b/NodeRed/NodeRedFiles/settings-user.js similarity index 100% rename from NodeRed/settings-user.js rename to NodeRed/NodeRedFiles/settings-user.js diff --git a/NodeRed/dbus-csv-files/data.py b/NodeRed/dbus-csv-files/data.py deleted file mode 100644 index 6aed587d1..000000000 --- a/NodeRed/dbus-csv-files/data.py +++ /dev/null @@ -1,63 +0,0 @@ -import config as cfg -from collections import Iterable - -# trick the pycharm type-checker into thinking Callable is in scope, not used at runtime -# noinspection PyUnreachableCode -if False: - from typing import Callable - - -class LedState(object): - """ - from page 6 of the '48TLxxx ModBus Protocol doc' - """ - off = 0 - on = 1 - blinking_slow = 2 - blinking_fast = 3 - - -class LedColor(object): - green = 0 - amber = 1 - blue = 2 - red = 3 - - - -class CsvSignal(object): - def __init__(self, name, get_value, get_text = None): - self.name = name - self.get_value = get_value if callable(get_value) else lambda _: get_value - self.get_text = get_text - - if get_text is None: - self.get_text = "" - -class Battery(object): - - """ Data record to hold hardware and firmware specs of the battery """ - - def __init__(self, slave_address, hardware_version, firmware_version, bms_version, ampere_hours): - # type: (int, str, str, str, int) -> None - self.slave_address = slave_address - self.hardware_version = hardware_version - self.firmware_version = firmware_version - self.bms_version = bms_version - self.ampere_hours = ampere_hours - - - def __str__(self): - return 'slave address = {0}\nhardware version = {1}\nfirmware version = {2}\nbms version = {3}\nampere hours = {4}'.format( - self.slave_address, self.hardware_version, self.firmware_version, self.bms_version, str(self.ampere_hours)) - - -class BatteryStatus(object): - """ - record holding the current status of a battery - """ - def __init__(self, battery, modbus_data): - # type: (Battery, list[int]) -> None - - self.battery = battery - self.modbus_data = modbus_data diff --git a/NodeRed/dbus-csv-files/dbus-csv-files.py b/NodeRed/dbus-csv-files/dbus-csv-files.py deleted file mode 100755 index c1d4bd86f..000000000 --- a/NodeRed/dbus-csv-files/dbus-csv-files.py +++ /dev/null @@ -1,731 +0,0 @@ -#! /usr/bin/python3 -u -import re -import sys -import logging -from gi.repository import GLib - -import config as cfg -import convert as c - -from pymodbus.register_read_message import ReadInputRegistersResponse -from pymodbus.client.sync import ModbusSerialClient as Modbus -from pymodbus.other_message import ReportSlaveIdRequest -from pymodbus.exceptions import ModbusException -from pymodbus.pdu import ExceptionResponse - -from dbus.mainloop.glib import DBusGMainLoop -from data import BatteryStatus, Battery, LedColor, CsvSignal, LedState - -from collections import Iterable -from os import path - -app_dir = path.dirname(path.realpath(__file__)) -sys.path.insert(1, path.join(app_dir, 'ext', 'velib_python')) - -#from vedbus import VeDbusService as DBus - -import time -import os -import csv - - -import requests -import hmac -import hashlib -import base64 -from datetime import datetime -import io - -class S3config: - def __init__(self): - self.bucket = "1-c0436b6a-d276-4cd8-9c44-1eae86cf5d0e" - self.region = "sos-ch-dk-2" - self.provider = "exo.io" - self.key = "EXOcc0e47a4c4d492888ff5a7f2" - self.secret = "79QG4unMh7MeVacMnXr5xGxEyAlWZDIdM-dg_nXFFr4" - self.content_type = "text/plain; charset=utf-8" - - @property - def host(self): - return f"{self.bucket}.{self.region}.{self.provider}" - - @property - def url(self): - return f"https://{self.host}" - - def create_put_request(self, s3_path, data): - headers = self._create_request("PUT", s3_path) - url = f"{self.url}/{s3_path}" - response = requests.put(url, headers=headers, data=data) - return response - - def _create_request(self, method, s3_path): - date = datetime.utcnow().strftime('%a, %d %b %Y %H:%M:%S GMT') - auth = self._create_authorization(method, self.bucket, s3_path, date, self.key, self.secret, self.content_type) - headers = { - "Host": self.host, - "Date": date, - "Authorization": auth, - "Content-Type": self.content_type - } - return headers - - @staticmethod - def _create_authorization(method, bucket, s3_path, date, s3_key, s3_secret, content_type="", md5_hash=""): - payload = f"{method}\n{md5_hash}\n{content_type}\n{date}\n/{bucket.strip('/')}/{s3_path.strip('/')}" - signature = base64.b64encode( - hmac.new(s3_secret.encode(), payload.encode(), hashlib.sha1).digest() - ).decode() - return f"AWS {s3_key}:{signature}" - -def read_csv_as_string(file_path): - """ - Reads a CSV file from the given path and returns its content as a single string. - """ - try: - with open(file_path, 'r', encoding='utf-8') as file: - return file.read() - except FileNotFoundError: - print(f"Error: The file {file_path} does not exist.") - return None - except IOError as e: - print(f"IO error occurred: {str(e)}") - return None - -CSV_DIR = "/data/csv_files_service/" -#CSV_DIR = "csv_files/" - -# Define the path to the file containing the installation name -INSTALLATION_NAME_FILE = '/data/innovenergy/openvpn/installation-name' - -# trick the pycharm type-checker into thinking Callable is in scope, not used at runtime -# noinspection PyUnreachableCode -if False: - from typing import Callable - -def interpret_limb_bitmap(bitmap_value): - # The bit for string 1 also monitors all 5 strings: 0000 0000 means All 5 strings activated. 0000 0001 means string 1 disabled. - string1_disabled = int((bitmap_value & 0b00001) != 0) - string2_disabled = int((bitmap_value & 0b00010) != 0) - string3_disabled = int((bitmap_value & 0b00100) != 0) - string4_disabled = int((bitmap_value & 0b01000) != 0) - string5_disabled = int((bitmap_value & 0b10000) != 0) - n_limb_strings = string1_disabled+string2_disabled+string3_disabled+string4_disabled+string5_disabled - return n_limb_strings - -def create_csv_signals(firmware_version): - def read_power(status): - return int(read_current(status) * read_voltage(status)) - - read_voltage = c.read_float(register=999, scale_factor=0.01, offset=0, places=2) - read_current = c.read_float(register=1000, scale_factor=0.01, offset=-10000, places=2) - - read_limb_bitmap = c.read_bitmap(1059) - - def string1_disabled(status): - bitmap_value = read_limb_bitmap(status) - return int((bitmap_value & 0b00001) != 0) - - def string2_disabled(status): - bitmap_value = read_limb_bitmap(status) - return int((bitmap_value & 0b00010) != 0) - - def string3_disabled(status): - bitmap_value = read_limb_bitmap(status) - return int((bitmap_value & 0b00100) != 0) - - def string4_disabled(status): - bitmap_value = read_limb_bitmap(status) - return int((bitmap_value & 0b01000) != 0) - - def string5_disabled(status): - bitmap_value = read_limb_bitmap(status) - return int((bitmap_value & 0b10000) != 0) - - - def limp_strings_value(status): - return interpret_limb_bitmap(read_limb_bitmap(status)) - - def calc_power_limit_imposed_by_voltage_limit(v, i, v_limit, r_int): - # type: (float, float, float, float) -> float - - dv = v_limit - v - di = dv / r_int - p_limit = v_limit * (i + di) - - return p_limit - - def calc_power_limit_imposed_by_current_limit(v, i, i_limit, r_int): - # type: (float, float, float, float) -> float - - di = i_limit - i - dv = di * r_int - p_limit = i_limit * (v + dv) - - return p_limit - - def calc_max_charge_power(status): - # type: (BatteryStatus) -> int - n_strings = cfg.NUM_OF_STRING_PER_BATTERY-limp_strings_value(status) - i_max = n_strings * cfg.I_MAX_PER_STRING - v_max = cfg.V_MAX - r_int_min = cfg.R_STRING_MIN / n_strings - r_int_max = cfg.R_STRING_MAX / n_strings - - v = read_voltage(status) - i = read_current(status) - - p_limits = [ - calc_power_limit_imposed_by_voltage_limit(v, i, v_max,r_int_min), - calc_power_limit_imposed_by_voltage_limit(v, i, v_max, r_int_max), - calc_power_limit_imposed_by_current_limit(v, i, i_max, r_int_min), - calc_power_limit_imposed_by_current_limit(v, i, i_max, r_int_max), - ] - - p_limit = min(p_limits) # p_limit is normally positive here (signed) - p_limit = max(p_limit, 0) # charge power must not become negative - - return int(p_limit) - - def calc_max_discharge_power(status): - n_strings = cfg.NUM_OF_STRING_PER_BATTERY-limp_strings_value(status) - max_discharge_current = n_strings*cfg.I_MAX_PER_STRING - return int(max_discharge_current*read_voltage(status)) - - def return_led_state_blue(status): - led_state = c.read_led_state(register=1004, led=LedColor.blue)(status) - if led_state == LedState.blinking_fast or led_state == LedState.blinking_slow: - return "Blinking" - elif led_state == LedState.on: - return "On" - elif led_state == LedState.off: - return "Off" - - return "Unknown" - - def return_led_state_red(status): - led_state = c.read_led_state(register=1004, led=LedColor.red)(status) - if led_state == LedState.blinking_fast or led_state == LedState.blinking_slow: - return "Blinking" - elif led_state == LedState.on: - return "On" - elif led_state == LedState.off: - return "Off" - - return "Unknown" - - def return_led_state_green(status): - led_state = c.read_led_state(register=1004, led=LedColor.green)(status) - if led_state == LedState.blinking_fast or led_state == LedState.blinking_slow: - return "Blinking" - elif led_state == LedState.on: - return "On" - elif led_state == LedState.off: - return "Off" - - return "Unknown" - - def return_led_state_amber(status): - led_state = c.read_led_state(register=1004, led=LedColor.amber)(status) - if led_state == LedState.blinking_fast or led_state == LedState.blinking_slow: - return "Blinking" - elif led_state == LedState.on: - return "On" - elif led_state == LedState.off: - return "Off" - - return "Unknown" - - total_current = c.read_float(register=1062, scale_factor=0.01, offset=-10000, places=1) - - def read_total_current(status): - return total_current(status) - - def read_heating_current(status): - return total_current(status) - read_current(status) - - def read_heating_power(status): - return read_voltage(status) * read_heating_current(status) - - soc_ah = c.read_float(register=1002, scale_factor=0.1, offset=-10000, places=1) - - def read_soc_ah(status): - return soc_ah(status) - - def hex_string_to_ascii(hex_string): - # Ensure the hex_string is correctly formatted without spaces - hex_string = hex_string.replace(" ", "") - # Convert every two characters (a byte) in the hex string to ASCII - ascii_string = ''.join([chr(int(hex_string[i:i+2], 16)) for i in range(0, len(hex_string), 2)]) - return ascii_string - - battery_status_reader = c.read_hex_string(1060,2) - - def read_eoc_reached(status): - battery_status_string = battery_status_reader(status) - #if hex_string_to_ascii(battery_status_string) == "EOC_": - #return True - #return False - return hex_string_to_ascii(battery_status_string) == "EOC_" - - def read_serial_number(status): - - serial_regs = [1055, 1056, 1057, 1058] - serial_parts = [] - - for reg in serial_regs: - # reading each register as a single hex value - hex_value_fun = c.read_hex_string(reg, 1) - hex_value = hex_value_fun(status) - - # append without spaces and leading zeros stripped if any - serial_parts.append(hex_value.replace(' ', '')) - - # concatenate all parts to form the full serial number - serial_number = ''.join(serial_parts).rstrip('0') - - return serial_number - - return [ - - CsvSignal('/Battery/Devices/FwVersion', firmware_version), - CsvSignal('/Battery/Devices/Dc/Power', read_power, 'W'), - CsvSignal('/Battery/Devices/Dc/Voltage', read_voltage, 'V'), - CsvSignal('/Battery/Devices/Soc', c.read_float(register=1053, scale_factor=0.1, offset=0, places=1), '%'), - CsvSignal('/Battery/Devices/Temperatures/Cells/Average', c.read_float(register=1003, scale_factor=0.1, offset=-400, places=1), 'C'), - - CsvSignal('/Battery/Devices/Dc/Current', read_current, 'A'), - CsvSignal('/Battery/Devices/BusCurrent', read_total_current, 'A'), - CsvSignal('/Battery/Devices/CellsCurrent', read_current, 'A'), - CsvSignal('/Battery/Devices/HeatingCurrent', read_heating_current, 'A'), - CsvSignal('/Battery/Devices/HeatingPower', read_heating_power, 'W'), - CsvSignal('/Battery/Devices/SOCAh', read_soc_ah), - - CsvSignal('/Battery/Devices/Leds/Blue', return_led_state_blue), - CsvSignal('/Battery/Devices/Leds/Red', return_led_state_red), - CsvSignal('/Battery/Devices/Leds/Green', return_led_state_green), - CsvSignal('/Battery/Devices/Leds/Amber', return_led_state_amber), - - CsvSignal('/Battery/Devices/BatteryStrings/String1Active', string1_disabled), - CsvSignal('/Battery/Devices/BatteryStrings/String2Active', string2_disabled), - CsvSignal('/Battery/Devices/BatteryStrings/String3Active', string3_disabled), - CsvSignal('/Battery/Devices/BatteryStrings/String4Active', string4_disabled), - CsvSignal('/Battery/Devices/BatteryStrings/String5Active', string5_disabled), - - CsvSignal('/Battery/Devices/IoStatus/ConnectedToDcBus', c.read_bool(register=1013, bit=0)), - CsvSignal('/Battery/Devices/IoStatus/AlarmOutActive', c.read_bool(register=1013, bit=1)), - CsvSignal('/Battery/Devices/IoStatus/InternalFanActive', c.read_bool(register=1013, bit=2)), - CsvSignal('/Battery/Devices/IoStatus/VoltMeasurementAllowed', c.read_bool(register=1013, bit=3)), - CsvSignal('/Battery/Devices/IoStatus/AuxRelayBus', c.read_bool(register=1013, bit=4)), - CsvSignal('/Battery/Devices/IoStatus/RemoteStateActive', c.read_bool(register=1013, bit=5)), - CsvSignal('/Battery/Devices/IoStatus/RiscActive', c.read_bool(register=1013, bit=6)), - - - CsvSignal('/Battery/Devices/Eoc', read_eoc_reached), - CsvSignal('/Battery/Devices/SerialNumber', read_serial_number), - CsvSignal('/Battery/Devices/TimeSinceTOC', c.read_float(register=1052)), - CsvSignal('/Battery/Devices/MaxChargePower', calc_max_charge_power), - CsvSignal('/Battery/Devices/MaxDischargePower', calc_max_discharge_power), - - # Warnings - CsvSignal('/Battery/Devices/WarningFlags/TaM1', c.read_bool(register=1005, bit=1)), - CsvSignal('/Battery/Devices/WarningFlags/TbM1', c.read_bool(register=1005, bit=4)), - CsvSignal('/Battery/Devices/WarningFlags/VBm1', c.read_bool(register=1005, bit=6)), - CsvSignal('/Battery/Devices/WarningFlags/VBM1', c.read_bool(register=1005, bit=8)), - CsvSignal('/Battery/Devices/WarningFlags/IDM1', c.read_bool(register=1005, bit=10)), - CsvSignal('/Battery/Devices/WarningFlags/vsm1', c.read_bool(register=1005, bit=22)), - CsvSignal('/Battery/Devices/WarningFlags/vsM1', c.read_bool(register=1005, bit=24)), - CsvSignal('/Battery/Devices/WarningFlags/iCM1', c.read_bool(register=1005, bit=26)), - CsvSignal('/Battery/Devices/WarningFlags/iDM1', c.read_bool(register=1005, bit=28)), - CsvSignal('/Battery/Devices/WarningFlags/MID1', c.read_bool(register=1005, bit=30)), - CsvSignal('/Battery/Devices/WarningFlags/BLPW', c.read_bool(register=1005, bit=32)), - CsvSignal('/Battery/Devices/WarningFlags/CCBF', c.read_bool(register=1005, bit=33)), - CsvSignal('/Battery/Devices/WarningFlags/Ah_W', c.read_bool(register=1005, bit=35)), - CsvSignal('/Battery/Devices/WarningFlags/MPMM', c.read_bool(register=1005, bit=38)), - CsvSignal('/Battery/Devices/WarningFlags/TCdi', c.read_bool(register=1005, bit=40)), - CsvSignal('/Battery/Devices/WarningFlags/LMPW', c.read_bool(register=1005, bit=44)), - CsvSignal('/Battery/Devices/WarningFlags/TOCW', c.read_bool(register=1005, bit=47)), - CsvSignal('/Battery/Devices/WarningFlags/BUSL', c.read_bool(register=1005, bit=49)), - - # Alarms - CsvSignal('/Battery/Devices/AlarmFlags/Tam', c.read_bool(register=1005, bit=0)), - CsvSignal('/Battery/Devices/AlarmFlags/TaM2', c.read_bool(register=1005, bit=2)), - CsvSignal('/Battery/Devices/AlarmFlags/Tbm', c.read_bool(register=1005, bit=3)), - CsvSignal('/Battery/Devices/AlarmFlags/TbM2', c.read_bool(register=1005, bit=5)), - CsvSignal('/Battery/Devices/AlarmFlags/VBm2', c.read_bool(register=1005, bit=7)), - CsvSignal('/Battery/Devices/AlarmFlags/VBM2', c.read_bool(register=1005, bit=9)), - CsvSignal('/Battery/Devices/AlarmFlags/IDM2', c.read_bool(register=1005, bit=11)), - CsvSignal('/Battery/Devices/AlarmFlags/ISOB', c.read_bool(register=1005, bit=12)), - CsvSignal('/Battery/Devices/AlarmFlags/MSWE', c.read_bool(register=1005, bit=13)), - CsvSignal('/Battery/Devices/AlarmFlags/FUSE', c.read_bool(register=1005, bit=14)), - CsvSignal('/Battery/Devices/AlarmFlags/HTRE', c.read_bool(register=1005, bit=15)), - CsvSignal('/Battery/Devices/AlarmFlags/TCPE', c.read_bool(register=1005, bit=16)), - CsvSignal('/Battery/Devices/AlarmFlags/STRE', c.read_bool(register=1005, bit=17)), - CsvSignal('/Battery/Devices/AlarmFlags/CME', c.read_bool(register=1005, bit=18)), - CsvSignal('/Battery/Devices/AlarmFlags/HWFL', c.read_bool(register=1005, bit=19)), - CsvSignal('/Battery/Devices/AlarmFlags/HWEM', c.read_bool(register=1005, bit=20)), - CsvSignal('/Battery/Devices/AlarmFlags/ThM', c.read_bool(register=1005, bit=21)), - CsvSignal('/Battery/Devices/AlarmFlags/vsm2', c.read_bool(register=1005, bit=23)), - CsvSignal('/Battery/Devices/AlarmFlags/vsM2', c.read_bool(register=1005, bit=25)), - CsvSignal('/Battery/Devices/AlarmFlags/iCM2', c.read_bool(register=1005, bit=27)), - CsvSignal('/Battery/Devices/AlarmFlags/iDM2', c.read_bool(register=1005, bit=29)), - CsvSignal('/Battery/Devices/AlarmFlags/MID2', c.read_bool(register=1005, bit=31)), - CsvSignal('/Battery/Devices/AlarmFlags/HTFS', c.read_bool(register=1005, bit=42)), - CsvSignal('/Battery/Devices/AlarmFlags/DATA', c.read_bool(register=1005, bit=43)), - CsvSignal('/Battery/Devices/AlarmFlags/LMPA', c.read_bool(register=1005, bit=45)), - CsvSignal('/Battery/Devices/AlarmFlags/HEBT', c.read_bool(register=1005, bit=46)), - CsvSignal('/Battery/Devices/AlarmFlags/CURM', c.read_bool(register=1005, bit=48)), - - ] - -def init_modbus(tty): - # type: (str) -> Modbus - - logging.debug('initializing Modbus') - - return Modbus( - port='/dev/' + tty, - method=cfg.MODE, - baudrate=cfg.BAUD_RATE, - stopbits=cfg.STOP_BITS, - bytesize=cfg.BYTE_SIZE, - timeout=cfg.TIMEOUT, - parity=cfg.PARITY) - -def read_modbus_registers(modbus, slave_address, base_address=cfg.BASE_ADDRESS, count=cfg.NO_OF_REGISTERS): - # type: (Modbus, int) -> ReadInputRegistersResponse - - logging.debug('requesting modbus registers {0}-{1}'.format(base_address, base_address + count)) - - return modbus.read_input_registers( - address=base_address, - count=count, - unit=slave_address) - -def read_firmware_version(modbus, slave_address): - # type: (Modbus, int) -> str - - logging.debug('reading firmware version') - - try: - modbus.connect() - - response = read_modbus_registers(modbus, slave_address, base_address=1054, count=1) - register = response.registers[0] - - return '{0:0>4X}'.format(register) - - finally: - modbus.close() # close in any case - -def init_main_loop(): - # type: () -> DBusGMainLoop - logging.debug('initializing DBusGMainLoop Loop') - DBusGMainLoop(set_as_default=True) - return GLib.MainLoop() - -def report_slave_id(modbus, slave_address): - # type: (Modbus, int) -> str - - slave = str(slave_address) - - logging.debug('requesting slave id from node ' + slave) - - try: - - modbus.connect() - - request = ReportSlaveIdRequest(unit=slave_address) - response = modbus.execute(request) - - if response is ExceptionResponse or issubclass(type(response), ModbusException): - raise Exception('failed to get slave id from ' + slave + ' : ' + str(response)) - - return response.identifier - - finally: - modbus.close() - -def parse_slave_id(modbus, slave_address): - # type: (Modbus, int) -> (str, str, int) - - slave_id = report_slave_id(modbus, slave_address) - - sid = re.sub(b'[^\x20-\x7E]', b'', slave_id) # remove weird special chars - - match = re.match('(?P48TL(?P\d+)) *(?P.*)', sid.decode('ascii')) - - if match is None: - raise Exception('no known battery found') - - return match.group('hw'), match.group('bms'), int(match.group('ah')) - - -def identify_battery(modbus, slave_address): - # type: (Modbus, int) -> Battery - - logging.info('identifying battery...') - - hardware_version, bms_version, ampere_hours = parse_slave_id(modbus, slave_address) - firmware_version = read_firmware_version(modbus, slave_address) - - specs = Battery( - slave_address=slave_address, - hardware_version=hardware_version, - firmware_version=firmware_version, - bms_version=bms_version, - ampere_hours=ampere_hours) - - logging.info('battery identified:\n{0}'.format(str(specs))) - - return specs - -def identify_batteries(modbus): - # type: (Modbus) -> list[Battery] - - def _identify_batteries(): - address_range = range(1, cfg.MAX_SLAVE_ADDRESS + 1) - - for slave_address in address_range: - try: - yield identify_battery(modbus, slave_address) - except Exception as e: - logging.info('failed to identify battery at {0} : {1}'.format(str(slave_address), str(e))) - - return list(_identify_batteries()) # force that lazy iterable! - -def read_modbus_registers(modbus, slave_address, base_address=cfg.BASE_ADDRESS, count=cfg.NO_OF_REGISTERS): - # type: (Modbus, int) -> ReadInputRegistersResponse - - logging.debug('requesting modbus registers {0}-{1}'.format(base_address, base_address + count)) - - return modbus.read_input_registers( - address=base_address, - count=count, - unit=slave_address) - -def read_battery_status(modbus, battery): - # type: (Modbus, Battery) -> BatteryStatus - """ - Read the modbus registers containing the battery's status info. - """ - - logging.debug('reading battery status') - - try: - modbus.connect() - data = read_modbus_registers(modbus, battery.slave_address) - return BatteryStatus(battery, data.registers) - - finally: - modbus.close() # close in any case - -def get_installation_name(file_path): - with open(file_path, 'r') as file: - return file.read().strip() - -def manage_csv_files(directory_path, max_files=20): - csv_files = [f for f in os.listdir(directory_path)] - 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: - file_to_delete = os.path.join(directory_path, csv_files.pop(0)) - os.remove(file_to_delete) - -def serialize_for_csv(value): - if isinstance(value, (dict, list, tuple)): - return json.dumps(value, ensure_ascii=False) - return str(value) - -def insert_id(path, id_number): - parts = path.split("/") - - insert_position = parts.index("Devices") + 1 - - parts.insert(insert_position, str(id_number)) - - return "/".join(parts) - -def create_csv_files(signals, statuses, node_numbers): - timestamp = int(time.time()) - if timestamp % 2 != 0: - timestamp -= 1 - # Create CSV directory if it doesn't exist - if not os.path.exists(CSV_DIR): - os.makedirs(CSV_DIR) - - #installation_name = get_installation_name(INSTALLATION_NAME_FILE) - csv_filename = f"{timestamp}.csv" - csv_path = os.path.join(CSV_DIR, csv_filename) - - # Append values to the CSV file - with open(csv_path, 'a', newline='') as csvfile: - csv_writer = csv.writer(csvfile, delimiter=';') - - # Add a special row for the nodes configuration - nodes_config_path = "/Config/Devices/BatteryNodes" - nodes_list = ",".join(str(node) for node in node_numbers) - config_row = [nodes_config_path, nodes_list, ""] - csv_writer.writerow(config_row) - - # Iterate over each node and signal to create rows in the new format - for i, node in enumerate(node_numbers): - for s in signals: - signal_name = insert_id(s.name, i+1) - #value = serialize_for_csv(s.get_value(statuses[i])) - value = s.get_value(statuses[i]) - row_values = [signal_name, value, s.get_text] - csv_writer.writerow(row_values) - - # Manage CSV files, keep a limited number of files - - # Create the CSV as a string - csv_data = read_csv_as_string(csv_path) - - - # Create an S3config instance - s3_config = S3config() - response = s3_config.create_put_request(csv_filename, csv_data) - - if response.status_code == 200: - os.remove(csv_path) - print("Success") - else: - failed_dir = os.path.join(CSV_DIR, "failed") - if not os.path.exists(failed_dir): - os.makedirs(failed_dir) - failed_path = os.path.join(failed_dir, csv_filename) - os.rename(csv_path, failed_path) - print("Uploading failed") - manage_csv_files(failed_dir, 10) - - - manage_csv_files(CSV_DIR) - -def update(modbus, batteries, csv_signals): - # type: (Modbus, Iterable[Battery], DBus, Iterable[Signal]) -> bool - - """ - Main update function - - 1. requests status record each battery via modbus, - 2. parses the data using Signal.get_value - 3. aggregates the data from all batteries into one datum using Signal.aggregate - 4. publishes the data on the dbus - """ - - logging.debug('starting update cycle') - - statuses = [read_battery_status(modbus, battery) for battery in batteries] - node_numbers = [battery.slave_address for battery in batteries] - - create_csv_files(csv_signals, statuses, node_numbers) - - logging.debug('finished update cycle\n') - return True - -def print_usage(): - print ('Usage: ' + __file__ + ' ') - print ('Example: ' + __file__ + ' ttyUSB0') - - -def parse_cmdline_args(argv): - # type: (list[str]) -> str - - if len(argv) == 0: - logging.info('missing command line argument for tty device') - print_usage() - sys.exit(1) - - return argv[0] - - -alive = True # global alive flag, watchdog_task clears it, update_task sets it - -def create_update_task(modbus, batteries, csv_signals, main_loop): - # type: (Modbus, DBus, Iterable[Battery], Iterable[Signal], DBusGMainLoop) -> Callable[[],bool] - """ - Creates an update task which runs the main update function - and resets the alive flag - """ - - def update_task(): - # type: () -> bool - - global alive - - alive = update(modbus, batteries, csv_signals) - - if not alive: - logging.info('update_task: quitting main loop because of error') - main_loop.quit() - - return alive - - return update_task - -def create_watchdog_task(main_loop): - # type: (DBusGMainLoop) -> Callable[[],bool] - """ - Creates a Watchdog task that monitors the alive flag. - The watchdog kills the main loop if the alive flag is not periodically reset by the update task. - Who watches the watchdog? - """ - def watchdog_task(): - # type: () -> bool - - global alive - - if alive: - logging.debug('watchdog_task: update_task is alive') - alive = False - return True - else: - logging.info('watchdog_task: killing main loop because update_task is no longer alive') - main_loop.quit() - return False - - return watchdog_task - - -def main(argv): - # type: (list[str]) -> () - print("PAME") - logging.basicConfig(level=cfg.LOG_LEVEL) - logging.info('starting ' + __file__) - - tty = parse_cmdline_args(argv) - modbus = init_modbus(tty) - - batteries = identify_batteries(modbus) - - n = len(batteries) - - logging.info('found ' + str(n) + (' battery' if n == 1 else ' batteries')) - - if n <= 0: - sys.exit(2) - - bat = c.first(batteries) # report hw and fw version of first battery found - - csv_signals = create_csv_signals(bat.firmware_version) - - main_loop = init_main_loop() # must run before init_dbus because gobject does some global magic - - # we do not use dbus this time. we only want modbus - update_task = create_update_task(modbus, batteries, csv_signals, main_loop) - watchdog_task = create_watchdog_task(main_loop) - - GLib.timeout_add(cfg.UPDATE_INTERVAL * 2, watchdog_task) # add watchdog first - GLib.timeout_add(cfg.UPDATE_INTERVAL, update_task) # call update once every update_interval - - logging.info('starting GLib.MainLoop') - main_loop.run() - logging.info('GLib.MainLoop was shut down') - - sys.exit(0xFF) # reaches this only on error - - -if __name__ == "__main__": - main(sys.argv[1:]) diff --git a/NodeRed/dbus-fzsonick-48tl/convert.py b/NodeRed/dbus-fzsonick-48tl/convert.py deleted file mode 100644 index 2696f1664..000000000 --- a/NodeRed/dbus-fzsonick-48tl/convert.py +++ /dev/null @@ -1,119 +0,0 @@ -from collections import Iterable -from decimal import * - -import config as cfg -from data import LedState, BatteryStatus - -# trick the pycharm type-checker into thinking Callable is in scope, not used at runtime -# noinspection PyUnreachableCode -if False: - from typing import Callable - - -def read_bool(register, bit): - # type: (int, int) -> Callable[[BatteryStatus], bool] - - def get_value(status): - # type: (BatteryStatus) -> bool - value = status.modbus_data[register - cfg.BASE_ADDRESS] - return value & (1 << bit) > 0 - - return get_value - - -def read_float(register, scale_factor=1.0, offset=0.0, places=2): - # type: (int, float, float) -> Callable[[BatteryStatus], float] - - def get_value(status): - # type: (BatteryStatus) -> float - value = status.modbus_data[register - cfg.BASE_ADDRESS] - - if value >= 0x8000: # convert to signed int16 - value -= 0x10000 # fiamm stores their integers signed AND with sign-offset @#%^&! - - result = (value+offset)*scale_factor - return round(result,places) - - return get_value - - -def read_hex_string(register, count): - # type: (int, int) -> Callable[[BatteryStatus], str] - """ - reads count consecutive modbus registers from start_address, - and returns a hex representation of it: - e.g. for count=4: DEAD BEEF DEAD BEEF. - """ - start = register - cfg.BASE_ADDRESS - end = start + count - - def get_value(status): - # type: (BatteryStatus) -> str - return ' '.join(['{0:0>4X}'.format(x) for x in status.modbus_data[start:end]]) - - return get_value - - -def read_led_state(register, led): - # type: (int, int) -> Callable[[BatteryStatus], int] - - read_lo = read_bool(register, led * 2) - read_hi = read_bool(register, led * 2 + 1) - - def get_value(status): - # type: (BatteryStatus) -> int - - lo = read_lo(status) - hi = read_hi(status) - - if hi: - if lo: - return LedState.blinking_fast - else: - return LedState.blinking_slow - else: - if lo: - return LedState.on - else: - return LedState.off - - return get_value - - -def read_bitmap(register): - # type: (int) -> Callable[[BatteryStatus], bitmap] - - def get_value(status): - # type: (BatteryStatus) -> bitmap - value = status.modbus_data[register - cfg.BASE_ADDRESS] - return value - - return get_value - - -def append_unit(unit): - # type: (unicode) -> Callable[[unicode], unicode] - - def get_text(v): - # type: (unicode) -> unicode - return "{0}{1}".format(str(v), unit) - - return get_text - - -def mean(numbers): - # type: (Iterable[float] | Iterable[int]) -> float - return float("{:.2f}".format(float(sum(numbers)) / len(numbers))) - -def ssum(numbers): - # type: (Iterable[float] | Iterable[int]) -> float - return float("{:.2f}".format(float(sum(numbers)))) - - -def first(ts): - return next(t for t in ts) - -def return_in_list(ts): - return ts - - diff --git a/NodeRed/dbus-fzsonick-48tl/dbus-fzsonick-48tl.py b/NodeRed/dbus-fzsonick-48tl/dbus-fzsonick-48tl.py deleted file mode 100755 index 99c01de4c..000000000 --- a/NodeRed/dbus-fzsonick-48tl/dbus-fzsonick-48tl.py +++ /dev/null @@ -1,980 +0,0 @@ -#!/usr/bin/python3 -u -# coding=utf-8 - -import re -import sys -import logging -from gi.repository import GLib - -import config as cfg -import convert as c - -from pymodbus.register_read_message import ReadInputRegistersResponse -from pymodbus.client.sync import ModbusSerialClient as Modbus -from pymodbus.other_message import ReportSlaveIdRequest -from pymodbus.exceptions import ModbusException -from pymodbus.pdu import ExceptionResponse - -from dbus.mainloop.glib import DBusGMainLoop -from data import BatteryStatus, Signal, Battery, LedColor, CsvSignal, LedState - -from collections import Iterable -from os import path - -app_dir = path.dirname(path.realpath(__file__)) -sys.path.insert(1, path.join(app_dir, 'ext', 'velib_python')) - -from vedbus import VeDbusService as DBus - -import time -import os -import csv - - -import requests -import hmac -import hashlib -import base64 -from datetime import datetime -import io - -class S3config: - def __init__(self): - self.bucket = "1-c0436b6a-d276-4cd8-9c44-1eae86cf5d0e" - self.region = "sos-ch-dk-2" - self.provider = "exo.io" - self.key = "EXOcc0e47a4c4d492888ff5a7f2" - self.secret = "79QG4unMh7MeVacMnXr5xGxEyAlWZDIdM-dg_nXFFr4" - self.content_type = "text/plain; charset=utf-8" - - @property - def host(self): - return f"{self.bucket}.{self.region}.{self.provider}" - - @property - def url(self): - return f"https://{self.host}" - - def create_put_request(self, s3_path, data): - headers = self._create_request("PUT", s3_path) - url = f"{self.url}/{s3_path}" - response = requests.put(url, headers=headers, data=data) - return response - - def _create_request(self, method, s3_path): - date = datetime.utcnow().strftime('%a, %d %b %Y %H:%M:%S GMT') - auth = self._create_authorization(method, self.bucket, s3_path, date, self.key, self.secret, self.content_type) - headers = { - "Host": self.host, - "Date": date, - "Authorization": auth, - "Content-Type": self.content_type - } - return headers - - @staticmethod - def _create_authorization(method, bucket, s3_path, date, s3_key, s3_secret, content_type="", md5_hash=""): - payload = f"{method}\n{md5_hash}\n{content_type}\n{date}\n/{bucket.strip('/')}/{s3_path.strip('/')}" - signature = base64.b64encode( - hmac.new(s3_secret.encode(), payload.encode(), hashlib.sha1).digest() - ).decode() - return f"AWS {s3_key}:{signature}" - -def read_csv_as_string(file_path): - """ - Reads a CSV file from the given path and returns its content as a single string. - """ - try: - with open(file_path, 'r', encoding='utf-8') as file: - return file.read() - except FileNotFoundError: - print(f"Error: The file {file_path} does not exist.") - return None - except IOError as e: - print(f"IO error occurred: {str(e)}") - return None - -CSV_DIR = "/data/csv_files/" -#CSV_DIR = "csv_files/" - -# Define the path to the file containing the installation name -INSTALLATION_NAME_FILE = '/data/innovenergy/openvpn/installation-name' - - -# trick the pycharm type-checker into thinking Callable is in scope, not used at runtime -# noinspection PyUnreachableCode -if False: - from typing import Callable - -def interpret_limb_bitmap(bitmap_value): - # The bit for string 1 also monitors all 5 strings: 0000 0000 means All 5 strings activated. 0000 0001 means string 1 disabled. - string1_disabled = int((bitmap_value & 0b00001) != 0) - string2_disabled = int((bitmap_value & 0b00010) != 0) - string3_disabled = int((bitmap_value & 0b00100) != 0) - string4_disabled = int((bitmap_value & 0b01000) != 0) - string5_disabled = int((bitmap_value & 0b10000) != 0) - n_limb_strings = string1_disabled+string2_disabled+string3_disabled+string4_disabled+string5_disabled - return n_limb_strings - -def create_csv_signals(firmware_version): - def read_power(status): - return int(read_current(status) * read_voltage(status)) - - read_voltage = c.read_float(register=999, scale_factor=0.01, offset=0, places=2) - read_current = c.read_float(register=1000, scale_factor=0.01, offset=-10000, places=2) - - read_limb_bitmap = c.read_bitmap(1059) - - def string1_disabled(status): - bitmap_value = read_limb_bitmap(status) - return int((bitmap_value & 0b00001) != 0) - - def string2_disabled(status): - bitmap_value = read_limb_bitmap(status) - return int((bitmap_value & 0b00010) != 0) - - def string3_disabled(status): - bitmap_value = read_limb_bitmap(status) - return int((bitmap_value & 0b00100) != 0) - - def string4_disabled(status): - bitmap_value = read_limb_bitmap(status) - return int((bitmap_value & 0b01000) != 0) - - def string5_disabled(status): - bitmap_value = read_limb_bitmap(status) - return int((bitmap_value & 0b10000) != 0) - - - def limp_strings_value(status): - return interpret_limb_bitmap(read_limb_bitmap(status)) - - def calc_power_limit_imposed_by_voltage_limit(v, i, v_limit, r_int): - # type: (float, float, float, float) -> float - - dv = v_limit - v - di = dv / r_int - p_limit = v_limit * (i + di) - - return p_limit - - def calc_power_limit_imposed_by_current_limit(v, i, i_limit, r_int): - # type: (float, float, float, float) -> float - - di = i_limit - i - dv = di * r_int - p_limit = i_limit * (v + dv) - - return p_limit - - def calc_max_charge_power(status): - # type: (BatteryStatus) -> int - n_strings = cfg.NUM_OF_STRING_PER_BATTERY-limp_strings_value(status) - i_max = n_strings * cfg.I_MAX_PER_STRING - v_max = cfg.V_MAX - r_int_min = cfg.R_STRING_MIN / n_strings - r_int_max = cfg.R_STRING_MAX / n_strings - - v = read_voltage(status) - i = read_current(status) - - p_limits = [ - calc_power_limit_imposed_by_voltage_limit(v, i, v_max,r_int_min), - calc_power_limit_imposed_by_voltage_limit(v, i, v_max, r_int_max), - calc_power_limit_imposed_by_current_limit(v, i, i_max, r_int_min), - calc_power_limit_imposed_by_current_limit(v, i, i_max, r_int_max), - ] - - p_limit = min(p_limits) # p_limit is normally positive here (signed) - p_limit = max(p_limit, 0) # charge power must not become negative - - return int(p_limit) - - def calc_max_discharge_power(status): - n_strings = cfg.NUM_OF_STRING_PER_BATTERY-limp_strings_value(status) - max_discharge_current = n_strings*cfg.I_MAX_PER_STRING - return int(max_discharge_current*read_voltage(status)) - - def return_led_state_blue(status): - led_state = c.read_led_state(register=1004, led=LedColor.blue)(status) - if led_state == LedState.blinking_fast or led_state == LedState.blinking_slow: - return "Blinking" - elif led_state == LedState.on: - return "On" - elif led_state == LedState.off: - return "Off" - - return "Unknown" - - def return_led_state_red(status): - led_state = c.read_led_state(register=1004, led=LedColor.red)(status) - if led_state == LedState.blinking_fast or led_state == LedState.blinking_slow: - return "Blinking" - elif led_state == LedState.on: - return "On" - elif led_state == LedState.off: - return "Off" - - return "Unknown" - - def return_led_state_green(status): - led_state = c.read_led_state(register=1004, led=LedColor.green)(status) - if led_state == LedState.blinking_fast or led_state == LedState.blinking_slow: - return "Blinking" - elif led_state == LedState.on: - return "On" - elif led_state == LedState.off: - return "Off" - - return "Unknown" - - def return_led_state_amber(status): - led_state = c.read_led_state(register=1004, led=LedColor.amber)(status) - if led_state == LedState.blinking_fast or led_state == LedState.blinking_slow: - return "Blinking" - elif led_state == LedState.on: - return "On" - elif led_state == LedState.off: - return "Off" - - return "Unknown" - - total_current = c.read_float(register=1062, scale_factor=0.01, offset=-10000, places=1) - - def read_total_current(status): - return total_current(status) - - def read_heating_current(status): - return total_current(status) - read_current(status) - - def read_heating_power(status): - return read_voltage(status) * read_heating_current(status) - - soc_ah = c.read_float(register=1002, scale_factor=0.1, offset=-10000, places=1) - - def read_soc_ah(status): - return soc_ah(status) - - def hex_string_to_ascii(hex_string): - # Ensure the hex_string is correctly formatted without spaces - hex_string = hex_string.replace(" ", "") - # Convert every two characters (a byte) in the hex string to ASCII - ascii_string = ''.join([chr(int(hex_string[i:i+2], 16)) for i in range(0, len(hex_string), 2)]) - return ascii_string - - battery_status_reader = c.read_hex_string(1060,2) - - def read_eoc_reached(status): - battery_status_string = battery_status_reader(status) - #if hex_string_to_ascii(battery_status_string) == "EOC_": - #return True - #return False - return hex_string_to_ascii(battery_status_string) == "EOC_" - - def read_serial_number(status): - - serial_regs = [1055, 1056, 1057, 1058] - serial_parts = [] - - for reg in serial_regs: - # reading each register as a single hex value - hex_value_fun = c.read_hex_string(reg, 1) - hex_value = hex_value_fun(status) - - # append without spaces and leading zeros stripped if any - serial_parts.append(hex_value.replace(' ', '')) - - # concatenate all parts to form the full serial number - serial_number = ''.join(serial_parts).rstrip('0') - - return serial_number - - return [ - - CsvSignal('/Battery/Devices/FwVersion', firmware_version), - CsvSignal('/Battery/Devices/Dc/Power', read_power, 'W'), - CsvSignal('/Battery/Devices/Dc/Voltage', read_voltage, 'V'), - CsvSignal('/Battery/Devices/Soc', c.read_float(register=1053, scale_factor=0.1, offset=0, places=1), '%'), - CsvSignal('/Battery/Devices/Temperatures/Cells/Average', c.read_float(register=1003, scale_factor=0.1, offset=-400, places=1), 'C'), - - CsvSignal('/Battery/Devices/Dc/Current', read_current, 'A'), - CsvSignal('/Battery/Devices/BusCurrent', read_total_current, 'A'), - CsvSignal('/Battery/Devices/CellsCurrent', read_current, 'A'), - CsvSignal('/Battery/Devices/HeatingCurrent', read_heating_current, 'A'), - CsvSignal('/Battery/Devices/HeatingPower', read_heating_power, 'W'), - CsvSignal('/Battery/Devices/SOCAh', read_soc_ah), - - CsvSignal('/Battery/Devices/Leds/Blue', return_led_state_blue), - CsvSignal('/Battery/Devices/Leds/Red', return_led_state_red), - CsvSignal('/Battery/Devices/Leds/Green', return_led_state_green), - CsvSignal('/Battery/Devices/Leds/Amber', return_led_state_amber), - - CsvSignal('/Battery/Devices/BatteryStrings/String1Active', string1_disabled), - CsvSignal('/Battery/Devices/BatteryStrings/String2Active', string2_disabled), - CsvSignal('/Battery/Devices/BatteryStrings/String3Active', string3_disabled), - CsvSignal('/Battery/Devices/BatteryStrings/String4Active', string4_disabled), - CsvSignal('/Battery/Devices/BatteryStrings/String5Active', string5_disabled), - - CsvSignal('/Battery/Devices/IoStatus/ConnectedToDcBus', c.read_bool(register=1013, bit=0)), - CsvSignal('/Battery/Devices/IoStatus/AlarmOutActive', c.read_bool(register=1013, bit=1)), - CsvSignal('/Battery/Devices/IoStatus/InternalFanActive', c.read_bool(register=1013, bit=2)), - CsvSignal('/Battery/Devices/IoStatus/VoltMeasurementAllowed', c.read_bool(register=1013, bit=3)), - CsvSignal('/Battery/Devices/IoStatus/AuxRelayBus', c.read_bool(register=1013, bit=4)), - CsvSignal('/Battery/Devices/IoStatus/RemoteStateActive', c.read_bool(register=1013, bit=5)), - CsvSignal('/Battery/Devices/IoStatus/RiscActive', c.read_bool(register=1013, bit=6)), - - - CsvSignal('/Battery/Devices/Eoc', read_eoc_reached), - CsvSignal('/Battery/Devices/SerialNumber', read_serial_number), - CsvSignal('/Battery/Devices/TimeSinceTOC', c.read_float(register=1052)), - CsvSignal('/Battery/Devices/MaxChargePower', calc_max_charge_power), - CsvSignal('/Battery/Devices/MaxDischargePower', calc_max_discharge_power), - - # Warnings - CsvSignal('/Battery/Devices/WarningFlags/TaM1', c.read_bool(register=1005, bit=1)), - CsvSignal('/Battery/Devices/WarningFlags/TbM1', c.read_bool(register=1005, bit=4)), - CsvSignal('/Battery/Devices/WarningFlags/VBm1', c.read_bool(register=1005, bit=6)), - CsvSignal('/Battery/Devices/WarningFlags/VBM1', c.read_bool(register=1005, bit=8)), - CsvSignal('/Battery/Devices/WarningFlags/IDM1', c.read_bool(register=1005, bit=10)), - CsvSignal('/Battery/Devices/WarningFlags/vsm1', c.read_bool(register=1005, bit=22)), - CsvSignal('/Battery/Devices/WarningFlags/vsM1', c.read_bool(register=1005, bit=24)), - CsvSignal('/Battery/Devices/WarningFlags/iCM1', c.read_bool(register=1005, bit=26)), - CsvSignal('/Battery/Devices/WarningFlags/iDM1', c.read_bool(register=1005, bit=28)), - CsvSignal('/Battery/Devices/WarningFlags/MID1', c.read_bool(register=1005, bit=30)), - CsvSignal('/Battery/Devices/WarningFlags/BLPW', c.read_bool(register=1005, bit=32)), - CsvSignal('/Battery/Devices/WarningFlags/CCBF', c.read_bool(register=1005, bit=33)), - CsvSignal('/Battery/Devices/WarningFlags/Ah_W', c.read_bool(register=1005, bit=35)), - CsvSignal('/Battery/Devices/WarningFlags/MPMM', c.read_bool(register=1005, bit=38)), - CsvSignal('/Battery/Devices/WarningFlags/TCdi', c.read_bool(register=1005, bit=40)), - CsvSignal('/Battery/Devices/WarningFlags/LMPW', c.read_bool(register=1005, bit=44)), - CsvSignal('/Battery/Devices/WarningFlags/TOCW', c.read_bool(register=1005, bit=47)), - CsvSignal('/Battery/Devices/WarningFlags/BUSL', c.read_bool(register=1005, bit=49)), - - # Alarms - CsvSignal('/Battery/Devices/AlarmFlags/Tam', c.read_bool(register=1005, bit=0)), - CsvSignal('/Battery/Devices/AlarmFlags/TaM2', c.read_bool(register=1005, bit=2)), - CsvSignal('/Battery/Devices/AlarmFlags/Tbm', c.read_bool(register=1005, bit=3)), - CsvSignal('/Battery/Devices/AlarmFlags/TbM2', c.read_bool(register=1005, bit=5)), - CsvSignal('/Battery/Devices/AlarmFlags/VBm2', c.read_bool(register=1005, bit=7)), - CsvSignal('/Battery/Devices/AlarmFlags/VBM2', c.read_bool(register=1005, bit=9)), - CsvSignal('/Battery/Devices/AlarmFlags/IDM2', c.read_bool(register=1005, bit=11)), - CsvSignal('/Battery/Devices/AlarmFlags/ISOB', c.read_bool(register=1005, bit=12)), - CsvSignal('/Battery/Devices/AlarmFlags/MSWE', c.read_bool(register=1005, bit=13)), - CsvSignal('/Battery/Devices/AlarmFlags/FUSE', c.read_bool(register=1005, bit=14)), - CsvSignal('/Battery/Devices/AlarmFlags/HTRE', c.read_bool(register=1005, bit=15)), - CsvSignal('/Battery/Devices/AlarmFlags/TCPE', c.read_bool(register=1005, bit=16)), - CsvSignal('/Battery/Devices/AlarmFlags/STRE', c.read_bool(register=1005, bit=17)), - CsvSignal('/Battery/Devices/AlarmFlags/CME', c.read_bool(register=1005, bit=18)), - CsvSignal('/Battery/Devices/AlarmFlags/HWFL', c.read_bool(register=1005, bit=19)), - CsvSignal('/Battery/Devices/AlarmFlags/HWEM', c.read_bool(register=1005, bit=20)), - CsvSignal('/Battery/Devices/AlarmFlags/ThM', c.read_bool(register=1005, bit=21)), - CsvSignal('/Battery/Devices/AlarmFlags/vsm2', c.read_bool(register=1005, bit=23)), - CsvSignal('/Battery/Devices/AlarmFlags/vsM2', c.read_bool(register=1005, bit=25)), - CsvSignal('/Battery/Devices/AlarmFlags/iCM2', c.read_bool(register=1005, bit=27)), - CsvSignal('/Battery/Devices/AlarmFlags/iDM2', c.read_bool(register=1005, bit=29)), - CsvSignal('/Battery/Devices/AlarmFlags/MID2', c.read_bool(register=1005, bit=31)), - CsvSignal('/Battery/Devices/AlarmFlags/HTFS', c.read_bool(register=1005, bit=42)), - CsvSignal('/Battery/Devices/AlarmFlags/DATA', c.read_bool(register=1005, bit=43)), - CsvSignal('/Battery/Devices/AlarmFlags/LMPA', c.read_bool(register=1005, bit=45)), - CsvSignal('/Battery/Devices/AlarmFlags/HEBT', c.read_bool(register=1005, bit=46)), - CsvSignal('/Battery/Devices/AlarmFlags/CURM', c.read_bool(register=1005, bit=48)), - - ] - - -def init_signals(hardware_version, firmware_version, n_batteries): - # type: (str,str,int) -> Iterable[Signal] - """ - A Signal holds all information necessary for the handling of a - certain datum (e.g. voltage) published by the battery. - - Signal(dbus_path, aggregate, get_value, get_text = str) - - dbus_path: str - object_path on DBus where the datum needs to be published - - aggregate: Iterable[object] -> object - function that combines the values of multiple batteries into one. - e.g. sum for currents, or mean for voltages - - get_value: (BatteryStatus) -> object [optional] - function to extract the datum from the modbus record, - alternatively: a constant - - get_text: (object) -> unicode [optional] - function to render datum to text, needed by DBus - alternatively: a constant - - - The conversion functions use the same parameters (e.g scale_factor, offset) - as described in the document 'T48TLxxx ModBus Protocol Rev.7.1' which can - be found in the /doc folder - """ - - product_id_hex = '0x{0:04x}'.format(cfg.PRODUCT_ID) - - read_voltage = c.read_float(register=999, scale_factor=0.01, offset=0, places=2) - read_current = c.read_float(register=1000, scale_factor=0.01, offset=-10000, places=2) - - def read_power(status): - return int(read_current(status) * read_voltage(status)) - - read_limb_bitmap = c.read_bitmap(1059) - def limp_strings_value(status): - return interpret_limb_bitmap(read_limb_bitmap(status)) - - def max_discharge_current(status): - return (cfg.NUM_OF_STRING_PER_BATTERY-limp_strings_value(status))*cfg.I_MAX_PER_STRING - - def max_charge_current(status): - return status.battery.ampere_hours/2 - - def calc_power_limit_imposed_by_voltage_limit(v, i, v_limit, r_int): - # type: (float, float, float, float) -> float - - dv = v_limit - v - di = dv / r_int - p_limit = v_limit * (i + di) - - return p_limit - - def calc_power_limit_imposed_by_current_limit(v, i, i_limit, r_int): - # type: (float, float, float, float) -> float - - di = i_limit - i - dv = di * r_int - p_limit = i_limit * (v + dv) - - return p_limit - - def calc_max_charge_power(status): - # type: (BatteryStatus) -> int - n_strings = cfg.NUM_OF_STRING_PER_BATTERY-limp_strings_value(status) - i_max = n_strings * cfg.I_MAX_PER_STRING - v_max = cfg.V_MAX - r_int_min = cfg.R_STRING_MIN / n_strings - r_int_max = cfg.R_STRING_MAX / n_strings - - v = read_voltage(status) - i = read_current(status) - - p_limits = [ - calc_power_limit_imposed_by_voltage_limit(v, i, v_max,r_int_min), - calc_power_limit_imposed_by_voltage_limit(v, i, v_max, r_int_max), - calc_power_limit_imposed_by_current_limit(v, i, i_max, r_int_min), - calc_power_limit_imposed_by_current_limit(v, i, i_max, r_int_max), - ] - - p_limit = min(p_limits) # p_limit is normally positive here (signed) - p_limit = max(p_limit, 0) # charge power must not become negative - - return int(p_limit) - - product_name = cfg.PRODUCT_NAME - if n_batteries > 1: - product_name = cfg.PRODUCT_NAME + ' x' + str(n_batteries) - - return [ - # Node Red related dbus paths - Signal('/TimeToTOCRequest', min, c.read_float(register=1052)), - Signal('/NumOfLimbStrings', c.return_in_list, get_value=limp_strings_value), - Signal('/NumOfBatteries', max, get_value=n_batteries), - Signal('/Dc/0/Voltage', c.mean, get_value=read_voltage, get_text=c.append_unit('V')), - Signal('/Dc/0/Current', c.ssum, get_value=read_current, get_text=c.append_unit('A')), - Signal('/Dc/0/Power', c.ssum, get_value=read_power, get_text=c.append_unit('W')), - - Signal('/BussVoltage', c.mean, c.read_float(register=1001, scale_factor=0.01, offset=0, places=2), c.append_unit('V')), - Signal('/Soc', c.mean, c.read_float(register=1053, scale_factor=0.1, offset=0, places=1), c.append_unit('%')), - Signal('/LowestSoc', min, c.read_float(register=1053, scale_factor=0.1, offset=0, places=1), c.append_unit('%')), - Signal('/Dc/0/Temperature', c.mean, c.read_float(register=1003, scale_factor=0.1, offset=-400, places=1), c.append_unit(u'°C')), - Signal('/Dc/0/LowestTemperature', min, c.read_float(register=1003, scale_factor=0.1, offset=-400, places=1), c.append_unit(u'°C')), - - # Charge/Discharge current, voltage and power - Signal('/Info/MaxDischargeCurrent', c.ssum, max_discharge_current,c.append_unit('A')), - Signal('/Info/MaxChargeCurrent', c.ssum, max_charge_current, c.append_unit('A')), - Signal('/Info/MaxChargeVoltage', min, cfg.MAX_CHARGE_VOLTAGE, c.append_unit('V')), - Signal('/Info/MaxChargePower', c.ssum, calc_max_charge_power), - - # Victron mandatory dbus paths - Signal('/Mgmt/ProcessName', c.first, __file__), - Signal('/Mgmt/ProcessVersion', c.first, cfg.SOFTWARE_VERSION), - Signal('/Mgmt/Connection', c.first, cfg.CONNECTION), - Signal('/DeviceInstance', c.first, cfg.DEVICE_INSTANCE), - Signal('/ProductName', c.first, product_name), - Signal('/ProductId', c.first, cfg.PRODUCT_ID, product_id_hex), - Signal('/Connected', c.first, 1), - #Signal('/FirmwareVersion', c.first, cfg.FIRMWARE_VERSION, firmware_version), - Signal('/FirmwareVersion', c.return_in_list, firmware_version), - Signal('/HardwareVersion', c.first, cfg.HARDWARE_VERSION, hardware_version), - - ## Diagnostics - Signal('/Diagnostics/BmsVersion', c.first, lambda s: s.battery.bms_version), - - # Warnings - #Signal('/Diagnostics/WarningFlags', c.first, c.read_hex_string(register=1005, count=4)), - Signal('/WarningFlags/TaM1', c.return_in_list, c.read_bool(register=1005, bit=1)), - Signal('/WarningFlags/TbM1', c.return_in_list, c.read_bool(register=1005, bit=4)), - Signal('/WarningFlags/VBm1', c.return_in_list, c.read_bool(register=1005, bit=6)), - Signal('/WarningFlags/VBM1', c.return_in_list, c.read_bool(register=1005, bit=8)), - Signal('/WarningFlags/IDM1', c.return_in_list, c.read_bool(register=1005, bit=10)), - Signal('/WarningFlags/vsm1', c.return_in_list, c.read_bool(register=1005, bit=22)), - Signal('/WarningFlags/vsM1', c.return_in_list, c.read_bool(register=1005, bit=24)), - Signal('/WarningFlags/iCM1', c.return_in_list, c.read_bool(register=1005, bit=26)), - Signal('/WarningFlags/iDM1', c.return_in_list, c.read_bool(register=1005, bit=28)), - Signal('/WarningFlags/MID1', c.return_in_list, c.read_bool(register=1005, bit=30)), - Signal('/WarningFlags/BLPW', c.return_in_list, c.read_bool(register=1005, bit=32)), - Signal('/WarningFlags/CCBF', c.return_in_list, c.read_bool(register=1005, bit=33)), - Signal('/WarningFlags/Ah_W', c.return_in_list, c.read_bool(register=1005, bit=35)), - Signal('/WarningFlags/MPMM', c.return_in_list, c.read_bool(register=1005, bit=38)), - #Signal('/WarningFlags/TCMM', c.return_in_list, c.read_bool(register=1005, bit=39)), - Signal('/WarningFlags/TCdi', c.return_in_list, c.read_bool(register=1005, bit=40)), - Signal('/WarningFlags/LMPW', c.return_in_list, c.read_bool(register=1005, bit=44)), - Signal('/WarningFlags/TOCW', c.return_in_list, c.read_bool(register=1005, bit=47)), - Signal('/WarningFlags/BUSL', c.return_in_list, c.read_bool(register=1005, bit=49)), - - # Alarms - #Signal('/Diagnostics/AlarmFlags', c.first, c.read_hex_string(register=1009, count=4)), - Signal('/AlarmFlags/Tam', c.return_in_list, c.read_bool(register=1005, bit=0)), - Signal('/AlarmFlags/TaM2', c.return_in_list, c.read_bool(register=1005, bit=2)), - Signal('/AlarmFlags/Tbm', c.return_in_list, c.read_bool(register=1005, bit=3)), - Signal('/AlarmFlags/TbM2', c.return_in_list, c.read_bool(register=1005, bit=5)), - Signal('/AlarmFlags/VBm2', c.return_in_list, c.read_bool(register=1005, bit=7)), - Signal('/AlarmFlags/VBM2', c.return_in_list, c.read_bool(register=1005, bit=9)), - Signal('/AlarmFlags/IDM2', c.return_in_list, c.read_bool(register=1005, bit=11)), - Signal('/AlarmFlags/ISOB', c.return_in_list, c.read_bool(register=1005, bit=12)), - Signal('/AlarmFlags/MSWE', c.return_in_list, c.read_bool(register=1005, bit=13)), - Signal('/AlarmFlags/FUSE', c.return_in_list, c.read_bool(register=1005, bit=14)), - Signal('/AlarmFlags/HTRE', c.return_in_list, c.read_bool(register=1005, bit=15)), - Signal('/AlarmFlags/TCPE', c.return_in_list, c.read_bool(register=1005, bit=16)), - Signal('/AlarmFlags/STRE', c.return_in_list, c.read_bool(register=1005, bit=17)), - Signal('/AlarmFlags/CME', c.return_in_list, c.read_bool(register=1005, bit=18)), - Signal('/AlarmFlags/HWFL', c.return_in_list, c.read_bool(register=1005, bit=19)), - Signal('/AlarmFlags/HWEM', c.return_in_list, c.read_bool(register=1005, bit=20)), - Signal('/AlarmFlags/ThM', c.return_in_list, c.read_bool(register=1005, bit=21)), - Signal('/AlarmFlags/vsm2', c.return_in_list, c.read_bool(register=1005, bit=23)), - Signal('/AlarmFlags/vsM2', c.return_in_list, c.read_bool(register=1005, bit=25)), - Signal('/AlarmFlags/iCM2', c.return_in_list, c.read_bool(register=1005, bit=27)), - Signal('/AlarmFlags/iDM2', c.return_in_list, c.read_bool(register=1005, bit=29)), - Signal('/AlarmFlags/MID2', c.return_in_list, c.read_bool(register=1005, bit=31)), - #Signal('/AlarmFlags/TcBM', c.return_in_list, c.read_bool(register=1005, bit=36)), - #Signal('/AlarmFlags/BRNF', c.return_in_list, c.read_bool(register=1005, bit=37)), - Signal('/AlarmFlags/HTFS', c.return_in_list, c.read_bool(register=1005, bit=42)), - Signal('/AlarmFlags/DATA', c.return_in_list, c.read_bool(register=1005, bit=43)), - Signal('/AlarmFlags/LMPA', c.return_in_list, c.read_bool(register=1005, bit=45)), - Signal('/AlarmFlags/HEBT', c.return_in_list, c.read_bool(register=1005, bit=46)), - Signal('/AlarmFlags/CURM', c.return_in_list, c.read_bool(register=1005, bit=48)), - - # LedStatus - Signal('/Diagnostics/LedStatus/Red', c.first, c.read_led_state(register=1004, led=LedColor.red)), - Signal('/Diagnostics/LedStatus/Blue', c.first, c.read_led_state(register=1004, led=LedColor.blue)), - Signal('/Diagnostics/LedStatus/Green', c.first, c.read_led_state(register=1004, led=LedColor.green)), - Signal('/Diagnostics/LedStatus/Amber', c.first, c.read_led_state(register=1004, led=LedColor.amber)), - - # IO Status - Signal('/Diagnostics/IoStatus/MainSwitchClosed', c.return_in_list, c.read_bool(register=1013, bit=0)), - Signal('/Diagnostics/IoStatus/AlarmOutActive', c.return_in_list, c.read_bool(register=1013, bit=1)), - Signal('/Diagnostics/IoStatus/InternalFanActive', c.return_in_list, c.read_bool(register=1013, bit=2)), - Signal('/Diagnostics/IoStatus/VoltMeasurementAllowed', c.return_in_list, c.read_bool(register=1013, bit=3)), - Signal('/Diagnostics/IoStatus/AuxRelay', c.return_in_list, c.read_bool(register=1013, bit=4)), - Signal('/Diagnostics/IoStatus/RemoteState', c.return_in_list, c.read_bool(register=1013, bit=5)), - Signal('/Diagnostics/IoStatus/RiscOn', c.return_in_list, c.read_bool(register=1013, bit=6)), - ] - - -def init_modbus(tty): - # type: (str) -> Modbus - - logging.debug('initializing Modbus') - - return Modbus( - port='/dev/' + tty, - method=cfg.MODE, - baudrate=cfg.BAUD_RATE, - stopbits=cfg.STOP_BITS, - bytesize=cfg.BYTE_SIZE, - timeout=cfg.TIMEOUT, - parity=cfg.PARITY) - - -def init_dbus(tty, signals): - # type: (str, Iterable[Signal]) -> DBus - - logging.debug('initializing DBus service') - dbus = DBus(servicename=cfg.SERVICE_NAME_PREFIX + tty) - - logging.debug('initializing DBus paths') - for signal in signals: - init_dbus_path(dbus, signal) - - return dbus - - -# noinspection PyBroadException -def try_get_value(sig): - # type: (Signal) -> object - try: - return sig.get_value(None) - except: - return None - - -def init_dbus_path(dbus, sig): - # type: (DBus, Signal) -> () - - dbus.add_path( - sig.dbus_path, - try_get_value(sig), - gettextcallback=lambda _, v: sig.get_text(v)) - - -def init_main_loop(): - # type: () -> DBusGMainLoop - logging.debug('initializing DBusGMainLoop Loop') - DBusGMainLoop(set_as_default=True) - return GLib.MainLoop() - - -def report_slave_id(modbus, slave_address): - # type: (Modbus, int) -> str - - slave = str(slave_address) - - logging.debug('requesting slave id from node ' + slave) - - try: - - modbus.connect() - - request = ReportSlaveIdRequest(unit=slave_address) - response = modbus.execute(request) - - if response is ExceptionResponse or issubclass(type(response), ModbusException): - raise Exception('failed to get slave id from ' + slave + ' : ' + str(response)) - - return response.identifier - - finally: - modbus.close() - - -def identify_battery(modbus, slave_address): - # type: (Modbus, int) -> Battery - - logging.info('identifying battery...') - - hardware_version, bms_version, ampere_hours = parse_slave_id(modbus, slave_address) - firmware_version = read_firmware_version(modbus, slave_address) - - specs = Battery( - slave_address=slave_address, - hardware_version=hardware_version, - firmware_version=firmware_version, - bms_version=bms_version, - ampere_hours=ampere_hours) - - logging.info('battery identified:\n{0}'.format(str(specs))) - - return specs - - -def identify_batteries(modbus): - # type: (Modbus) -> list[Battery] - - def _identify_batteries(): - address_range = range(1, cfg.MAX_SLAVE_ADDRESS + 1) - - for slave_address in address_range: - try: - yield identify_battery(modbus, slave_address) - except Exception as e: - logging.info('failed to identify battery at {0} : {1}'.format(str(slave_address), str(e))) - - return list(_identify_batteries()) # force that lazy iterable! - - -def parse_slave_id(modbus, slave_address): - # type: (Modbus, int) -> (str, str, int) - - slave_id = report_slave_id(modbus, slave_address) - - sid = re.sub(b'[^\x20-\x7E]', b'', slave_id) # remove weird special chars - - match = re.match('(?P48TL(?P\d+)) *(?P.*)', sid.decode('ascii')) - - if match is None: - raise Exception('no known battery found') - - return match.group('hw'), match.group('bms'), int(match.group('ah')) - - -def read_firmware_version(modbus, slave_address): - # type: (Modbus, int) -> str - - logging.debug('reading firmware version') - - try: - modbus.connect() - - response = read_modbus_registers(modbus, slave_address, base_address=1054, count=1) - register = response.registers[0] - - return '{0:0>4X}'.format(register) - - finally: - modbus.close() # close in any case - - -def read_modbus_registers(modbus, slave_address, base_address=cfg.BASE_ADDRESS, count=cfg.NO_OF_REGISTERS): - # type: (Modbus, int) -> ReadInputRegistersResponse - - logging.debug('requesting modbus registers {0}-{1}'.format(base_address, base_address + count)) - - return modbus.read_input_registers( - address=base_address, - count=count, - unit=slave_address) - - -def read_battery_status(modbus, battery): - # type: (Modbus, Battery) -> BatteryStatus - """ - Read the modbus registers containing the battery's status info. - """ - - logging.debug('reading battery status') - - try: - modbus.connect() - data = read_modbus_registers(modbus, battery.slave_address) - return BatteryStatus(battery, data.registers) - - finally: - modbus.close() # close in any case - - -def publish_values(dbus, signals, statuses): - # type: (DBus, Iterable[Signal], Iterable[BatteryStatus]) -> () - - for s in signals: - values = [s.get_value(status) for status in statuses] - with dbus as srv: - srv[s.dbus_path] = s.aggregate(values) - - -def update(modbus, batteries, dbus, signals, csv_signals): - # type: (Modbus, Iterable[Battery], DBus, Iterable[Signal]) -> bool - - """ - Main update function - - 1. requests status record each battery via modbus, - 2. parses the data using Signal.get_value - 3. aggregates the data from all batteries into one datum using Signal.aggregate - 4. publishes the data on the dbus - """ - - logging.debug('starting update cycle') - - statuses = [read_battery_status(modbus, battery) for battery in batteries] - node_numbers = [battery.slave_address for battery in batteries] - - publish_values(dbus, signals, statuses) - create_csv_files(csv_signals, statuses, node_numbers) - - logging.debug('finished update cycle\n') - return True - - -def print_usage(): - print ('Usage: ' + __file__ + ' ') - print ('Example: ' + __file__ + ' ttyUSB0') - - -def parse_cmdline_args(argv): - # type: (list[str]) -> str - - if len(argv) == 0: - logging.info('missing command line argument for tty device') - print_usage() - sys.exit(1) - - return argv[0] - - -alive = True # global alive flag, watchdog_task clears it, update_task sets it - - -def create_update_task(modbus, dbus, batteries, signals, csv_signals, main_loop): - # type: (Modbus, DBus, Iterable[Battery], Iterable[Signal], DBusGMainLoop) -> Callable[[],bool] - """ - Creates an update task which runs the main update function - and resets the alive flag - """ - - def update_task(): - # type: () -> bool - - global alive - - alive = update(modbus, batteries, dbus, signals, csv_signals) - - if not alive: - logging.info('update_task: quitting main loop because of error') - main_loop.quit() - - return alive - - return update_task - - -def create_watchdog_task(main_loop): - # type: (DBusGMainLoop) -> Callable[[],bool] - """ - Creates a Watchdog task that monitors the alive flag. - The watchdog kills the main loop if the alive flag is not periodically reset by the update task. - Who watches the watchdog? - """ - def watchdog_task(): - # type: () -> bool - - global alive - - if alive: - logging.debug('watchdog_task: update_task is alive') - alive = False - return True - else: - logging.info('watchdog_task: killing main loop because update_task is no longer alive') - main_loop.quit() - return False - - return watchdog_task - - -def get_installation_name(file_path): - with open(file_path, 'r') as file: - return file.read().strip() - -def manage_csv_files(directory_path, max_files=20): - csv_files = [f for f in os.listdir(directory_path)] - 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: - file_to_delete = os.path.join(directory_path, csv_files.pop(0)) - os.remove(file_to_delete) - -def serialize_for_csv(value): - if isinstance(value, (dict, list, tuple)): - return json.dumps(value, ensure_ascii=False) - return str(value) - -def insert_id(path, id_number): - parts = path.split("/") - - insert_position = parts.index("Devices") + 1 - - parts.insert(insert_position, str(id_number)) - - return "/".join(parts) - -def create_csv_files(signals, statuses, node_numbers): - timestamp = int(time.time()) - if timestamp % 2 != 0: - timestamp -= 1 - # Create CSV directory if it doesn't exist - if not os.path.exists(CSV_DIR): - os.makedirs(CSV_DIR) - - #installation_name = get_installation_name(INSTALLATION_NAME_FILE) - csv_filename = f"{timestamp}.csv" - csv_path = os.path.join(CSV_DIR, csv_filename) - - # Append values to the CSV file - with open(csv_path, 'a', newline='') as csvfile: - csv_writer = csv.writer(csvfile, delimiter=';') - - # Add a special row for the nodes configuration - nodes_config_path = "/Config/Devices/BatteryNodes" - nodes_list = ",".join(str(node) for node in node_numbers) - config_row = [nodes_config_path, nodes_list, ""] - csv_writer.writerow(config_row) - - # Iterate over each node and signal to create rows in the new format - for i, node in enumerate(node_numbers): - for s in signals: - signal_name = insert_id(s.name, i+1) - #value = serialize_for_csv(s.get_value(statuses[i])) - value = s.get_value(statuses[i]) - row_values = [signal_name, value, s.get_text] - csv_writer.writerow(row_values) - - # Manage CSV files, keep a limited number of files - - - - # Create the CSV as a string - csv_data = read_csv_as_string(csv_path) - - - # Create an S3config instance - s3_config = S3config() - response = s3_config.create_put_request(csv_filename, csv_data) - - if response.status_code == 200: - os.remove(csv_path) - print("Success") - else: - failed_dir = os.path.join(CSV_DIR, "failed") - if not os.path.exists(failed_dir): - os.makedirs(failed_dir) - failed_path = os.path.join(failed_dir, csv_filename) - os.rename(csv_path, failed_path) - print("Uploading failed") - manage_csv_files(failed_dir, 10) - - - manage_csv_files(CSV_DIR) - - -def main(argv): - # type: (list[str]) -> () - - logging.basicConfig(level=cfg.LOG_LEVEL) - logging.info('starting ' + __file__) - - tty = parse_cmdline_args(argv) - modbus = init_modbus(tty) - - batteries = identify_batteries(modbus) - - n = len(batteries) - - logging.info('found ' + str(n) + (' battery' if n == 1 else ' batteries')) - - if n <= 0: - sys.exit(2) - - bat = c.first(batteries) # report hw and fw version of first battery found - - signals = init_signals(bat.hardware_version, bat.firmware_version, n) - csv_signals = create_csv_signals(bat.firmware_version) - - main_loop = init_main_loop() # must run before init_dbus because gobject does some global magic - dbus = init_dbus(tty, signals) - - update_task = create_update_task(modbus, dbus, batteries, signals, csv_signals, main_loop) - watchdog_task = create_watchdog_task(main_loop) - - GLib.timeout_add(cfg.UPDATE_INTERVAL * 2, watchdog_task) # add watchdog first - GLib.timeout_add(cfg.UPDATE_INTERVAL, update_task) # call update once every update_interval - - logging.info('starting GLib.MainLoop') - main_loop.run() - logging.info('GLib.MainLoop was shut down') - - sys.exit(0xFF) # reaches this only on error - - -if __name__ == "__main__": - main(sys.argv[1:]) diff --git a/NodeRed/dvcc.py b/NodeRed/dvcc.py deleted file mode 100644 index 3a6720892..000000000 --- a/NodeRed/dvcc.py +++ /dev/null @@ -1,1287 +0,0 @@ -from dbus.exceptions import DBusException -from gi.repository import GLib -import logging -from math import pi, floor, ceil -import traceback -from itertools import count, chain -from functools import partial, wraps - -# Victron packages -from sc_utils import safeadd, copy_dbus_value, reify, ExpiringValue -from ve_utils import exit_on_error - -from delegates.base import SystemCalcDelegate -from delegates.batteryservice import BatteryService -from delegates.multi import Multi as MultiService - -# Adjust things this often (in seconds) -# solar chargers has to switch to HEX mode each time we write a value to its -# D-Bus service. Writing too often may block text messages. In MPPT firmware -# v1.23 and later, all relevant values will be transmitted as asynchronous -# message, so the update rate could be increased. For now, keep this at 3 and -# above. -ADJUST = 3 - -VEBUS_FIRMWARE_REQUIRED = 0x422 -VEDIRECT_FIRMWARE_REQUIRED = 0x129 -VECAN_FIRMWARE_REQUIRED = 0x10200 # 1.02, 24-bit version - -# This is a place to account for some BMS quirks where we may have to ignore -# the BMS value and substitute our own. - -def _byd_quirk(dvcc, bms, charge_voltage, charge_current, feedback_allowed): - """ Quirk for the BYD batteries. When the battery sends CCL=0, float it at - 55V. """ - if charge_current == 0: - return (55, 40, feedback_allowed, False) - return (charge_voltage, charge_current, feedback_allowed, False) - -def _lg_quirk(dvcc, bms, charge_voltage, charge_current, feedback_allowed): - """ Quirk for LG batteries. The hard limit is 58V. Above that you risk - tripping on high voltage. The batteries publish a charge voltage of 57.7V - but we need to make room for an 0.4V overvoltage when feed-in is enabled. - """ - # Make room for a potential 0.4V at the top - return (min(charge_voltage, 57.3), charge_current, feedback_allowed, False) - -def _pylontech_quirk(dvcc, bms, charge_voltage, charge_current, feedback_allowed): - """ Quirk for Pylontech. Make a bit of room at the top. Pylontech says that - at 51.8V the battery is 95% full, and that balancing starts at 90%. - 53.2V is normally considered 100% full, and 54V raises an alarm. By - running the battery at 52.4V it will be 99%-100% full, balancing should - be active, and we should avoid high voltage alarms. - - Identify 24-V batteries by the lower charge voltage, and do the same - thing with an 8-to-15 cell ratio, +-3.48V per cell. - """ - # Use 3.48V per cell plus a little, 52.4V for 15 cell 48V batteries. - # Use 3.46V per cell plus a little, 27.8V for 24V batteries testing shows that's 100% SOC. - # That leaves 1.6V margin for 48V batteries and 1.0V for 24V. - # See https://github.com/victronenergy/venus/issues/536 - if charge_voltage > 55: - # 48V battery (16 cells.) Assume BMS knows what it's doing. - return (charge_voltage, charge_current, feedback_allowed, False) - if charge_voltage > 30: - # 48V battery (15 cells) - return (min(charge_voltage, 52.4), charge_current, feedback_allowed, False) - if charge_voltage > 20: - # 24V battery (8 cells). 24V batteries send CCL=0 when they are full, - # whereas the 48V batteries reduce CCL by 50% when the battery is full. - # Do the same for 24V batteries. The normal limit is C/2, so put the - # limit to C/4. Note that this is just a nicety, the important part is - # to clip the charge voltage to 27.8 volts. That fixes the sawtooth - # issue. - capacity = bms.capacity or 55 - return (min(charge_voltage, 27.8), max(charge_current, round(capacity/4.0)), feedback_allowed, False) - - # Not known, probably a 12V battery. - return (charge_voltage, charge_current, feedback_allowed, False) - -def _pylontech_pelio_quirk(dvcc, bms, charge_voltage, charge_current, feedback_allowed): - """ Quirk for Pelio-L batteries. This is a 16-cell battery. 56V is 3.5V per - cell which is where this battery registers 100% SOC. Battery sends - CCL=0 at 3.55V per cell, to ensure good feed-in of excess DC coupled - PV, set the lower limit to 20% of capacity, which is what the battery - itself imposes at around 98% SOC. - """ - capacity = bms.capacity or 100.0 - return (min(charge_voltage, 56.0), max(charge_current, round(capacity/5.0)), feedback_allowed, False) - -def _lynx_smart_bms_quirk(dvcc, bms, charge_voltage, charge_current, feedback_allowed): - """ When the Lynx Smart BMS sends CCL=0, it wants all chargers to stop. """ - return (charge_voltage, charge_current, feedback_allowed, True) - -QUIRKS = { - 0xB004: _lg_quirk, - 0xB009: _pylontech_quirk, - 0xB00A: _byd_quirk, - 0xB015: _byd_quirk, - 0xB019: _byd_quirk, - 0xB029: _pylontech_pelio_quirk, - 0xA3E5: _lynx_smart_bms_quirk, - 0xA3E6: _lynx_smart_bms_quirk, -} - -def distribute(current_values, max_values, increment): - """ current_values and max_values are lists of equal size containing the - current limits, and the maximum they can be increased to. increment - contains the amount by which we want to increase the total, ie the sum - of the values in current_values, while staying below max_values. - - This is done simply by first attempting to spread the increment - equally. If a value exceeds the max in that process, the remainder is - thrown back into the pot and distributed equally among the rest. - - Negative values are also handled, and zero is assumed to be the - implicit lower limit. """ - n = cn = len(current_values) - new_values = [-1] * n - for j in range(0, n): - for i, mv, av in zip(count(), max_values, current_values): - assert mv >= 0 - if new_values[i] == mv or new_values[i] == 0: - continue - nv = av + float(increment) / cn - - if nv >= mv: - increment += av - mv - cn -= 1 - new_values[i] = mv - break - elif nv < 0: - increment += av - cn -= 1 - new_values[i] = 0 - break - - new_values[i] = nv - else: - break - continue - return new_values - -class LowPassFilter(object): - """ Low pass filter, with a cap. """ - def __init__(self, omega, value): - self.omega = omega - self._value = value - - def update(self, newvalue): - self._value += (newvalue - self._value) * self.omega - return self._value - - @property - def value(self): - return self._value - -class BaseCharger(object): - def __init__(self, monitor, service): - self.monitor = monitor - self.service = service - - def _get_path(self, path): - return self.monitor.get_value(self.service, path) - - def _set_path(self, path, v): - if self.monitor.seen(self.service, path): - self.monitor.set_value_async(self.service, path, v) - - @property - def firmwareversion(self): - return self.monitor.get_value(self.service, '/FirmwareVersion') - - @property - def product_id(self): - return self.monitor.get_value(self.service, '/ProductId') or 0 - - @property - def chargecurrent(self): - return self._get_path('/Dc/0/Current') - - @property - def n2k_device_instance(self): - return self.monitor.get_value(self.service, '/N2kDeviceInstance') - - @property - def connection(self): - return self._get_path('/Mgmt/Connection') - - @property - def active(self): - return self._get_path('/State') != 0 - - @property - def has_externalcontrol_support(self): - """ Override this to implement detection of external control support. - """ - return False - - @property - def want_bms(self): - """ Indicates whether this solar charger was previously - controlled by a BMS and therefore expects one to - be present. """ - return 0 - - @property - def maxchargecurrent(self): - v = self._get_path('/Link/ChargeCurrent') - return v if v is not None else self.currentlimit - - @maxchargecurrent.setter - def maxchargecurrent(self, v): - v = max(0, min(v, self.currentlimit)) - self._set_path('/Link/ChargeCurrent', v) - - @property - def chargevoltage(self): - return self._get_path('/Link/ChargeVoltage') - - @chargevoltage.setter - def chargevoltage(self, v): - self._set_path('/Link/ChargeVoltage', v) - - @property - def currentlimit(self): - return self._get_path('/Settings/ChargeCurrentLimit') - - def maximize_charge_current(self): - """ Max out the charge current of this solar charger by setting - ChargeCurrent to the configured limit in settings. """ - if self.monitor.seen(self.service, '/Link/ChargeCurrent'): - copy_dbus_value(self.monitor, - self.service, '/Settings/ChargeCurrentLimit', - self.service, '/Link/ChargeCurrent') - - @property - def smoothed_current(self): - # For chargers that are not solar-chargers, the generated current - # should be fairly stable already - return self.chargecurrent or 0 - -class Networkable(object): - """ Mix into BaseCharger to support network paths. """ - @property - def networkmode(self): - return self._get_path('/Link/NetworkMode') - - @networkmode.setter - def networkmode(self, v): - self._set_path('/Link/NetworkMode', 0) - self._set_path('/Settings/BmsPresent',0) - -class SolarCharger(BaseCharger, Networkable): - """ Encapsulates a solar charger on dbus. Exposes dbus paths as convenient - attributes. """ - - def __init__(self, monitor, service): - super().__init__(monitor, service) - self._smoothed_current = LowPassFilter((2 * pi)/20, self.chargecurrent or 0) - self._has_externalcontrol_support = False - - @property - def has_externalcontrol_support(self): - # If we have previously determined that there is support, re-use that. - # If the firmware is ever to be downgraded, the solarcharger must necessarily - # disconnect and reconnect, so this is completely safe. - if self._has_externalcontrol_support: - return True - - # These products are known to have support, but may have older firmware - # See https://github.com/victronenergy/venus/issues/655 - if 0xA102 <= self.product_id <= 0xA10E: - self._has_externalcontrol_support = True - return True - - v = self.firmwareversion - - # If the firmware version is not known, don't raise a false - # warning. - if v is None: - return True - - # New VE.Can controllers have 24-bit version strings. One would - # hope that any future VE.Direct controllers with 24-bit firmware - # versions will 1) have a version larger than 1.02 and 2) support - # external control. - if v & 0xFF0000: - self._has_externalcontrol_support = (v >= VECAN_FIRMWARE_REQUIRED) - else: - self._has_externalcontrol_support = (v >= VEDIRECT_FIRMWARE_REQUIRED) - return self._has_externalcontrol_support - - @property - def smoothed_current(self): - """ Returns the internal low-pass filtered current value. """ - return self._smoothed_current.value - - def update_values(self): - # This is called periodically from a timer to maintain - # a smooth current value. - v = self.monitor.get_value(self.service, '/Dc/0/Current') - if v is not None: - self._smoothed_current.update(v) - -class Alternator(BaseCharger, Networkable): - """ This also includes other DC/DC converters. """ - @property - def has_externalcontrol_support(self): - # If it has the ChargeCurrent path, we assume it has - # external control support - return self.monitor.seen(self.service, '/Link/ChargeCurrent') - -class InverterCharger(SolarCharger): - """ Encapsulates an inverter/charger object, currently the inverter RS, - which has a solar input and can charge the battery like a solar - charger, but is also an inverter. - """ - def __init__(self, monitor, service): - super(InverterCharger, self).__init__(monitor, service) - - @property - def has_externalcontrol_support(self): - # Inverter RS always had support - return True - - @property - def maxdischargecurrent(self): - """ Returns discharge current setting. This does nothing except - return the previously set value. """ - return self.monitor.get_value(self.service, '/Link/DischargeCurrent') - - @maxdischargecurrent.setter - def maxdischargecurrent(self, limit): - self.monitor.set_value_async(self.service, '/Link/DischargeCurrent', limit) - - def set_maxdischargecurrent(self, limit): - """ Write the maximum discharge limit across. The firmware - already handles a zero by turning off. """ - self.maxdischargecurrent = limit - - @property - def active(self): - # The charger part is active, as long as the maximum charging - # power value is more than zero. - return (self.monitor.get_value(self.service, - '/Settings/ChargeCurrentLimit') or 0) > 0 - -class InverterSubsystem(object): - """ Encapsulate collection of inverters. """ - def __init__(self, monitor): - self.monitor = monitor - self._inverters = {} - - def _add_inverter(self, ob): - self._inverters[ob.service] = ob - return ob - - def remove_inverter(self, service): - del self._inverters[service] - - def __iter__(self): - return iter(self._inverters.values()) - - def __len__(self): - return len(self._inverters) - - def __contains__(self, k): - return k in self._inverters - - def set_maxdischargecurrent(self, limit): - # Inverters only care about limit=0, so simply send - # it to all. - for inverter in self: - inverter.set_maxdischargecurrent(limit) - -class ChargerSubsystem(object): - """ Encapsulates a collection of chargers or devices that incorporate a - charger, to collectively make up a charging system (sans Multi). - Properties related to the whole system or some combination of the - individual chargers are exposed here as attributes. """ - def __init__(self, monitor): - self.monitor = monitor - self._solarchargers = {} - self._otherchargers = {} - - def add_solar_charger(self, service): - self._solarchargers[service] = charger = SolarCharger(self.monitor, service) - return charger - - def add_alternator(self, service): - self._otherchargers[service] = charger = Alternator(self.monitor, service) - return charger - - def add_invertercharger(self, service): - self._solarchargers[service] = inverter = InverterCharger(self.monitor, service) - return inverter - - def remove_charger(self, service): - for di in (self._solarchargers, self._otherchargers): - try: - del di[service] - except KeyError: - pass - - def __iter__(self): - return iter(chain(self._solarchargers.values(), self._otherchargers.values())) - - def __len__(self): - return len(self._solarchargers) + len(self._otherchargers) - - def __contains__(self, k): - return k in self._solarchargers or k in self._otherchargers - - @property - def has_externalcontrol_support(self): - # Only consider solarchargers. This is used for firmware warning - # above, and we only care about the solar chargers there. - return all(s.has_externalcontrol_support for s in self._solarchargers.values()) - - @property - def has_vecan_chargers(self): - """ Returns true if we have any VE.Can chargers in the system. This is - used elsewhere to enable broadcasting charge voltages on the relevant - can device. """ - return any((s.connection == 'VE.Can' for s in self)) - - @property - def want_bms(self): - """ Return true if any of our solar chargers expect a BMS to - be present. """ - return any((s.want_bms for s in self)) - - @property - def totalcapacity(self): - """ Total capacity if all chargers are running at full power. """ - return safeadd(*(c.currentlimit for c in self)) - - @property - def smoothed_current(self): - """ Total smoothed current, calculated by adding the smoothed current - of the individual chargers. """ - return safeadd(*(c.smoothed_current for c in self)) or 0 - - @property - def solar_current(self): - return safeadd(*(c.smoothed_current for c in self._solarchargers.values())) or 0 - - def maximize_charge_current(self): - """ Max out all chargers. """ - for charger in self: - charger.maximize_charge_current() - - def shutdown_chargers(self): - """ Shut down all chargers. """ - for charger in self: - charger.maxchargecurrent = 0 - - def set_networked(self, has_bms, bms_charge_voltage, charge_voltage, max_charge_current, feedback_allowed, stop_on_mcc0): - """ This is the main entry-point into the solar charger subsystem. This - sets all chargers to the same charge_voltage, and distributes - max_charge_current between the chargers. If feedback_allowed, then - we simply max out the chargers. We also don't bother with - distribution if there's only one charger in the system or if - it exceeds our total capacity. - """ - # Network mode: - # bit 0: Operated in network environment - # bit 2: Remote Hub-1 control (MPPT will accept charge voltage and max charge current) - # bit 3: Remote BMS control (MPPT enter BMS mode) - network_mode = 1 | (0 if charge_voltage is None and max_charge_current is None else 4) | (8 if has_bms else 0) - network_mode_written = False - for charger in self: - charger.networkmode = network_mode - network_mode_written = True - - # Distribute the voltage setpoint to all solar chargers. - # Non-solar chargers are controlled elsewhere. - voltage_written = 0 - if charge_voltage is not None: - voltage_written = int(len(self)>0) - for charger in self._solarchargers.values(): - charger.chargevoltage = charge_voltage - - # Distribute the original BMS voltage setpoint, if there is one, - # to the other chargers - if bms_charge_voltage is not None: - for charger in self._otherchargers.values(): - charger.chargevoltage = bms_charge_voltage - - # Do not limit max charge current when feedback is allowed. The - # rationale behind this is that MPPT charge power should match the - # capabilities of the battery. If the default charge algorithm is used - # by the MPPTs, the charge current should stay within limits. This - # avoids a problem that we do not know if extra MPPT power will be fed - # back to the grid when we decide to increase the MPPT max charge - # current. - # - # Additionally, don't bother with chargers that are disconnected. - chargers = [x for x in self._solarchargers.values() if x.active and x.maxchargecurrent is not None and x.n2k_device_instance in (0, None)] - if len(chargers) > 0: - if stop_on_mcc0 and max_charge_current == 0: - self.shutdown_chargers() - elif feedback_allowed: - self.maximize_charge_current() - elif max_charge_current is not None: - if len(chargers) == 1: - # The simple case: Only one charger. Simply assign the - # limit to the charger - sc = chargers[0] - cc = min(ceil(max_charge_current), sc.currentlimit) - sc.maxchargecurrent = cc - elif max_charge_current > self.totalcapacity * 0.95: - # Another simple case, we're asking for more than our - # combined capacity (with a 5% margin) - self.maximize_charge_current() - else: - # The hard case, we have more than one CC and we want - # less than our capacity. - self._distribute_current(chargers, max_charge_current) - - # Split remainder over other chargers, according to individual - # capacity. Only consider controllable devices. - if max_charge_current is not None: - remainder = max(0.0, max_charge_current - self.solar_current) - controllable = [c for c in self._otherchargers.values() if c.has_externalcontrol_support] - capacity = safeadd(*(c.currentlimit for c in controllable)) or 0 - if capacity > 0: - for c in controllable: - c.maxchargecurrent = remainder * c.currentlimit / capacity - - # Return flags of what we did - return voltage_written, int(network_mode_written and max_charge_current is not None), network_mode - - # The math for the below is as follows. Let c be the total capacity of the - # charger, l be the current limit, a the actual current it produces, k the - # total current limit for the two chargers, and m the margin (l - a) - # between the limit and what is produced. - # - # We want m/c to be the same for all our chargers. - # - # Expression 1: (l1-a1)/c1 == (l2-a2)/c2 - # Expression 2: l1 + l2 == k - # - # Solving that yields the expression below. - @staticmethod - def _balance_chargers(charger1, charger2, l1, l2): - c1, c2 = charger1.currentlimit, charger2.currentlimit - a1 = min(charger1.smoothed_current, c1) - a2 = min(charger2.smoothed_current, c2) - k = l1 + l2 - - try: - l1 = round((c2 * a1 - c1 * a2 + k * c1)/(c1 + c2), 1) - except ArithmeticError: - return l1, l2 # unchanged - else: - l1 = max(min(l1, c1), 0) - return l1, k - l1 - - @staticmethod - def _distribute_current(chargers, max_charge_current): - """ This is called if there are two or more solar chargers. It - distributes the charge current over all of them. """ - - # Take the difference between the values and spread it over all - # the chargers. The maxchargecurrents of the chargers should ideally - # always add up to the whole. - limits = [c.maxchargecurrent for c in chargers] - ceilings = [c.currentlimit for c in chargers] - - # We cannot have a max_charge_current higher than the sum of the - # ceilings. - max_charge_current = min(sum(ceilings), max_charge_current) - - - # Check how far we have to move our adjustment. If it doesn't have to - # move much (or at all), then just balance the charge limits. Our - # threshold for doing an additional distribution of charge is relative - # to the number of chargers, as it makes no sense to attempt a - # distribution if there is too little to be gained. The chosen value - # here is 100mA per charger. - delta = max_charge_current - sum(limits) - if abs(delta) > 0.1 * len(chargers): - limits = distribute(limits, ceilings, delta) - for charger, limit in zip(chargers, limits): - charger.maxchargecurrent = limit - else: - # Balance the limits so they have the same headroom at the top. - # Each charger is balanced against its neighbour, the one at the - # end is paired with the one at the start. - limits = [] - r = chargers[0].maxchargecurrent - for c1, c2 in zip(chargers, chargers[1:]): - l, r = ChargerSubsystem._balance_chargers(c1, c2, r, c2.maxchargecurrent) - limits.append(l) - l, limits[0] = ChargerSubsystem._balance_chargers(c2, chargers[0], r, limits[0]) - limits.append(l) - - for charger, limit in zip(chargers, limits): - charger.maxchargecurrent = limit - - def update_values(self): - # This is called periodically from a timer to update contained - # solar chargers with values that they track. - for charger in self: - try: - charger.update_values() - except AttributeError: - pass - -class BatteryOperationalLimits(object): - """ Only used to encapsulate this part of the Multi's functionality. - """ - def __init__(self, multi): - self._multi = multi - - def _property(path, self): - # Due to the use of partial, path and self is reversed. - return self._multi.monitor.get_value(self._multi.service, path) - - def _set_property(path, self, v): - # None of these values can be negative - if v is not None: - v = max(0, v) - self._multi.monitor.set_value_async(self._multi.service, path, v) - - chargevoltage = property( - partial(_property, '/BatteryOperationalLimits/MaxChargeVoltage'), - partial(_set_property, '/BatteryOperationalLimits/MaxChargeVoltage')) - maxchargecurrent = property( - partial(_property, '/BatteryOperationalLimits/MaxChargeCurrent'), - partial(_set_property, '/BatteryOperationalLimits/MaxChargeCurrent')) - maxdischargecurrent = property( - partial(_property, '/BatteryOperationalLimits/MaxDischargeCurrent'), - partial(_set_property, '/BatteryOperationalLimits/MaxDischargeCurrent')) - batterylowvoltage = property( - partial(_property, '/BatteryOperationalLimits/BatteryLowVoltage'), - partial(_set_property, '/BatteryOperationalLimits/BatteryLowVoltage')) - - -class Multi(object): - """ Encapsulates the multi. Makes access to dbus paths a bit neater by - exposing them as attributes. """ - def __init__(self, monitor, service): - self.monitor = monitor - self._service = service - self.bol = BatteryOperationalLimits(self) - self._dc_current = LowPassFilter((2 * pi)/30, 0) - self._v = object() - - @property - def service(self): - return getattr(MultiService.instance.vebus_service, 'service', None) - - @property - def active(self): - return self.service is not None - - @property - def ac_connected(self): - return self.monitor.get_value(self.service, '/Ac/ActiveIn/Connected') == 1 - - @property - def has_bolframe(self): - return self.monitor.get_value(self.service, '/FirmwareFeatures/BolFrame') == 1 - - @property - def has_ess_assistant(self): - # We do not analyse the content of /Devices/0/Assistants, because that - # would require us to keep a list of ESS assistant version numbers (see - # VebusSocWriter._hub2_assistant_ids). Because that list is expected to - # change (unlike the list of hub-2 assistants), we use - # /Hub4/AssistantId to check the presence. It is guaranteed that - # /Hub4/AssistantId will be published before /Devices/0/Assistants. - assistants = self.monitor.get_value(self.service, '/Devices/0/Assistants') - return assistants is not None and \ - self.monitor.get_value(self.service, '/Hub4/AssistantId') == 5 - - @property - def dc_current(self): - """ Return a low-pass smoothed current. """ - return self._dc_current.value - - @property - def hub_voltage(self): - return self.monitor.get_value(self.service, '/Hub/ChargeVoltage') - - @property - def maxchargecurrent(self): - return self.monitor.get_value(self.service, '/Dc/0/MaxChargeCurrent') - - @maxchargecurrent.setter - def maxchargecurrent(self, v): - # If the Multi is not ready, don't write to it just yet - if self.active and self.maxchargecurrent is not None and v != self._v: - # The maximum present charge current is 6-parallel 12V 5kva units, 6*220 = 1320A. - # We will consider 10000A to be impossibly high. - self.monitor.set_value_async(self.service, '/Dc/0/MaxChargeCurrent', 10000 if v is None else v) - self._v = v - - @property - def state(self): - return self.monitor.get_value(self.service, '/State') - - @property - def feedin_enabled(self): - return self.monitor.get_value(self.service, - '/Hub4/L1/DoNotFeedInOvervoltage') == 0 - - @property - def firmwareversion(self): - return self.monitor.get_value(self.service, '/FirmwareVersion') - - @property - def allow_to_charge(self): - return self.monitor.get_value(self.service, '/Bms/AllowToCharge') != 0 - - @property - def has_vebus_bms(self): - """ This checks that we have a VE.Bus BMS. """ - return self.monitor.get_value(self.service, '/Bms/BmsType') == 2 - - @property - def has_vebus_bmsv2(self): - """ Checks that we have v2 of the VE.Bus BMS, but also that we can - properly use it, that is we also have an mk3. """ - version = self.monitor.get_value(self.service, '/Devices/Bms/Version') - atc = self.monitor.get_value(self.service, '/Bms/AllowToCharge') - - # If AllowToCharge is defined, but we have no version, then the Multi - # is off, but we still have a v2 BMS. V1 goes invalid if the multi - # is off. Yes, this is kludgy, but it is less kludgy than the - # fix the other end would require. - if self.has_vebus_bms and atc is not None and version is None: - return True - - # Otherwise, if the Multi is on, check the version to see if we should - # enable v2 functionality. - return (version or 0) >= 1146100 and \ - self.monitor.get_value(self.service, '/Interfaces/Mk2/ProductName') == 'MK3' - - def update_values(self, limit): - c = self.monitor.get_value(self.service, '/Dc/0/Current', 0) - if c is not None: - # Cap the filter at a limit. If we don't do this, dc currents - # in excess of our capacity causes a kind of wind-up that delays - # backing-off when the load drops suddenly. - if limit is not None: - c = max(c, -limit) - self._dc_current.update(c) - -class Dvcc(SystemCalcDelegate): - """ This is the main DVCC delegate object. """ - def __init__(self, sc): - super(Dvcc, self).__init__() - self.systemcalc = sc - self._chargesystem = None - self._vecan_services = [] - self._timer = None - self._tickcount = ADJUST - self._dcsyscurrent = LowPassFilter((2 * pi)/20, 0.0) - self._internal_mcp = ExpiringValue(3, None) # Max charging power - - def get_input(self): - return [ - ('com.victronenergy.vebus', [ - '/Ac/ActiveIn/Connected', - '/Hub/ChargeVoltage', - '/Dc/0/Current', - '/Dc/0/MaxChargeCurrent', - '/State', - '/BatteryOperationalLimits/BatteryLowVoltage', - '/BatteryOperationalLimits/MaxChargeCurrent', - '/BatteryOperationalLimits/MaxChargeVoltage', - '/BatteryOperationalLimits/MaxDischargeCurrent', - '/Bms/AllowToCharge', - '/Bms/BmsType', - '/Devices/Bms/Version', - '/FirmwareFeatures/BolFrame', - '/Hub4/L1/DoNotFeedInOvervoltage', - '/FirmwareVersion', - '/Interfaces/Mk2/ProductName']), - ('com.victronenergy.solarcharger', [ - '/ProductId', - '/Dc/0/Current', - '/Link/NetworkMode', - '/Link/ChargeVoltage', - '/Link/ChargeCurrent', - '/Settings/ChargeCurrentLimit', - '/State', - '/FirmwareVersion', - '/N2kDeviceInstance', - '/Mgmt/Connection', - '/Settings/BmsPresent']), - ('com.victronenergy.alternator', [ - '/ProductId', - '/Dc/0/Voltage', - '/Dc/0/Current', - '/Link/NetworkMode', - '/Link/ChargeVoltage', - '/Link/ChargeCurrent', - '/Settings/ChargeCurrentLimit', - '/State', - '/FirmwareVersion', - '/N2kDeviceInstance', - '/Mgmt/Connection', - '/Settings/BmsPresent']), - ('com.victronenergy.inverter', [ - '/ProductId', - '/Dc/0/Current', - '/IsInverterCharger', - '/Link/NetworkMode', - '/Link/ChargeVoltage', - '/Link/ChargeCurrent', - '/Link/DischargeCurrent', - '/Settings/ChargeCurrentLimit', - '/State', - '/N2kDeviceInstance', - '/Mgmt/Connection', - '/Settings/BmsPresent']), - ('com.victronenergy.multi', [ - '/ProductId', - '/Dc/0/Current', - '/IsInverterCharger', - '/Link/ChargeCurrent', - '/Link/DischargeCurrent', - '/Settings/ChargeCurrentLimit', - '/State', - '/N2kDeviceInstance', - '/Mgmt/Connection', - '/Settings/BmsPresent']), - ('com.victronenergy.vecan', [ - '/Link/ChargeVoltage', - '/Link/NetworkMode']), - ('com.victronenergy.settings', [ - '/Settings/CGwacs/OvervoltageFeedIn', - '/Settings/Services/Bol'])] - - def get_settings(self): - return [ - ('maxchargecurrent', '/Settings/SystemSetup/MaxChargeCurrent', -1, -1, 10000), - ('maxchargevoltage', '/Settings/SystemSetup/MaxChargeVoltage', 0.0, 0.0, 80.0), - ('bol', '/Settings/Services/Bol', 0, 0, 7) - ] - - def set_sources(self, dbusmonitor, settings, dbusservice): - SystemCalcDelegate.set_sources(self, dbusmonitor, settings, dbusservice) - self._chargesystem = ChargerSubsystem(dbusmonitor) - self._inverters = InverterSubsystem(dbusmonitor) - self._multi = Multi(dbusmonitor, dbusservice) - - self._dbusservice.add_path('/Control/SolarChargeVoltage', value=0) - self._dbusservice.add_path('/Control/SolarChargeCurrent', value=0) - self._dbusservice.add_path('/Control/EffectiveChargeVoltage', value=None) - self._dbusservice.add_path('/Control/BmsParameters', value=0) - self._dbusservice.add_path('/Control/MaxChargeCurrent', value=0) - self._dbusservice.add_path('/Control/Dvcc', value=self.has_dvcc) - self._dbusservice.add_path('/Debug/BatteryOperationalLimits/SolarVoltageOffset', value=0, writeable=True) - self._dbusservice.add_path('/Debug/BatteryOperationalLimits/VebusVoltageOffset', value=0, writeable=True) - self._dbusservice.add_path('/Debug/BatteryOperationalLimits/CurrentOffset', value=0, writeable=True) - self._dbusservice.add_path('/Dvcc/Alarms/FirmwareInsufficient', value=0) - self._dbusservice.add_path('/Dvcc/Alarms/MultipleBatteries', value=0) - - def device_added(self, service, instance, do_service_change=True): - service_type = service.split('.')[2] - if service_type == 'solarcharger': - self._chargesystem.add_solar_charger(service) - elif service_type in ('inverter', 'multi'): - if self._dbusmonitor.get_value(service, '/IsInverterCharger') == 1: - # Add to both the solarcharger and inverter collections. - # add_invertercharger returns an object that can be directly - # added to the inverter collection. - self._inverters._add_inverter( - self._chargesystem.add_invertercharger(service)) - elif service_type == 'vecan': - self._vecan_services.append(service) - elif service_type == 'alternator': - self._chargesystem.add_alternator(service) - elif service_type == 'battery': - pass # install timer below - else: - # Skip timer code below - return - - if self._timer is None: - self._timer = GLib.timeout_add(1000, exit_on_error, self._on_timer) - - def device_removed(self, service, instance): - if service in self._chargesystem: - self._chargesystem.remove_charger(service) - # Some solar chargers are inside an inverter - if service in self._inverters: - self._inverters.remove_inverter(service) - elif service in self._vecan_services: - self._vecan_services.remove(service) - elif service in self._inverters: - self._inverters.remove_inverter(service) - if len(self._chargesystem) == 0 and len(self._vecan_services) == 0 and \ - len(BatteryService.instance.batteries) == 0 and self._timer is not None: - GLib.source_remove(self._timer) - self._timer = None - - def _property(path, self): - # Due to the use of partial, path and self is reversed. - try: - return float(self._dbusservice[path]) - except ValueError: - return None - - solarvoltageoffset = property(partial(_property, '/Debug/BatteryOperationalLimits/SolarVoltageOffset')) - invertervoltageoffset = property(partial(_property, '/Debug/BatteryOperationalLimits/VebusVoltageOffset')) - currentoffset = property(partial(_property, '/Debug/BatteryOperationalLimits/CurrentOffset')) - - @property - def internal_maxchargepower(self): - return self._internal_mcp.get() - - @internal_maxchargepower.setter - def internal_maxchargepower(self, v): - self._internal_mcp.set(v) - - @property - def dcsyscurrent(self): - """ Return non-zero DC system current, if it is based on - a real measurement. If an estimate/calculation, we cannot use it. - """ - if self._dbusservice['/Dc/System/MeasurementType'] == 1: - try: - v = self._dbusservice['/Dc/Battery/Voltage'] - return self._dcsyscurrent.update( - float(self._dbusservice['/Dc/System/Power'])/v) - except (TypeError, ZeroDivisionError): - pass - return 0.0 - - @property - def has_ess_assistant(self): - return self._multi.active and self._multi.has_ess_assistant - - @property - def has_dvcc(self): - # 0b00 = Off - # 0b01 = On - # 0b10 = Forced off - # 0b11 = Forced on - v = self._settings['bol'] - return bool(v & 1) - - @property - def bms(self): - return BatteryService.instance.bms - - @property - def bms_seen(self): - return self._chargesystem.want_bms - - def _on_timer(self): - def update_solarcharger_control_flags(voltage_written, current_written, chargevoltage): - self._dbusservice['/Control/SolarChargeVoltage'] = voltage_written - self._dbusservice['/Control/SolarChargeCurrent'] = current_written - self._dbusservice['/Control/EffectiveChargeVoltage'] = chargevoltage - - bol_support = self.has_dvcc - - self._tickcount -= 1; self._tickcount %= ADJUST - - if not bol_support: - if self._tickcount > 0: return True - - voltage_written, current_written = self._legacy_update_solarchargers() - update_solarcharger_control_flags(voltage_written, current_written, None) # Not tracking for non-DVCC case - self._dbusservice['/Control/BmsParameters'] = 0 - self._dbusservice['/Control/MaxChargeCurrent'] = 0 - self._dbusservice['/Control/Dvcc'] = 0 - self._dbusservice['/Dvcc/Alarms/FirmwareInsufficient'] = 0 - self._dbusservice['/Dvcc/Alarms/MultipleBatteries'] = 0 - return True - - - # BOL/DVCC support below - self._dbusservice['/Dvcc/Alarms/FirmwareInsufficient'] = int( - not self._chargesystem.has_externalcontrol_support or ( - self._multi.firmwareversion is not None and self._multi.firmwareversion < VEBUS_FIRMWARE_REQUIRED)) - self._dbusservice['/Dvcc/Alarms/MultipleBatteries'] = int( - len(BatteryService.instance.bmses) > 1) - - # Update subsystems - self._chargesystem.update_values() - self._multi.update_values(self._chargesystem.totalcapacity) - - # Below are things we only do every ADJUST seconds - if self._tickcount > 0: return True - - # Signal Dvcc support to other processes - self._dbusservice['/Control/Dvcc'] = 1 - - # Check that we have not lost the BMS, if we ever had one. If the BMS - # is lost, stop passing information to the solar chargers so that they - # might time out. - bms_service = self.bms - if self.bms_seen and bms_service is None and not self._multi.has_vebus_bmsv2: - # BMS is lost - update_solarcharger_control_flags(0, 0, None) - return True - - # Get the user current limit, if set - user_max_charge_current = self._settings['maxchargecurrent'] - if user_max_charge_current < 0: user_max_charge_current = None - - # If there is a BMS, get the charge voltage and current from it - max_charge_current = None - charge_voltage = None - feedback_allowed = self.feedback_allowed - stop_on_mcc0 = False - has_bms = bms_service is not None - if has_bms: - charge_voltage, max_charge_current, feedback_allowed, stop_on_mcc0 = \ - self._adjust_battery_operational_limits(bms_service, feedback_allowed) - - # Check /Bms/AllowToCharge on the VE.Bus service, and set - # max_charge_current to zero if charging is not allowed. Skip this if - # ESS is involved, then the Multi controls this through the charge - # voltage. If it is BMS v2, then also set BMS bit so that solarchargers - # go into #67 if we lose it. - if self._multi.has_vebus_bms: - stop_on_mcc0 = True - has_bms = has_bms or self._multi.has_vebus_bmsv2 - max_charge_current = 10000 if self._multi.allow_to_charge else 0 - - # Take the lesser of the BMS and user current limits, wherever they exist - maximae = [x for x in (user_max_charge_current, max_charge_current) if x is not None] - max_charge_current = min(maximae) if maximae else None - - # Override the battery charge voltage by taking the lesser of the - # voltage limits. Only override if the battery supplies one, to prevent - # a voltage being sent to a Multi in a system without a managed battery. - # Otherwise the Multi will go into passthru if the user disables this. - if charge_voltage is not None: - user_charge_voltage = self._settings['maxchargevoltage'] - if user_charge_voltage > 0: - charge_voltage = min(charge_voltage, user_charge_voltage) - - # @todo EV What if ESS + OvervoltageFeedIn? In that case there is no - # charge current control on the MPPTs, but we'll still indicate that - # the control is active here. Should we? - self._dbusservice['/Control/MaxChargeCurrent'] = \ - not self._multi.active or self._multi.has_bolframe - - # If there is a measured DC system, the Multi and solarchargers - # should add extra current for that. Round this to nearest 100mA. - if max_charge_current is not None and max_charge_current > 0 and not stop_on_mcc0: - max_charge_current = round(max_charge_current + self.dcsyscurrent, 1) - - # We need to keep a copy of the original value for later. We will be - # modifying one of them to compensate for vebus current. - _max_charge_current = max_charge_current - - # If we have vebus current, we have to compensate for it. But if we must - # stop on MCC=0, then only if the max charge current is above zero. - # Otherwise leave it unmodified so that the solarchargers are also - # stopped. - vebus_dc_current = self._multi.dc_current - if _max_charge_current is not None and vebus_dc_current is not None and \ - (not stop_on_mcc0 or _max_charge_current > 0) and vebus_dc_current < 0: - _max_charge_current = ceil(_max_charge_current - vebus_dc_current) - - # Try to push the solar chargers to the vebus-compensated value - voltage_written, current_written, effective_charge_voltage = \ - self._update_solarchargers_and_vecan(has_bms, charge_voltage, - _max_charge_current, feedback_allowed, stop_on_mcc0) - update_solarcharger_control_flags(voltage_written, current_written, effective_charge_voltage) - - # The Multi gets the remainder after subtracting what the solar - # chargers made. If there is a maximum charge power from another - # delegate (dynamicess), apply that here. - if max_charge_current is not None: - max_charge_current = max(0.0, round(max_charge_current - self._chargesystem.smoothed_current)) - - try: - internal_mcc = self.internal_maxchargepower / self._dbusservice['/Dc/Battery/Voltage'] - except (TypeError, ZeroDivisionError, ValueError): - pass - else: - try: - max_charge_current = min(x for x in (ceil(internal_mcc), max_charge_current) if x is not None) - except ValueError: - pass - - # Write the remainder to the Multi. - # There are two ways to limit the charge current of a VE.Bus system. If we have a BMS, - # the BOL parameter is used. - # If not, then the BOL parameters are not available, and the /Dc/0/MaxChargeCurrent path is - # used instead. This path relates to the MaxChargeCurrent setting as also available in - # VEConfigure, except that writing to it only changes the value in RAM in the Multi. - # Unlike VEConfigure it's not necessary to take the number of units in a system into account. - # - # Venus OS v2.30 fixes in mk2-dbus related to /Dc/0/MaxChargeCurrent: - # 1) Fix charge current too high in systems with multiple units per phase. mk2-bus was dividing - # the received current only by the number of phases in the system instead of dividing by the - # number of units in the system. - # 2) Fix setted charge current still active after disabling the "Limit charge current" setting. - # It used to be necessary to set a high current; and only then disable the setting or reset - # the VE.Bus system to re-initialise from the stored setting as per VEConfigure. - bms_parameters_written = 0 - if bms_service is None: - if max_charge_current is None: - self._multi.maxchargecurrent = None - else: - # Don't bother setting a charge current at 1A or less - self._multi.maxchargecurrent = max_charge_current if max_charge_current > 1 else 0 - else: - bms_parameters_written = self._update_battery_operational_limits(bms_service, charge_voltage, max_charge_current) - self._dbusservice['/Control/BmsParameters'] = int(bms_parameters_written or (bms_service is not None and voltage_written)) - - return True - - def _adjust_battery_operational_limits(self, bms_service, feedback_allowed): - """ Take the charge voltage and maximum charge current from the BMS - and adjust it as necessary. For now we only implement quirks - for batteries known to have them. - """ - cv = bms_service.chargevoltage - mcc = bms_service.maxchargecurrent - - quirk = QUIRKS.get(bms_service.product_id) - stop_on_mcc0 = False - if quirk is not None: - # If any quirks are registered for this battery, use that - # instead. - cv, mcc, feedback_allowed, stop_on_mcc0 = quirk(self, bms_service, cv, mcc, feedback_allowed) - - # Add debug offsets - if cv is not None: - cv = safeadd(cv, self.invertervoltageoffset) - if mcc is not None: - mcc = safeadd(mcc, self.currentoffset) - return cv, mcc, feedback_allowed, stop_on_mcc0 - - def _update_battery_operational_limits(self, bms_service, cv, mcc): - """ This function writes the bms parameters across to the Multi - if it exists. Also communicate DCL=0 to inverters. """ - written = 0 - if self._multi.active: - if cv is not None: - self._multi.bol.chargevoltage = cv - - if mcc is not None: - self._multi.bol.maxchargecurrent = mcc - # Also set the maxchargecurrent, to ensure this is not stuck - # at some lower value that overrides the intent here. - try: - self._multi.maxchargecurrent = max(self._multi.maxchargecurrent, mcc) - except TypeError: - pass - - # Copy the rest unmodified - self._multi.bol.maxdischargecurrent = bms_service.maxdischargecurrent - self._multi.bol.batterylowvoltage = bms_service.batterylowvoltage - written = 1 - - # Also control inverters if BMS stops discharge - if len(self._inverters): - self._inverters.set_maxdischargecurrent(bms_service.maxdischargecurrent) - written = 1 - - return written - - @property - def feedback_allowed(self): - # Feedback allowed is defined as 'ESS present and FeedInOvervoltage is - # enabled'. This ignores other setups which allow feedback: hub-1. - return self.has_ess_assistant and self._multi.ac_connected and \ - self._dbusmonitor.get_value('com.victronenergy.settings', - '/Settings/CGwacs/OvervoltageFeedIn') == 1 - - def _update_solarchargers_and_vecan(self, has_bms, bms_charge_voltage, max_charge_current, feedback_allowed, stop_on_mcc0): - """ This function updates the solar chargers only. Parameters - related to the Multi are handled elsewhere. """ - - # If the vebus service does not provide a charge voltage setpoint (so - # no ESS/Hub-1/Hub-4), we use the max charge voltage provided by the - # BMS (if any). This will probably prevent feedback, but that is - # probably not allowed anyway. - charge_voltage = None - if self._multi.active: - charge_voltage = self._multi.hub_voltage - if charge_voltage is None and bms_charge_voltage is not None: - charge_voltage = bms_charge_voltage - if charge_voltage is not None: - try: - charge_voltage += self.solarvoltageoffset - except (ValueError, TypeError): - pass - - if charge_voltage is None and max_charge_current is None: - return 0, 0, None - - voltage_written, current_written, network_mode = self._chargesystem.set_networked( - has_bms, bms_charge_voltage, charge_voltage, - max_charge_current, feedback_allowed, stop_on_mcc0) - - # Write the voltage to VE.Can. Also update the networkmode. - if charge_voltage is not None: - for service in self._vecan_services: - try: - # In case there is no path at all, the set_value below will - # raise an DBusException which we will ignore cheerfully. If we - # cannot set the NetworkMode there is no point in setting the - # ChargeVoltage. - self._dbusmonitor.set_value_async(service, '/Link/NetworkMode', network_mode) - self._dbusmonitor.set_value_async(service, '/Link/ChargeVoltage', charge_voltage) - voltage_written = 1 - except DBusException: - pass - - return voltage_written, current_written, charge_voltage - - def _legacy_update_solarchargers(self): - """ This is the old implementation we used before DVCC. It is kept - here so we can fall back to it where DVCC is not fully supported, - and to avoid maintaining two copies of systemcalc. """ - - max_charge_current = None - for battery in BatteryService.instance.batteries: - max_charge_current = safeadd(max_charge_current, battery.maxchargecurrent) - - # Workaround: copying the max charge current from BMS batteries to the solarcharger leads to problems: - # excess PV power is not fed back to the grid any more, and loads on AC-out are not fed with PV power. - # PV power is used for charging the batteries only. - # So we removed this feature, until we have a complete solution for solar charger support. Until then - # we set a 'high' max charge current to avoid 'BMS connection lost' alarms from the solarcharger. - if max_charge_current is not None: - max_charge_current = 1000 - - vebus_path = self._multi.service if self._multi.active else None - charge_voltage = None if vebus_path is None else \ - self._dbusmonitor.get_value(vebus_path, '/Hub/ChargeVoltage') - - if charge_voltage is None and max_charge_current is None: - return (0, 0) - - # Network mode: - # bit 0: Operated in network environment - # bit 2: Remote Hub-1 control - # bit 3: Remote BMS control - network_mode = 1 | (0 if charge_voltage is None else 4) | (0 if max_charge_current is None else 8) - voltage_written = 0 - current_written = 0 - for charger in self._chargesystem: - try: - # We use /Link/NetworkMode to detect Hub support in the solarcharger. Existence of this item - # implies existence of the other /Link/* fields. - if charger.networkmode is None: - continue - charger.networkmode = network_mode - - if charge_voltage is not None: - charger.chargevoltage = charge_voltage - voltage_written = 1 - - if max_charge_current is not None: - charger.maxchargecurrent = max_charge_current - current_written = 1 - except DBusException: - # If the charger for whatever reason doesn't have the /Link - # path, ignore it. This is the legacy implementation and - # better to keep it for the moment. - pass - - # The below is different to the non-legacy case above, where the voltage - # the com.victronenergy.vecan.* service instead. - if charge_voltage is not None and self._chargesystem.has_vecan_chargers: - # Charge voltage cannot by written directly to the CAN-bus solar chargers, we have to use - # the com.victronenergy.vecan.* service instead. - # Writing charge current to CAN-bus solar charger is not supported yet. - for service in self._vecan_services: - try: - # Note: we don't check the value of charge_voltage_item because it may be invalid, - # for example if the D-Bus path has not been written for more than 60 (?) seconds. - # In case there is no path at all, the set_value below will raise an DBusException - # which we will ignore cheerfully. - self._dbusmonitor.set_value_async(service, '/Link/ChargeVoltage', charge_voltage) - voltage_written = 1 - except DBusException: - pass - - return (voltage_written, current_written) diff --git a/NodeRed/update_Cerbo.py b/NodeRed/update_Cerbo.py new file mode 100644 index 000000000..ffd56bf94 --- /dev/null +++ b/NodeRed/update_Cerbo.py @@ -0,0 +1,226 @@ +import subprocess +import sys +import asyncio +import os + +async def run_remote_command(remote_host, command): + ssh_command = ['ssh', f'root@{remote_host}', command] + process = await asyncio.create_subprocess_exec( + *ssh_command, + stdout=asyncio.subprocess.PIPE, + stderr=asyncio.subprocess.PIPE + ) + stdout, stderr = await process.communicate() + + stdout_decoded = stdout.decode() + stderr_decoded = stderr.decode() + + if process.returncode == 0: + return stdout_decoded + stderr_decoded + else: + return f"Failed to run the command: {command}, error: {stderr_decoded}" + +async def check_GX_type(remote_host): + command = "cat /etc/venus/machine" + return await run_remote_command(remote_host, command) + +async def resize(remote_host): + command = "sh /opt/victronenergy/swupdate-scripts/resize2fs.sh" + return await run_remote_command(remote_host, command) + +async def update_venus_firmware(remote_host): + # command = "sh /opt/victronenergy/swupdate-scripts/check-updates.sh -swu https://updates.victronenergy.com/feeds/venus/release/images/beaglebone/venus-swu-2-large-beaglebone-20240422090512-v3.31.swu" + command = "sh /opt/victronenergy/swupdate-scripts/check-updates.sh -swu http://updates.victronenergy.com/feeds/venus/release/images/beaglebone/venus-swu-2-beaglebone-20240422090512-v3.31.swu" + return await run_remote_command(remote_host, command) + +async def update_cerbo_firmware(remote_host): + # command = "sh /opt/victronenergy/swupdate-scripts/check-updates.sh -swu http://updates.victronenergy.com/feeds/venus/release/images/einstein/venus-swu-large-einstein-20240422090512-v3.31.swu" + command = "sh /opt/victronenergy/swupdate-scripts/check-updates.sh -swu http://updates.victronenergy.com/feeds/venus/release/images/einstein/venus-swu-einstein-20240422090512-v3.31.swu" + return await run_remote_command(remote_host, command) + +async def set_official_update_feed(remote_host): + command = "dbus -y com.victronenergy.settings /Settings/System/ReleaseType SetValue %0" + return await run_remote_command(remote_host, command) + +async def enable_large_image(remote_host): + command = "dbus -y com.victronenergy.settings /Settings/System/ImageType SetValue %1" + return await run_remote_command(remote_host, command) + +async def check_large_image_or_not(remote_host): + command = "dbus -y com.victronenergy.settings /Settings/System/ImageType GetValue" + return await run_remote_command(remote_host, command) + +async def update_firmware(remote_host): + command = "sh /opt/victronenergy/swupdate-scripts/check-updates.sh -update" + return await run_remote_command(remote_host, command) + +async def enable_NodeRed(remote_host): + command = "dbus -y com.victronenergy.platform /Services/NodeRed/Mode SetValue %1" + return await run_remote_command(remote_host, command) + +async def disable_NodeRed(remote_host): + command = "dbus -y com.victronenergy.platform /Services/NodeRed/Mode SetValue %0" + return await run_remote_command(remote_host, command) + +async def check_NodeRed_enabled_or_not(remote_host): + command = "dbus -y com.victronenergy.platform /Services/NodeRed/Mode GetValue" + return await run_remote_command(remote_host, command) + +async def download_node_red_dashboard(remote_host): + change_dir_command = "cd /data/home/nodered/.node-red" + install_command = "npm install --no-audit --no-update-notifier --no-fund --save --save-prefix=~ --production --engine-strict node-red-dashboard@latest" + command = f"{change_dir_command} && {install_command}" + return await run_remote_command(remote_host, command) + +async def disable_BMS_Controlling_MPPT(remote_host): + command = "dbus -y com.victronenergy.solarcharger /Settings/BmsPresent SetValue %0" + return await run_remote_command(remote_host, command) + +async def check_mkVersion(remote_host): + command = "dbus -y com.victronenergy.vebus.ttyS4 /Interfaces/Mk2/Version GetValue" + return await run_remote_command(remote_host, command) + +async def check_allow_mkVersion_update_or_not(remote_host): + command = "dbus -y com.victronenergy.settings /Settings/Vebus/AllowMk3Fw212Update GetValue" + return await run_remote_command(remote_host, command) + +async def update_mkVersion(remote_host): + command = "dbus -y com.victronenergy.settings /Settings/Vebus/AllowMk3Fw212Update SetValue %1" + return await run_remote_command(remote_host, command) + +async def import_pika(remote_host): + change_dir_command = "cd /data/innovenergy/pika-0.13.1/" + install_command = "python3 setup.py install --user" + command = f"{change_dir_command} && {install_command}" + return await run_remote_command(remote_host, command) + +async def reboot(remote_host): + command = "reboot" + return await run_remote_command(remote_host, command) + +async def upload_files(remote_host,which_file): + if which_file == 1: + file_location_mappings = { + "rc.local": "/data/", + "dbus-fzsonick-48tl": "/data/", + "service": "/data/innovenergy/openvpn/", + "openvpn": "/data/innovenergy/openvpn/", + "pika-0.13.1": "/data/innovenergy/" + } + else: + file_location_mappings = { + "flows.json": "/data/home/nodered/.node-red/", + "settings-user.js": "/data/home/nodered/.node-red/", + } + + node_red_files_folder = os.path.join(os.getcwd(), "NodeRedFiles") + if not os.path.exists(node_red_files_folder): + return "NodeRedFiles folder does not exist." + + try: + tasks = [] + for file_name, remote_location in file_location_mappings.items(): + file_path = os.path.join(node_red_files_folder, file_name) + if not os.path.exists(file_path): + raise FileNotFoundError(f"File {file_name} not found in {node_red_files_folder}.") + + command = [ + "rsync", + "-r", + file_path, + f"root@{remote_host}:{remote_location}" + ] + + tasks.append(command) + + # Execute rsync commands asynchronously + for task in tasks: + subprocess.run(task, check=True) + + return "All files uploaded successfully." + + except FileNotFoundError as e: + return str(e) + + except subprocess.CalledProcessError as e: + return f"Error occurred while uploading files: {e}" + + except Exception as e: + return f"An error occurred while uploading files: {str(e)}" + +async def main(remote_host): + # #### 1. upload VPN and battery files ##### + # print("Upload VPN and battery files!") + # if(await upload_files(remote_host,1)!="All files uploaded successfully."): + # sys.exit("Failed to upload files!") + # else: + # print(await upload_files(remote_host,1)) + + # ##### 2. update firmware with normal image ##### + # gx_type = await check_GX_type(remote_host) + # if gx_type == "beaglebone\n": + # print("Update Venus GX firmware now!") + # print(await update_venus_firmware(remote_host)) + # elif gx_type == "einstein\n": + # print("Update Cerbo GX firmware now!") + # print(await update_cerbo_firmware(remote_host)) + # else: + # sys.exit("It's neither Venus GX nor Cerbo GX!") + + # ##### Need to rerun the script to continue after rebooting due to firmware update #### + # #### 3. udpate to MK3 ##### + # if (await check_mkVersion(remote_host) == "value = 1170212\n" and await check_allow_mkVersion_update_or_not(remote_host) == "0\n"): + # print("Update MK3!") + # print(await update_mkVersion(remote_host)) + # else: + # print("No need to update to MK3!") + + # #### 4. import pika #### + # print("Import pika!") + # print(await import_pika(remote_host)) + + # ##### 5. update firmware with large image ##### + # print("Set update feed to official release now!") + # print(await set_official_update_feed(remote_host)) + # print("Enable large image now!") + # print(await enable_large_image(remote_host)) + # image_type = await check_large_image_or_not(remote_host) + # if image_type == "1\n": + # print("Update firmware with large image!") + # print(await update_firmware(remote_host)) + # else: + # sys.exit("Failed to enable large image!") + + ##### Need to rerun the script to continue after rebooting due to firmware update #### + #### 6. resize /dev/root ##### + print("Resize /dev/root now!") + print(await resize(remote_host)) + + #### 7. enable Node Red ##### + print("Enable Node Red now!") + print(await enable_NodeRed(remote_host)) + if(await check_NodeRed_enabled_or_not(remote_host) == "value = 1\n"): + ##### 8. download Node Red Dashboard ##### + print("Download Node Red Dashboard now!") + print(await download_node_red_dashboard(remote_host)) + else: + sys.exit("Failed to enable Node Red!") + + ##### 9. upload files related to Node Red ##### + print("Upload files related to Node Red now!") + if(await upload_files(remote_host,2)!="All files uploaded successfully."): + sys.exit("Failed to upload files!") + + #### 10. restart Node Red to load and deploy flows ##### + print("Disable Node Red!") + if(await disable_NodeRed(remote_host) == "retval = 0\n"): + print("Re-enable Node Red!") + print(await enable_NodeRed(remote_host)) + if(await check_NodeRed_enabled_or_not(remote_host) == "value = 1\n"): + print("Node Red is set now!") + else: + sys.exit("Failed to re-enable Node Red!") + +if __name__ == "__main__": + remote_host = sys.argv[1] + asyncio.run(main(remote_host)) From ad02629ed959cdcf44624b04a4e398d03025c32e Mon Sep 17 00:00:00 2001 From: atef Date: Wed, 5 Jun 2024 16:16:29 +0200 Subject: [PATCH 20/25] Update SchneiderMeterDriver.cs for test purpose --- .../SchneiderMeterDriver.cs | 39 ++++++++++++++----- 1 file changed, 30 insertions(+), 9 deletions(-) diff --git a/csharp/App/SchneiderMeterDriver/SchneiderMeterDriver.cs b/csharp/App/SchneiderMeterDriver/SchneiderMeterDriver.cs index 7a9205037..65c344460 100644 --- a/csharp/App/SchneiderMeterDriver/SchneiderMeterDriver.cs +++ b/csharp/App/SchneiderMeterDriver/SchneiderMeterDriver.cs @@ -3,6 +3,7 @@ using InnovEnergy.Lib.Devices.IEM3kGridMeter; using InnovEnergy.Lib.Protocols.DBus; using InnovEnergy.Lib.Protocols.Modbus.Clients; using InnovEnergy.Lib.Utils; +using InnovEnergy.Lib.Utils.Reflection; using InnovEnergy.Lib.Victron.VeDBus; namespace InnovEnergy.App.SchneiderDriver; @@ -20,32 +21,52 @@ public static class SchneiderMeterDriver // var auth = AuthenticationMethod.ExternalAsRoot(); // dbusAddress = new Bus(ep, auth); - var schnieder = new Iem3KGridMeterDevice(hostName, port, Config.ModbusNodeId); - - - var schniederStatus = Observable + var schneider = new Iem3KGridMeterDevice(hostName, port, Config.ModbusNodeId); + + + var schneiderStatus = Observable .Interval(Config.UpdatePeriod) - .Select(_ => schnieder.Read()) + .Select(_ => schneider.Read()) .Publish(); - var poller = schniederStatus.Connect(); + var x = schneider.Read(); + + x?.ActivePowerL1.WriteLine(); + x?.ActivePowerL2.WriteLine(); + x?.ActivePowerL3.WriteLine(); + + + var poller = schneiderStatus.Connect(); var properties = Config.DefaultProperties; + + foreach (var p in properties) + { + p.WriteLine(" Signal"); + } + + // Step 1: Access Config.Signals + var signalsCollection = Config.Signals; + foreach (var s in signalsCollection) + { + s.WriteLine(" Signal"); + } + var signals = Config .Signals - .Select(signal => schniederStatus.Select(signal.ToVeProperty)) + .Select(signal => schneiderStatus.Select(signal.ToVeProperty)) .Merge() .Do(p => properties.Set(p)); // TODO: remove when possible // Apparently some VE services need to be periodically reminded that // this service is /Connected - schniederStatus.Subscribe(_ => properties.Set("/Connected", 1)); + schneiderStatus.Subscribe(_ => properties.Set("/Connected", 1)); // Wait until status is read once to make sure all // properties are set when we go onto the bus. - var dbus = schniederStatus + var dbus = schneiderStatus .Skip(1) .Take(1) .SelectMany(_ => PublishPropertiesOnDBus(properties, dbusAddress)); From c725ebc4bffe40242d4b8efc8ce3fc62fc5d72e6 Mon Sep 17 00:00:00 2001 From: atef Date: Wed, 5 Jun 2024 16:17:05 +0200 Subject: [PATCH 21/25] Update debug --- csharp/App/SchneiderMeterDriver/debug.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/csharp/App/SchneiderMeterDriver/debug.sh b/csharp/App/SchneiderMeterDriver/debug.sh index c138cfdb8..e68489b70 100755 --- a/csharp/App/SchneiderMeterDriver/debug.sh +++ b/csharp/App/SchneiderMeterDriver/debug.sh @@ -9,7 +9,7 @@ netVersion="net6.0" platform="linux-arm" config="Release" host="root@$remote" -dir="/opt/victronenergy/$exe" +dir="/opt/innovenergy/$exe" set -e From 69cfa2e7d791f544b160ef33dd2c63636692a622 Mon Sep 17 00:00:00 2001 From: atef Date: Wed, 5 Jun 2024 16:17:21 +0200 Subject: [PATCH 22/25] Update config file --- csharp/App/SchneiderMeterDriver/Config.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/csharp/App/SchneiderMeterDriver/Config.cs b/csharp/App/SchneiderMeterDriver/Config.cs index c7dd3ccde..eee15b286 100644 --- a/csharp/App/SchneiderMeterDriver/Config.cs +++ b/csharp/App/SchneiderMeterDriver/Config.cs @@ -8,8 +8,8 @@ public static class Config public const String Version = "1.0"; public const String BusName = "com.victronenergy.grid.Schnieder"; public const Byte ModbusNodeId = 1; - public const String OwnAddress = "10.0.0.1"; - public const String PeerAddress = "10.0.0.2"; + public const String OwnAddress = "192.168.1.246"; + public const String PeerAddress = "192.168.1.82"; //public const String PeerAddress = "127.0.0.1"; public const UInt16 PeerPort = 502; @@ -33,7 +33,7 @@ public static class Config new(s => s.ActivePowerL1, "/Ac/L1/Power", "0 W"), new(s => s.ActivePowerL2, "/Ac/L2/Power", "0 W"), new(s => s.ActivePowerL3, "/Ac/L3/Power", "0 W"), - new(s => (s.ActivePowerL1 + s.ActivePowerL2 + s.ActivePowerL3), "/Ac/Power", "0 W"), + //new(s => (s.ActivePowerL1 + s.ActivePowerL2 + s.ActivePowerL3), "/Ac/Power", "0 W"), // new(s => s.EnergyImportL123, "Ac/Energy/Forward", "0.00 kWh"), // new(s => s.EnergyExportL123, "Ac/Energy/Reverse", "0.00 kWh"), @@ -51,7 +51,7 @@ public static class Config public static VeProperties DefaultProperties => new VeProperties { new("/ProductName" , "Grid meter" ), - new("/CustomName" , "Schneider Professional II"), + new("/CustomName" , "Schneider Professional"), new("/DeviceInstance" , 30), new("/DeviceType" , 72), new("/Mgmt/Connection" , "Modbus TCP"), From 63dc832a1f86d3a84083a0d537367fd5271f88c1 Mon Sep 17 00:00:00 2001 From: atef Date: Wed, 5 Jun 2024 16:17:49 +0200 Subject: [PATCH 23/25] update Program.cs for Schnierder --- csharp/App/SchneiderMeterDriver/Program.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/csharp/App/SchneiderMeterDriver/Program.cs b/csharp/App/SchneiderMeterDriver/Program.cs index 54bc7c2b8..b447c8933 100644 --- a/csharp/App/SchneiderMeterDriver/Program.cs +++ b/csharp/App/SchneiderMeterDriver/Program.cs @@ -15,7 +15,7 @@ var networkInterfaces = await Nic.GetNetworkInterfaces(); var candidates = networkInterfaces.Where(n => n.IsUp && n.IsEthernet && - (!n.Ip4Addresses.Any() || n.Ip4Addresses.Contains(Config.OwnAddress))); + (!n.Ip4Addresses.Any() || n.Ip4Addresses.Contains(Config.OwnAddress))); foreach (var nic in candidates) { From 93f5da18f845c0fecbdfd91c283f78260e350086 Mon Sep 17 00:00:00 2001 From: kostas Date: Fri, 7 Jun 2024 10:36:15 +0200 Subject: [PATCH 24/25] extarct s3 data with decompression --- csharp/App/SchneiderMeterDriver/Config.cs | 10 +- .../SchneiderMeterDriver.cs | 72 +++++++- csharp/App/SchneiderMeterDriver/Signal.cs | 35 +++- csharp/App/SchniederMeterDriver/Utils.cs | 49 ----- .../App/SchniederMeterDriver/service/log/run | 3 - csharp/App/SchniederMeterDriver/service/run | 3 - .../IEM3kGridMeter/IEM3kGridMeterDevice.cs | 89 ++++++++- .../Lib/Protocols/Modbus/Channels/Channel.cs | 18 +- .../Modbus/Channels/RemoteSerialChannel.cs | 93 +++++++++- .../Protocols/Modbus/Channels/TcpChannel.cs | 104 ++++++++++- .../Modbus/Clients/ModbusTcpClient.cs | 169 +++++++++++++++++- .../Protocols/Modbus/Slaves/ModbusSlave.cs | 74 ++++++-- .../dbus-fzsonick-48tl.py | 16 +- .../dbus-fzsonick-48tl.py | 11 +- 14 files changed, 649 insertions(+), 97 deletions(-) delete mode 100644 csharp/App/SchniederMeterDriver/Utils.cs delete mode 100755 csharp/App/SchniederMeterDriver/service/log/run delete mode 100755 csharp/App/SchniederMeterDriver/service/run diff --git a/csharp/App/SchneiderMeterDriver/Config.cs b/csharp/App/SchneiderMeterDriver/Config.cs index eee15b286..dbe60ebf8 100644 --- a/csharp/App/SchneiderMeterDriver/Config.cs +++ b/csharp/App/SchneiderMeterDriver/Config.cs @@ -18,7 +18,7 @@ public static class Config public static readonly TimeSpan UpdatePeriod = TimeSpan.FromSeconds(1); - public static readonly IReadOnlyList Signals = new Signal[] + public static readonly IReadOnlyList Signals = new List { // new(s => s..CurrentL1, "/Ac/L1/Current", "0.0 A"), // new(s => s..CurrentL2, "/Ac/L2/Current", "0.0 A"), @@ -30,10 +30,10 @@ public static class Config // new(s => s.Ac.L3.Voltage, "/Ac/L3/Voltage", "0.0 A"), // new(s => (s.Ac.L1.Voltage + s.Ac.L2.Voltage + s.Ac.L3.Voltage) / 3.0m, "/Ac/Voltage", "0.0 A"), - new(s => s.ActivePowerL1, "/Ac/L1/Power", "0 W"), - new(s => s.ActivePowerL2, "/Ac/L2/Power", "0 W"), - new(s => s.ActivePowerL3, "/Ac/L3/Power", "0 W"), - //new(s => (s.ActivePowerL1 + s.ActivePowerL2 + s.ActivePowerL3), "/Ac/Power", "0 W"), + new Signal(s => s.ActivePowerL1, "/Ac/L1/Power", "0 W"), + new Signal(s => s.ActivePowerL2, "/Ac/L2/Power", "0 W"), + new Signal(s => s.ActivePowerL3, "/Ac/L3/Power", "0 W"), + new Signal(s => s.ActivePowerL1 + s.ActivePowerL2 + s.ActivePowerL3, "/Ac/Power", "0 W"), // new(s => s.EnergyImportL123, "Ac/Energy/Forward", "0.00 kWh"), // new(s => s.EnergyExportL123, "Ac/Energy/Reverse", "0.00 kWh"), diff --git a/csharp/App/SchneiderMeterDriver/SchneiderMeterDriver.cs b/csharp/App/SchneiderMeterDriver/SchneiderMeterDriver.cs index 65c344460..2953e9cd4 100644 --- a/csharp/App/SchneiderMeterDriver/SchneiderMeterDriver.cs +++ b/csharp/App/SchneiderMeterDriver/SchneiderMeterDriver.cs @@ -1,4 +1,4 @@ -using System.Reactive.Linq; +/*using System.Reactive.Linq; using InnovEnergy.Lib.Devices.IEM3kGridMeter; using InnovEnergy.Lib.Protocols.DBus; using InnovEnergy.Lib.Protocols.Modbus.Clients; @@ -84,4 +84,72 @@ public static class SchneiderMeterDriver Console.WriteLine($"Connecting to DBus {bus}"); return properties.PublishOnDBus(bus, Config.BusName); } -} \ No newline at end of file +}*/ + +using System; +using System.Reactive.Linq; +using InnovEnergy.Lib.Devices.IEM3kGridMeter; +using InnovEnergy.Lib.Protocols.DBus; +using InnovEnergy.Lib.Protocols.Modbus.Clients; +using InnovEnergy.Lib.Utils; +using InnovEnergy.Lib.Victron.VeDBus; + +namespace InnovEnergy.App.SchneiderDriver +{ + public static class SchneiderMeterDriver + { + public static Task Run(string hostName, Bus dbusAddress) + { + return Run(hostName, ModbusTcpClient.DefaultPort, dbusAddress); + } + + public static async Task Run(string hostName, ushort port, Bus dbusAddress) + { + var schneider = new Iem3KGridMeterDevice(hostName, port, Config.ModbusNodeId); + var schneiderStatus = Observable + .Interval(Config.UpdatePeriod) + .Select(_ => + { + var status = schneider.Read(); + if (status == null) + { + Console.WriteLine("Failed to read data from Iem3KGridMeterDevice"); + } + return status; + }) + .Where(status => status != null) // Ignore null readings + .Publish(); + + var poller = schneiderStatus.Connect(); + var properties = Config.DefaultProperties; + + var signals = Config + .Signals + .Select(signal => schneiderStatus.Select(signal.ToVeProperty)) + .Merge() + .Do(p => properties.Set(p)); + + schneiderStatus.Subscribe(_ => properties.Set("/Connected", 1)); + + var dbus = schneiderStatus + .Skip(1) + .Take(1) + .SelectMany(_ => PublishPropertiesOnDBus(properties, dbusAddress)); + + return await signals + .MergeErrors(dbus) + .Finally(poller.Dispose) + .SelectErrors(); + } + + private static Task PublishPropertiesOnDBus(VeProperties properties, Bus bus) + { + Console.WriteLine($"Connecting to DBus {bus}"); + return properties.PublishOnDBus(bus, Config.BusName); + } + } +} + + + + diff --git a/csharp/App/SchneiderMeterDriver/Signal.cs b/csharp/App/SchneiderMeterDriver/Signal.cs index 9f9bb2254..e7eba2bec 100644 --- a/csharp/App/SchneiderMeterDriver/Signal.cs +++ b/csharp/App/SchneiderMeterDriver/Signal.cs @@ -1,4 +1,4 @@ -using InnovEnergy.Lib.Devices.IEM3kGridMeter; +/*using InnovEnergy.Lib.Devices.IEM3kGridMeter; using InnovEnergy.Lib.Protocols.DBus.Protocol.DataTypes; using InnovEnergy.Lib.Victron.VeDBus; @@ -6,11 +6,38 @@ namespace InnovEnergy.App.SchneiderDriver; // TODO: Does not compile -public record Signal(Func Source, ObjectPath Path, String Format = "") +public record Signal(Func Source, ObjectPath Path, string Format = "") { public VeProperty ToVeProperty(Iem3KGridMeterRegisters status) { var value = Source(status); - return new VeProperty(Path, value, String.Format($"{{0:{Format}}}", value)); + return new VeProperty(Path, value, string.Format($"{{0:{Format}}}", value)); } -} \ No newline at end of file +}*/ + +using InnovEnergy.Lib.Devices.IEM3kGridMeter; +using InnovEnergy.Lib.Protocols.DBus.Protocol.DataTypes; +using InnovEnergy.Lib.Victron.VeDBus; +using System; + +namespace InnovEnergy.App.SchneiderDriver +{ + public record Signal(Func Source, ObjectPath Path, string Format = "") + { + public VeProperty ToVeProperty(Iem3KGridMeterRegisters status) + { + if (status == null) + { + Console.WriteLine($"Status is null for path: {Path}"); + // Return a default VeProperty if status is null + return new VeProperty(Path, default, String.Format($"{{0:{Format}}}", default)); + } + + var value = Source(status); + return new VeProperty(Path, value, String.Format($"{{0:{Format}}}", value)); + } + } +} + + + diff --git a/csharp/App/SchniederMeterDriver/Utils.cs b/csharp/App/SchniederMeterDriver/Utils.cs deleted file mode 100644 index 53d5ca9d5..000000000 --- a/csharp/App/SchniederMeterDriver/Utils.cs +++ /dev/null @@ -1,49 +0,0 @@ -namespace InnovEnergy.App.SchniederDriver; - -public static class Utils -{ - public static IEnumerable TryWhere(this IEnumerable src, Func predicate) - { - foreach (var e in src) - { - var ok = false; - - try - { - ok = predicate(e); - } - catch - { - // ignored - } - - if (ok) - yield return e; - } - } - - public static IEnumerable TrySelect(this IEnumerable src, Func map) - { - foreach (var e in src) - { - var ok = false; - var result = default(R); - - try - { - result = map(e); - ok = true; - } - catch - { - // ignored - } - - if (ok) - yield return result!; - } - } - - - -} \ No newline at end of file diff --git a/csharp/App/SchniederMeterDriver/service/log/run b/csharp/App/SchniederMeterDriver/service/log/run deleted file mode 100755 index 62e2f8679..000000000 --- a/csharp/App/SchniederMeterDriver/service/log/run +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh -exec 2>&1 -exec multilog t s25000 n4 /var/log/EmuMeter diff --git a/csharp/App/SchniederMeterDriver/service/run b/csharp/App/SchniederMeterDriver/service/run deleted file mode 100755 index 58cdb6ff7..000000000 --- a/csharp/App/SchniederMeterDriver/service/run +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh -exec 2>&1 -exec softlimit -d 100000000 -s 1000000 -a 100000000 /opt/innovenergy/EmuMeter/EmuMeter diff --git a/csharp/Lib/Devices/IEM3kGridMeter/IEM3kGridMeterDevice.cs b/csharp/Lib/Devices/IEM3kGridMeter/IEM3kGridMeterDevice.cs index 38dfecda4..7a1106c5f 100644 --- a/csharp/Lib/Devices/IEM3kGridMeter/IEM3kGridMeterDevice.cs +++ b/csharp/Lib/Devices/IEM3kGridMeter/IEM3kGridMeterDevice.cs @@ -1,4 +1,4 @@ -using InnovEnergy.Lib.Protocols.Modbus.Channels; +/*using InnovEnergy.Lib.Protocols.Modbus.Channels; using InnovEnergy.Lib.Protocols.Modbus.Clients; using InnovEnergy.Lib.Protocols.Modbus.Slaves; using InnovEnergy.Lib.Utils; @@ -14,7 +14,7 @@ public class Iem3KGridMeterDevice: ModbusDevice private Iem3KGridMeterDevice(Channel channel, Byte slaveId = 1) : base(new ModbusTcpClient(channel, slaveId)) { } - + public Iem3KGridMeterDevice(ModbusClient client) : base(client) { } @@ -26,7 +26,7 @@ public class Iem3KGridMeterDevice: ModbusDevice { return base.Read(); } - catch + catch { // TODO: Log $"Failed to read data from {nameof(Iem3KGridMeterDevice)}".WriteLine(); @@ -41,7 +41,7 @@ public class Iem3KGridMeterDevice: ModbusDevice { base.Write(registers); } - catch + catch { // TODO: Log $"Failed to write data to {nameof(Iem3KGridMeterDevice)}".WriteLine(); @@ -49,4 +49,83 @@ public class Iem3KGridMeterDevice: ModbusDevice } -} \ No newline at end of file +}*/ + +using InnovEnergy.Lib.Protocols.Modbus.Channels; +using InnovEnergy.Lib.Protocols.Modbus.Clients; +using InnovEnergy.Lib.Protocols.Modbus.Slaves; +using InnovEnergy.Lib.Utils; +using System; + +namespace InnovEnergy.Lib.Devices.IEM3kGridMeter +{ + public class Iem3KGridMeterDevice : ModbusDevice + { + private readonly string _hostname; + private readonly ushort _port; + private readonly byte _slaveId; + + public Iem3KGridMeterDevice(string hostname, ushort port = 502, byte slaveId = 1) + : this(new TcpChannel(hostname, port), slaveId) + { + _hostname = hostname ?? throw new ArgumentNullException(nameof(hostname)); + _port = port; + _slaveId = slaveId; + } + + private Iem3KGridMeterDevice(TcpChannel channel, byte slaveId = 1) + : base(new ModbusTcpClient(channel, slaveId)) + { + _hostname = channel.Host; + _port = channel.Port; + _slaveId = slaveId; + Console.WriteLine($"Initializing Iem3KGridMeterDevice with channel: {channel.Host}:{channel.Port}"); + } + + public Iem3KGridMeterDevice(ModbusClient client) + : base(client) + { + if (client is ModbusTcpClient tcpClient) + { + _hostname = tcpClient.Channel.Host; + _port = tcpClient.Channel.Port; + _slaveId = tcpClient.SlaveId; + } + else + { + throw new ArgumentException("Invalid client type", nameof(client)); + } + Console.WriteLine("Initializing Iem3KGridMeterDevice with ModbusClient"); + } + + public new Iem3KGridMeterRegisters? Read() + { + try + { + Console.WriteLine($"Attempting to read data from {_hostname}:{_port} with slaveId {_slaveId}"); + return base.Read(); + } + catch (Exception ex) + { + Console.WriteLine($"Failed to read data from {nameof(Iem3KGridMeterDevice)}: {ex.Message}"); + return null; + } + } + + public new void Write(Iem3KGridMeterRegisters registers) + { + try + { + base.Write(registers); + } + catch (Exception ex) + { + Console.WriteLine($"Failed to write data to {nameof(Iem3KGridMeterDevice)}: {ex.Message}"); + } + } + } +} + + + + diff --git a/csharp/Lib/Protocols/Modbus/Channels/Channel.cs b/csharp/Lib/Protocols/Modbus/Channels/Channel.cs index 9fd8ec731..676025c16 100644 --- a/csharp/Lib/Protocols/Modbus/Channels/Channel.cs +++ b/csharp/Lib/Protocols/Modbus/Channels/Channel.cs @@ -1,7 +1,19 @@ -namespace InnovEnergy.Lib.Protocols.Modbus.Channels; +//namespace InnovEnergy.Lib.Protocols.Modbus.Channels; -public abstract class Channel +/*public abstract class Channel { public abstract IReadOnlyList Read(Int32 nBytes); public abstract void Write(IReadOnlyList bytes); -} \ No newline at end of file +}*/ + +using System; +using System.Collections.Generic; + +namespace InnovEnergy.Lib.Protocols.Modbus.Channels +{ + public abstract class Channel + { + public abstract IReadOnlyList Read(int nBytes); + public abstract void Write(IReadOnlyList bytes); + } +} diff --git a/csharp/Lib/Protocols/Modbus/Channels/RemoteSerialChannel.cs b/csharp/Lib/Protocols/Modbus/Channels/RemoteSerialChannel.cs index 98ecd1cd5..c42299221 100644 --- a/csharp/Lib/Protocols/Modbus/Channels/RemoteSerialChannel.cs +++ b/csharp/Lib/Protocols/Modbus/Channels/RemoteSerialChannel.cs @@ -4,7 +4,7 @@ using System.Reactive.Linq; using CliWrap; using InnovEnergy.Lib.Utils; -namespace InnovEnergy.Lib.Protocols.Modbus.Channels; +/*namespace InnovEnergy.Lib.Protocols.Modbus.Channels; public record RemoteSerialConnection ( @@ -207,4 +207,93 @@ public class RemoteSerialChannel : ConnectionChannel { connection.Write(data); } -} \ No newline at end of file +}*/ + +using System; +using System.IO.Ports; +using CliWrap; +using InnovEnergy.Lib.Utils; + +namespace InnovEnergy.Lib.Protocols.Modbus.Channels +{ + public class RemoteSerialChannel : ConnectionChannel, IDisposable + { + private readonly Command _Command; + private readonly TcpChannel _TcpChannel; + + const string SsDir = "/opt/victronenergy/serial-starter"; + const string KillTasks = "kill $!"; + + private CancellationTokenSource _CancellationTokenSource = new CancellationTokenSource(); + + private CommandTask? _CommandTask; + + public RemoteSerialChannel(SshHost host, string tty, int baudRate, Parity parity, int dataBits, int stopBits) + { + const int port = 6855; + + tty = tty.EnsureStartsWith("/dev/"); + + var configureTty = ConfigureTty(tty, baudRate, parity, stopBits, dataBits); + + var stopTty = $"{SsDir}/stop-tty.sh {tty}"; + var startTty = $"{SsDir}/start-tty.sh {tty}"; + + var socat = $"socat TCP-LISTEN:{port},nodelay {tty},raw"; + + var script = $"{configureTty} && {socat}"; + + _Command = host.Command.AppendArgument(script); + _TcpChannel = new TcpChannel(host.HostName, port); + } + + private static string ConfigureTty(string tty, int baudRate, Parity parity, int stopBits, int dataBits) + { + var oParity = parity switch + { + Parity.Even => "parenb -parodd", + Parity.Odd => "parenb parodd", + Parity.None => "-parenb", + _ => throw new NotImplementedException() + }; + + var oStopBits = stopBits switch + { + 1 => "-cstopb", + 2 => "cstopb", + _ => throw new NotImplementedException() + }; + + var oDataBits = "cs" + dataBits; + + return $"stty -F {tty} {baudRate} {oDataBits} {oStopBits} {oParity}"; + } + + protected override TcpChannel Open() + { + return _TcpChannel; + } + + protected override void Close(TcpChannel connection) + { + _CancellationTokenSource.Cancel(); + connection.Dispose(); + _CancellationTokenSource = new CancellationTokenSource(); + } + + protected override IReadOnlyList Read(TcpChannel connection, int nBytes) + { + return connection.Read(nBytes); + } + + protected override void Write(TcpChannel connection, IReadOnlyList data) + { + connection.Write(data); + } + + public void Dispose() + { + Close(_TcpChannel); + } + } +} diff --git a/csharp/Lib/Protocols/Modbus/Channels/TcpChannel.cs b/csharp/Lib/Protocols/Modbus/Channels/TcpChannel.cs index 22a20d018..f1f39a09a 100644 --- a/csharp/Lib/Protocols/Modbus/Channels/TcpChannel.cs +++ b/csharp/Lib/Protocols/Modbus/Channels/TcpChannel.cs @@ -2,7 +2,7 @@ using System.Net.Sockets; using InnovEnergy.Lib.Protocols.Modbus.Protocol; using InnovEnergy.Lib.Utils.Net; -namespace InnovEnergy.Lib.Protocols.Modbus.Channels; +/*namespace InnovEnergy.Lib.Protocols.Modbus.Channels; public class TcpChannel : ConnectionChannel { @@ -82,4 +82,104 @@ public class TcpChannel : ConnectionChannel var array = data.ToArray(); tcpClient.GetStream().Write(array, 0, array.Length); } -} \ No newline at end of file +}*/ + +using System; +using System.Net.Sockets; + +namespace InnovEnergy.Lib.Protocols.Modbus.Channels +{ + public class TcpChannel : Channel, IDisposable + { + public string Host { get; } + public ushort Port { get; } + + private const int TimeoutMs = 500; // TODO: parametrize + private Socket? Socket { get; set; } + private byte[] Buffer { get; } + + public TcpChannel(string hostname, ushort port) + { + Host = hostname ?? throw new ArgumentNullException(nameof(hostname)); + Port = port; + Buffer = new byte[8192]; // Buffer size can be adjusted + } + + public override IReadOnlyList Read(int nBytes) + { + if (Socket == null) + throw new InvalidOperationException("Socket is not connected."); + + var buffer = new byte[nBytes]; + int bytesRead = 0; + + while (bytesRead < nBytes) + { + var read = Socket.Receive(buffer, bytesRead, nBytes - bytesRead, SocketFlags.None); + if (read == 0) + throw new Exception("Socket closed."); + + bytesRead += read; + } + + return buffer; + } + + public override void Write(IReadOnlyList bytes) + { + if (Socket == null) + throw new InvalidOperationException("Socket is not connected."); + + Socket.Send(bytes.ToArray(), SocketFlags.None); + } + + public void Connect() + { + if (Socket != null) + return; + + Socket = new Socket(SocketType.Stream, ProtocolType.Tcp) + { + Blocking = true, + NoDelay = true, + LingerState = new LingerOption(false, 0), + ReceiveTimeout = TimeoutMs, + SendTimeout = TimeoutMs + }; + + var cts = new CancellationTokenSource(); + cts.CancelAfter(TimeoutMs); + + try + { + Socket.ConnectAsync(Host, Port).Wait(TimeoutMs); + } + catch + { + Socket = null; + throw; + } + } + + public void Disconnect() + { + if (Socket == null) + return; + + try + { + Socket.Close(); + } + finally + { + Socket = null; + } + } + + public void Dispose() + { + Disconnect(); + } + } +} + diff --git a/csharp/Lib/Protocols/Modbus/Clients/ModbusTcpClient.cs b/csharp/Lib/Protocols/Modbus/Clients/ModbusTcpClient.cs index ff206717f..7966bacb4 100644 --- a/csharp/Lib/Protocols/Modbus/Clients/ModbusTcpClient.cs +++ b/csharp/Lib/Protocols/Modbus/Clients/ModbusTcpClient.cs @@ -12,7 +12,7 @@ namespace InnovEnergy.Lib.Protocols.Modbus.Clients; using UInt16s = IReadOnlyCollection; using Booleans = IReadOnlyCollection; -public class ModbusTcpClient : ModbusClient +/*public class ModbusTcpClient : ModbusClient { public const UInt16 DefaultPort = 502; private UInt16 _Id; @@ -184,4 +184,171 @@ public class ModbusTcpClient : ModbusClient return new MbData(rxFrm.RegistersRead.RawData, readAddress, Endian); } +}*/ + +public class ModbusTcpClient : ModbusClient +{ + public const ushort DefaultPort = 502; + private ushort _Id; + public TcpChannel Channel { get; } + + public ModbusTcpClient(TcpChannel channel, byte slaveId) : base(channel, slaveId) + { + Channel = channel; + Channel.Connect(); + } + + private ushort NextId() => unchecked(++_Id); + + public override MbData ReadCoils(ushort readAddress, ushort nValues) + { + var id = NextId(); // TODO: check response id + + var cmd = new ReadCoilsCommandFrame(SlaveId, readAddress, nValues); + var hdr = new MbapHeader(id, cmd.Data.Count); + var frm = new ModbusTcpFrame(hdr, cmd); + + Channel.Write(frm.Data); + + var hData = Channel.Read(MbapHeader.Size).ToArray(); + var rxHdr = new MbapHeader(hData); + + var rxFrm = Channel + .Read(rxHdr.FrameLength) + .ToArray() + .Apply(ReadCoilsResponseFrame.Parse) + .Apply(cmd.VerifyResponse); + + return new MbData(rxFrm.Coils.RawData, readAddress, Endian); + } + + public override MbData ReadDiscreteInputs(ushort readAddress, ushort nValues) + { + var id = NextId(); // TODO: check response id + + var cmd = new ReadDiscreteInputsCommandFrame(SlaveId, readAddress, nValues); + var hdr = new MbapHeader(id, cmd.Data.Count); + var frm = new ModbusTcpFrame(hdr, cmd); + + Channel.Write(frm.Data); + + var hData = Channel.Read(MbapHeader.Size).ToArray(); + var rxHdr = new MbapHeader(hData); + + var rxFrm = Channel + .Read(rxHdr.FrameLength) + .ToArray() + .Apply(ReadDiscreteInputsResponseFrame.Parse) + .Apply(cmd.VerifyResponse); + + return new MbData(rxFrm.Inputs.RawData, readAddress, Endian); + } + + public override MbData ReadInputRegisters(ushort readAddress, ushort nValues) + { + var id = NextId(); // TODO: check response id + + var cmd = new ReadInputRegistersCommandFrame(SlaveId, readAddress, nValues); + var hdr = new MbapHeader(id, cmd.Data.Count); + var frm = new ModbusTcpFrame(hdr, cmd); + + Channel.Write(frm.Data); + + var hData = Channel.Read(MbapHeader.Size).ToArray(); + var rxHdr = new MbapHeader(hData); + + var rxFrm = Channel + .Read(rxHdr.FrameLength) + .ToArray() + .Apply(ReadInputRegistersResponseFrame.Parse) + .Apply(cmd.VerifyResponse); + + return new MbData(rxFrm.RegistersRead.RawData, readAddress, Endian); + } + + public override MbData ReadHoldingRegisters(ushort readAddress, ushort nValues) + { + var id = NextId(); // TODO: check response id + + var cmd = new ReadHoldingRegistersCommandFrame(SlaveId, readAddress, nValues); + var hdr = new MbapHeader(id, cmd.Data.Count); + var frm = new ModbusTcpFrame(hdr, cmd); + + Channel.Write(frm.Data); + + var hData = Channel.Read(MbapHeader.Size).ToArray(); + var rxHdr = new MbapHeader(hData); + + var rxFrm = Channel + .Read(rxHdr.FrameLength) + .ToArray() + .Apply(ReadHoldingRegistersResponseFrame.Parse) + .Apply(cmd.VerifyResponse); + + return new MbData(rxFrm.RegistersRead.RawData, readAddress, Endian); + } + + public override ushort WriteCoils(ushort writeAddress, Booleans coils) + { + var id = NextId(); // TODO: check response id + var cmd = new WriteCoilsCommandFrame(SlaveId, writeAddress, coils); + var hdr = new MbapHeader(id, cmd.Data.Count); + var frm = new ModbusTcpFrame(hdr, cmd); + + Channel.Write(frm.Data); + + var hData = Channel.Read(MbapHeader.Size).ToArray(); + var rxHdr = new MbapHeader(hData); + + var rxFrm = Channel + .Read(rxHdr.FrameLength) + .ToArray() + .Apply(WriteCoilsResponseFrame.Parse) + .Apply(cmd.VerifyResponse); + + return rxFrm.NbWritten; + } + + public override ushort WriteRegisters(ushort writeAddress, UInt16s values) + { + var id = NextId(); // TODO: check response id + var cmd = new WriteRegistersCommandFrame(SlaveId, writeAddress, values); + var hdr = new MbapHeader(id, cmd.Data.Count); + var frm = new ModbusTcpFrame(hdr, cmd); + + Channel.Write(frm.Data); + + var hData = Channel.Read(MbapHeader.Size).ToArray(); + var rxHdr = new MbapHeader(hData); + + var rxFrm = Channel + .Read(rxHdr.FrameLength) + .ToArray() + .Apply(WriteRegistersResponseFrame.Parse) + .Apply(cmd.VerifyResponse); + + return rxFrm.NbWritten; + } + + public override MbData ReadWriteRegisters(ushort readAddress, ushort nbToRead, ushort writeAddress, UInt16s registersToWrite) + { + var id = NextId(); // TODO: check response id + + var cmd = new ReadWriteRegistersCommandFrame(SlaveId, readAddress, nbToRead, writeAddress, registersToWrite); + + var hdr = new MbapHeader(id, cmd.Data.Count); + var frm = new ModbusTcpFrame(hdr, cmd); + + Channel.Write(frm.Data); + + var hData = Enumerable.ToArray(Channel.Read(MbapHeader.Size)); + var rxHdr = new MbapHeader(hData); + + var fData = Enumerable.ToArray(Channel.Read(rxHdr.FrameLength)); + var rxFrm = fData + .Apply(ReadWriteRegistersResponseFrame.Parse) + .Apply(cmd.VerifyResponse); + + return new MbData(rxFrm.RegistersRead.RawData, readAddress, Endian); + } } \ No newline at end of file diff --git a/csharp/Lib/Protocols/Modbus/Slaves/ModbusSlave.cs b/csharp/Lib/Protocols/Modbus/Slaves/ModbusSlave.cs index 3b1870058..8c78dbb31 100644 --- a/csharp/Lib/Protocols/Modbus/Slaves/ModbusSlave.cs +++ b/csharp/Lib/Protocols/Modbus/Slaves/ModbusSlave.cs @@ -1,7 +1,7 @@ using InnovEnergy.Lib.Protocols.Modbus.Channels; using InnovEnergy.Lib.Protocols.Modbus.Clients; -namespace InnovEnergy.Lib.Protocols.Modbus.Slaves; +/*namespace InnovEnergy.Lib.Protocols.Modbus.Slaves; public static class ModbusSlave { @@ -11,14 +11,14 @@ public static class ModbusSlave ModbusTcpClient SlaveId(Byte slaveId) => new ModbusTcpClient(channel, slaveId); return SlaveId; } - + public static Func ModbusRtu(this Channel channel) { ModbusRtuClient SlaveId(Byte slaveId) => new ModbusRtuClient(channel, slaveId); return SlaveId; } - - + + public static Func ModbusTcp(this Channel channel) where R : notnull, new() { ModbusTcpClient SlaveId(Byte slaveId) @@ -28,28 +28,82 @@ public static class ModbusSlave return SlaveId; } - + public static Func ModbusRtu(this Channel channel) where R : notnull, new() { ModbusRtuClient SlaveId(Byte slaveId) => new ModbusRtuClient(channel, slaveId); return SlaveId; } - + public static ModbusDevice TcpSlave(this Channel channel, Byte slaveId) where T : notnull, new() { var client = new ModbusTcpClient(channel, slaveId); return new ModbusDevice(client); } - + public static ModbusDevice RtuSlave(this Channel channel, Byte slaveId) where T : notnull, new() { var client = new ModbusRtuClient(channel, slaveId); return new ModbusDevice(client); } - + public static ModbusDevice Slave(this ModbusClient modbusClient) where T : notnull, new() { return new ModbusDevice(modbusClient); } - -} \ No newline at end of file + +}*/ + +using InnovEnergy.Lib.Protocols.Modbus.Channels; +using InnovEnergy.Lib.Protocols.Modbus.Clients; + +namespace InnovEnergy.Lib.Protocols.Modbus.Slaves +{ + public static class ModbusSlave + { + public static Func ModbusTcp(this Channel channel) + { + ModbusTcpClient SlaveId(byte slaveId) => new ModbusTcpClient((TcpChannel)channel, slaveId); + return SlaveId; + } + + public static Func ModbusRtu(this Channel channel) + { + ModbusRtuClient SlaveId(byte slaveId) => new ModbusRtuClient(channel, slaveId); + return SlaveId; + } + + public static Func ModbusTcp(this Channel channel) where R : notnull, new() + { + ModbusTcpClient SlaveId(byte slaveId) + { + return new ModbusTcpClient((TcpChannel)channel, slaveId); + } + + return SlaveId; + } + + public static Func ModbusRtu(this Channel channel) where R : notnull, new() + { + ModbusRtuClient SlaveId(byte slaveId) => new ModbusRtuClient(channel, slaveId); + return SlaveId; + } + + public static ModbusDevice TcpSlave(this Channel channel, byte slaveId) where T : notnull, new() + { + var client = new ModbusTcpClient((TcpChannel)channel, slaveId); + return new ModbusDevice(client); + } + + public static ModbusDevice RtuSlave(this Channel channel, byte slaveId) where T : notnull, new() + { + var client = new ModbusRtuClient(channel, slaveId); + return new ModbusDevice(client); + } + + public static ModbusDevice Slave(this ModbusClient modbusClient) where T : notnull, new() + { + return new ModbusDevice(modbusClient); + } + } +} diff --git a/python/dbus-fz-sonick-48tl-with-s3/dbus-fzsonick-48tl.py b/python/dbus-fz-sonick-48tl-with-s3/dbus-fzsonick-48tl.py index 87a64c631..cec68cd43 100755 --- a/python/dbus-fz-sonick-48tl-with-s3/dbus-fzsonick-48tl.py +++ b/python/dbus-fz-sonick-48tl-with-s3/dbus-fzsonick-48tl.py @@ -492,8 +492,9 @@ 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 @@ -510,8 +511,7 @@ def create_update_task(modbus, service, batteries): def update_task(): # type: () -> bool - - global alive + global alive, start_time logging.debug('starting update cycle') @@ -534,8 +534,12 @@ def create_update_task(modbus, service, batteries): status_message, alarms_number_list, warnings_number_list = update_state_from_dictionaries(current_warnings, current_alarms, node_numbers) 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 +552,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-fzsonick-48tl-nofork/dbus-fzsonick-48tl.py b/python/dbus-fzsonick-48tl-nofork/dbus-fzsonick-48tl.py index ad017c7b1..b06c51204 100755 --- a/python/dbus-fzsonick-48tl-nofork/dbus-fzsonick-48tl.py +++ b/python/dbus-fzsonick-48tl-nofork/dbus-fzsonick-48tl.py @@ -863,7 +863,10 @@ def update_for_testing(modbus, batteries, dbus, signals, csv_signals): logging.debug('finished update cycle\n') return True +start_time = time.time() + def update(modbus, batteries, dbus, signals, csv_signals): + global start_time # type: (Modbus, Iterable[Battery], DBus, Iterable[Signal]) -> bool """ Main update function @@ -891,7 +894,11 @@ def update(modbus, batteries, dbus, signals, csv_signals): current_alarms[signal_name] = value print(update_state_from_dictionaries(current_warnings, current_alarms)) publish_values(dbus, signals, statuses) - create_csv_files(csv_signals, statuses, node_numbers) + elapsed_time = time.time() - start_time + if elapsed_time >= 30: + create_csv_files(csv_signals, statuses, node_numbers) + start_time = time.time() + print("Elapsed time {:.2f} seconds".format(elapsed_time)) logging.debug('finished update cycle\n') return True @@ -956,7 +963,7 @@ def get_installation_name(file_path): return file.read().strip() 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: From 9434092b6faafd172796740e632001249e70ffff Mon Sep 17 00:00:00 2001 From: kostas Date: Fri, 7 Jun 2024 10:41:38 +0200 Subject: [PATCH 25/25] update: send a csv file every 30 seconds fix: manage_csv_files --- .../dbus-fzsonick-48tl/dbus-fzsonick-48tl.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/NodeRed/NodeRedFiles/dbus-fzsonick-48tl/dbus-fzsonick-48tl.py b/NodeRed/NodeRedFiles/dbus-fzsonick-48tl/dbus-fzsonick-48tl.py index b4c055856..aa61b3532 100755 --- a/NodeRed/NodeRedFiles/dbus-fzsonick-48tl/dbus-fzsonick-48tl.py +++ b/NodeRed/NodeRedFiles/dbus-fzsonick-48tl/dbus-fzsonick-48tl.py @@ -881,7 +881,10 @@ import random logging.debug('finished update cycle\n') return True''' +start_time = time.time() + def update(modbus, batteries, dbus, signals, csv_signals): + global start_time # type: (Modbus, Iterable[Battery], DBus, Iterable[Signal]) -> bool """ Main update function @@ -910,7 +913,11 @@ def update(modbus, batteries, dbus, signals, csv_signals): #print(update_state_from_dictionaries(current_warnings, current_alarms)) status_message, alarms_number_list, warnings_number_list = update_state_from_dictionaries(current_warnings, current_alarms, node_numbers) publish_values(dbus, 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(f"Elapsed time: {elapsed_time:.2f} seconds") logging.debug('finished update cycle\n') return True @@ -975,7 +982,7 @@ def get_installation_name(file_path): return file.read().strip() 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:

    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

    }IiPrVsHN=KvV5 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 o0Y4tIBNS>5_J&;L0 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�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�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 z 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ૻ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%0A2Y>y2Kb<@B*Oh>}-K1Cf_Bcjdw}3J@cr4BGpXok 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¬u$ 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 b5;B0;U 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ΞB zegFRdK|gcOd7fR@UVH7e)?UT)un-I_Ch#;@LXL@N>7t+8yCpLP-u737Uxg*aGRi>L zHSYfrYc5(ks*LDWgQ*2)au)ZE@@RO9n@%H4>%8l8Ot3hn{8x}mbsysbK%9HZam5GY zS|Obz`{+qyAye)g;;NT#!)tkshcC>-2dUqn>(V4WRzuj6LF}})1lbS7`64bne7Dn# zBVs>QV1WhIrx?fnG~F#so*Zq>>AJQ5)u=7h6io&T^|`fQ+o9Sy3QGv+pX}2bO($Uc zR8^kV98KLWnkIQ;tb1`U^*hy_R;kJ}qiI%oCZ$u&lX=n{5)uDpFO5G~pN&m72)StZ z%u2D%Lj*rZ7~SNCG~CYYNI%^UyrF>P;RkJ;YnN)=4w;G_M`OD>e3)@+@|3yYp!J>; zxY7L1vpq-SV<$RF-H4AdE@ge%RZZ~-#=BSdY7G*UAD=t>AQ-*=1Rt-R81i_%B_0S1Xq+O3=R`Wd2}+fn!$%RS!1GafE$PHw*}3Jc+b8_V-vD6BJ?Z-eZ|mJz z)(slaM%)_d*I0hXk zVJ-J+^@G`HNEA=gEH#tateNhwDwRB|T^pU`BgEiujQ%$*4sDA5mxT}w_Z`jAPkBnb z3@!K>%Mu6yyqLr2^5blHRa^;gR6B#$Tg_qc#3Fs%nBe89&s{@HVxPXnhCC*PJ2|6= zA_YJW0#(zZK7}P zY0%AXAh;~D2a=lgg*>TN)KXdK8_a`$01KZ}!XC@x$WrG7Y8C=E;ohT65UB^YoSn?S=YOK+#Y1~`l%>hb&Q>jeh(_K*=MK zpv1%d%)q6;`_0n$O6Gxn2w!-+oIQcc)AX(72Yl0pGP?x!Ch~;ej5A&3#(6WrOf7}) z=m_g5P}w59(nj|7fV68x^`djLx}}8xEl84s-B2C+cGD?&iYWl#*;);bEBzJFrlMJU zV(~_(fQb9~79u01%VieihbjPPf?~y{y;c-7Z`w5Z7>u~D9P^$}aT6PKBaG~31V;rp zKvSm+R~cznrS~9fMr(RT`Kt1l)`IrPrpStL5V|d_Ww`85>+?@``6n~ zR*M}qDV)QgSmRN6w56NNN3V!#I}dhDXZUbW`C~s+tY@kq%A4#A@9&Q6Yn(eH{c+0k z>8F~Vl8q&owV7b7%>?)vRwd4H{S|vCCIDUn1}!#&R_Ek8to zq5MaheA&bXoBGi1rVb`0WvFE`rmfQ4gfXe_?Mtm8?7i#r;33Z;C+!OhzU>mlZv zH@oTF{n_Nqy!Y=l@WT#D%`G1_R~ShM(ZU!hpR@d307epb(=c+C37mEA9W!U??~cW8 zobj;Elt^G?*_aw0mjBYg6G9?+Zb}eI0B9z)Yso>FvlxR64d>cOak{gyqFaoYE8acc zb|H87fRQW1?jdn^5uBuiN6I(;4oG=qK*~)Sq&y}UDc1`UUo}X);jJyYfW-T`knm_Z zHy+ zBTL2vL_PG7^Wt41os>Hi-UK(`#6vp-|L4)1WuI0G%|!t(Sf&$|{Z;|iY|a5HqD@>Q z8o-8*KKagLW4H~%#~YuOixU)ny~4M5;<8pX=$}aVJJvKQK4SVO#(m}1MLts5CK!8OMON5rsRVUEAkhrP9n1E?EF1Pa z)^(OrCw53oLI9c91XzWajWQ+1s$-VXVC4p}(C`i+s7BuJFx-rl)x(s=#? zW0ik7V;wm;_?P>!K4o2ZF;-Md6{)!^B>+iLune!C z-z=P&?I$tB+eP)Wh|51Cl3JP75s=06r4Jw!86OIZBHa5rurkehw0X1AEW~Pc!YQG& zLHhu2MKJ}FFPB6Lzg!1rfxs~@Enjg0+DwURXV_mtf%pbYY5z_5cVh3Dc(+p$FUeQb*!Xg9$y-ry~OEy*tS= zH%kr7Phgh7j$mc zS`pdLRB=k)FL_6Dw--7^x|Z9dDh<;oae;iL++PE7Dxm|BJ(z-573@N59nJUQ%N%hq zd|z7`4yY%)i(qxE4I)xzUX0R{t^9kl4Yd+mMfRME*4zAO3q4N0x97aKjcD*XatC2a8!LeBJi$(C!m};Aa748*yHZfbLvQ5yF zprah<{>1lsMHOk*3Jq*?GB)00!eXB#@EE0|=dWAJb5|U5}^wi`Yc^g&?F4h?SLT(qGb(+Yf8nCeLLqM4!7+ zj1ffZuQ`ZZ@30XPtifQO*SN~^I}yB=iNR75$RNwxh5-Q=nWWtgDI0I0Ycu}2QlE`Gn?BG5snC2Ev z28=#tp2UGruNa<+v|%?(97=X&Hbl8*gw628K4M3qE3=flN*wE7?AEuh&cnC4Vq&%2 z@#IisZ%smz0=UX7mm^-ef*rxr%)X|~z5h#(LLM#Lahj6~&rAx zqj>f|tf8Ql!SBF+(y@J_r?-NyONFa%gdo%hF%<2+y^VK;b?d!_IlJ_pyuJEh>{c4Y z^R;{<=o|ovp15s8^H@~-68amj0~_MIp+VuT72uY|7Yt3$$~KMC!(#;&-CmiCoe}0V z*{90nrXphj-}Gqg1n;uK0bL(`8x>haTY9ENA^^wcd&3>COR1O@MZ2>!XM2Tq?hUW@ z)+qNF5Uq9R{}Ou0=6Q^D&|V`4)JksFg%Ki(m{~CM3gW|ohc!s5CQUnJSyXFO8RD>E z=ni9O{tf&Ygj8qwW{m|*qnt1O9)r%o!Y3h>8s9k<8#e9k0t2huBIFzQsk$O$7ocHk zTsX9t3gUCP73oi52^T@=Wta7Bq7&tkD&>vRZJ*#=D=6pcTMG zz1(V9Dp8r?*HcN=YZN4*_s!f8H^UxOGuIbvrrlPltKqDV+Yva>KZ_sNov>+d!L)5> zM_7f#j}WJ%6x=3J;5)MkQIUD%Spz`)Pr~~Uu}@oU=sMQRG`!cE}`&r=6qYD1ecCQf|8xYh6#-CKD2NOu-z&&sY4AjvV(z@E8p-q_tYN3 zU6^os@cCjOjvAlkTa)PXR&3d0pSIvCt`>OvwZ@I8(lGZjP)MfMOae_&y~2wj2#{nK-Q##A`EsfSEXq<#*5z;8Q_wXelooz-gyjphx2s$)5eucoy6g z>J&VW#Q`+WFK8#M-Wt%2@jtr&FnGcWGuWTB=Um1#xKnDl1x1$gm++6;&;mLZP_Z?* zGYS4GK#y|I>`r7X04Pw<=W+F6a4!@ZTzrQ|!P6OB%Do}P55s}-`{6K5uM`lOZ*Z#^ zd4Km71D8BCD2=A0!5vk@8SdWUVS_uihAS@awNu2mQ~Ue$%`@urZnn+l|`U zKBCI$3`o5ATv_cg#c-#6v^Np7OGfiO(o)Sl1o!FH`D?fB{Fi%mcK$D~nPHobJ`w6Re7CLzHKg(exsV6*er-iPUU z86|Qz_rXh0FZ@L%A2wZ_y>uw?GmL^G(prwCeS4WKp(wvVtFIMv4;oC9m!t7m%iP&v ztU>gmp1%e3V=eQ%f}X-J=mVg8c`6<&$|`%{$66M~%2Qha^L4XEZLCz+kH8)K5*jPd zZLDSPq2yTW17964^tCFA)0(g00~$~FKPMQ5ls)0Y^i1^c2w172v0O$xRI6F<-!_?; zQZ_M+bZU4Tch=-fWw7iz)t#q5Hir%Rre#h1l+mO8#J&}ghFco!hBFE;wi;-4w?Azm za24({QxA=Io7y@;F*r7M0L3246svN-u7goSBj`s4J(y=a3Xyr}j|^)5qZ%FsJt#VM zhFsAWhbRE^jWvYZ@Ru6*&tq*Q^k7DK1^ieQQjOB0$a?#NA!0SL)R?E=Q~2$T{q!3u zpit#h*3H6}P^zI+nW6*|{H;)U+8TG*Tq$rxf!-UMsvX?4BHD&1OL50cV2IjDI4V=P z&Mn7IMYWgDwIh+*%NsO{)X=p1cKMHVe4?X=r4VFJtW)7J?v**7R-ZadzsI__!tYg` zf3v^6_14P<)xzZZWL!UOaDSC;buI<)J)JVlud91?4usa*hlU+_!Z6!vd4KHiWsOk1 zsbhWf6iJlK+b=S-JmZ^VPgok*f5JY=I&tFqf`>0rQNm`{#8NVwU%DPQt$+z?0bky zsB9Sn)BbEfYze|O+4mdmb~zZ*v10!El`7ZKnHp_ydn&jm<34|1EtWluu)~wgKp9Z^ zr8M>cf)tj=_Fik&oE{KWSoAgmrcH~6PK-v+lGW2_vwa#W)u9ZPMyKndZ)_EfnGlVK z>p+t)u=^xzoaWiUKm|BmsFwn)Zgk?_`Wj)zt)dbc83mMZFyn*n*?&f{?|tL#~sB zPlbC2+0fX_7p*O`K6a-uPo>frLZ6t}*|hDphoG{$i;x6Lj4d{+SyEKECwT@pJ-8KA zk!1Y2Z%o#On{%r{Y2rci3;RL_O3CH$$SU}>71T4_hW(?XOv;xk21^D231o{~Dss1$ zYpJM##g>Zn^Da%xSy=W_M50w=)#3av2pVn$t5oQZDPo>$tkCH*h*7SwK9dJ+NVTAi zcXOEao0(ZNPiEV z7vjhc6pJe3Qtfh_NF;Ef`zsJwmIj&6Nt+?`8hq34cmVtbbQK^35&T|d!v+#GUDR~E zYX@n=5h$!$uf39wR2vMbQrxnbRo7R3&{qoS*O$>!wa@H}R;2=u6co7bDYMMegHFGr z$nMMNQM9j)R#NWSWm!En3pd`K#GS)ero=t)h+AHoQjhN}3yDqLi4}w(M62u`R(09L z3!?5q%=|2%USOs?H5XIl^>`Y*XyZo;5Gec=+L4XnSZlSFKv!a2BHWM))K8I0bK3cPth4zr zE3g@a7UceYSRVoNw;V?PLFPC8U0Yi(g5my@y&d+-aY9ae*j~wzMaC9?5UsR>NUk$k zmmZ=X4M*@bvzRJ!bl9Gje-C%)_9G!0`5l1nT1U!8T818Lw*p)qJh@*l&KQw#&V{qs z)@oJOw=(Dw^{tm{8T=J3f1gIpb^yw79z{W!Xc(q67X8{xQ>qZ%CZgpbCiVz>Iu%pk zFx}TJMs@CVvG!-e(5WI5*7WTx^%$W%vYO~EXC1dO1%$19jw3L31U~$gwwTg}N{)W?e#LVs+bbTH~Tpj{JUydRK`G5R_#WR&a+s83jCTj7n0l${R*{E)YS zpHm@kgZH#gd*W>XmNo@0DaMY87Sw)5O9VNZ(HMPIM(tHbq7MClJ4={1LjCFLv;W?6o7Y92#s1K#Uo3 z`VosU1U-Ed*MJ#UJp8p$9rHGtqO%3$V>|;(D z91+~5Z7qnAe@6Q#Ry*Y`@v14RK}jfi|6uMt$I=MOz(GyHnM*`9c*dSacfl#x$i3x& z5luh`txZXn=-O>$C(rg%voqIw{MLM5uD|4WNJZapuMAh4L)>b)k4E2iFAQ(tca1xB zw%YUFz=K&|Tq6>$z|RlYyfGDDGh6)0H1`q?!R799_@AlnPtaA4dHzmga^$uWR}_=A z-na>ef_homT_M?%X2U@9-QGe(l3hEDcK3a$>_ZT8&j;aG` zVVGFi8h7*@JH$Xcp7_?DRBHuv8j*Y7)DSi9s7$5zhXFm^NKesL;5O-|OHn@GwJ&F< zXcs)1i~&=VqDnccn{lN5)!i=JX)-6bO6yzfrC^Vx zGQtER70uBX_q%%a>9&?wm^sx%UMjUm`&%5Uv>O6G@l2;K7gi=`vo-XKZ7JQF&V89M zXkIV{2OognR)dkLiu3~RARD=f+O8!Uft{84w|!q{n=a)Ymo(f5r`+W_&&;F^qgzQi zx9`P+GV7S9+bo?R&*Ojq583W1$g3OuqOKZ+#7f2^(Q#f;pf)j zP~vqBjz&z1YO(!b1G}TR@gM5m=WbdD;P*f$3T4W(sV4Cx`T~iOUO^TU3pk< z-Z0}-%#%0K&1&FTWscu`1-t~>u$vBnO(or^jBwtM$=Ra{au!K z$ZEcHBc&AvV*L$p4@h0+F5zCM!aX2#w(sTH??$liRVhp$EQO@a>k{suD)3f~aJ8GN zznI$q&y0zUKl?6+Z;TF&*OhhZ=aofgdd@93@@Iv6n;S?F6KvNiC_^o9ec3!io-XQSJm$E zx)yd;%Dv*5v9OUM7=#J5%XXMA%v2c6lMJPj`f$5olzVdc#q3CY$n8D zIH*)4BN(m`r5%FNuSo9^DXs!E?&q!SM^EHT!EwTZ_E;Ir;NC(Yw^Q+-Q&a#G-P>{} z+T0xt?Gc{=l9R=|k^L@T3T+^@t52+&&733EIHYOTtgv_HdmRp8{RE_`ut_j}3>RlQ z6heNhvH@g@jeoZGJRm~z1c#{jGsKlhxJAUAA{wJqG+F@_<|#kBzIe`V%a#b+L)`A5 zDdV>1OH&j2E^yGTtfFDJdXTF-{1Y7>=j@c74Ar*1Q3%5 zL$#$Sk&NyHk1)W?icvP;$Zo=l$T~EW$P9tXHyy{Y-_C-0VZGd})&Om&5W$5!patt>ycGiVCDW z#vQ$Ay=}I435aCrxpWM!$~guBMvm2a5QS?{s`Wn%x%AGVYwH^sJ^_XAOj+_R> zGILLxT~u0l##-3qTi`mY${mg`j+m$MZXH1bVy&MYgY@-CreuXXf1nP$&-YueY%mtB zM(c>6?AOhVthYoxg>Acb228jPX?HOb#fxy>WIf(qUkw76EE2e?+yg)WpFcl=-{njo z9|AOXuZ{n3vy5P~fR~#Fpo}8)!oP)!peJ&g2rvk|#MvC}SjuB3#h&M+V-wrVUtgHG z@%xRGbRHrPgM*oyKo}7Ka%!UMmj)OnFYdrWU-uEjxD*_pTnMG`7fp=#Zg92A4ep@m zVE8o1uxCZq`59kiXs!XVbMXDf13OXq0joU7Ds%YK+_i8QrUY-YzMeAwm1=h}EJ6d> zXDH$+-ZbC*qqfbn&1>_qw=XV-j8zSp7j5enu1{KDX45 zLEKWeH@+DO>n{z^59{_E3KnoBUPn;Z&nou}g}~U#4MsU`v@ITxH~*H& zTep6oHHjT#K_0F1mHP)oJ1=kL1X^bFs8Y{E+C*Bacek0HwIsQw6p)RNFJYYNLO-F^ zITSBUC??2E=s8ss7F8*)H7%n~@21L=;IeKt+>vRzgk*qcr~GHxcHts%IT|P}%yO(J zMU_6m(^J36Q_pX#p7!^@KSc(~`wbx18W=wYlR8n#K;zr-A2hSA`z`%tFha}F_YFNq8>2(Lt#{inX8U{T! zc5i21M1&&xEQ3XodJi&?QN_8V>_#1nF+&N8BA)*aJ$^MOzj5Xff}^5+NJC&RIBEw= z>C;rp0mxE`r8AgePk->BFr)lg3j? zqGY+uJ9kuLevT=G3lrYzqDjnEvYSll(a?NdA5*-X2YTDf@RZwvP)J}(wZnesR%zl? zY@%?p-bW*wieg&>nC`n3E54&G)~c{rZ*x~B+3s3f;UXI)+#AVR0ObF9`IdftALzWk z*>i}37XjqRjoh%pdORxhxGD5_WuYDoI3jR_2^6mMcejZpqcIfA#`5a8*#Y#zhU2kc zw#H=CG>43*xR=4xGAY+0lmq`jgrt}1A7z>x^%MeR)G5O z!KpfKu?&#Mc-5OwomomYF&!EUvto#j{FSxfoYt4D%X2m9Dt9`HJn6Pg?sy4Ro|ikc zb0Kgi3`YG8CqEC$spu4gWGife()ipXs#FQ+9NLoX3>@Vc!FG|n#iV6^PoMYV z2e6fW6?I6NSA(I8+`Q>OUI0*Et zS-F#V9R`|NC^HID<+u|%4@N(L^=?pGGT&`xgHwY=V6y+Hs^0vT1|1R&nZzp03deu5 zIg5-C=v*~tsKkzHLh7}1E22BW8(1YK2Qx$Cb?(+7G&+bSzMg;<(vYwtdBM?h3!t?# zpBSa)KIER$WzDc?C@Lk8cCd5-tOsTx0!y8cgq8-nm*yH&<91GEy(I$Sx%o{rRO0?< zolp+Z|4d^6#h6eQ&7(@(vTqgxYHM{pE2ma(SCRBqajRE=s%q72^~`;M_Ww=d6x=IH zNzf28*{Q(<<5_>rlq)p}gUpx^o$k=QGs}L~MH2y|%!g?E@`Jnt#kDLp$exf~=wVs3 z*@uS|YPL3RR*kpn%(@a?50YbRv?HTdh`d>*S09mH!Lh;3ICuT$&oyiq0px(^FtmIK zn>NS0h!2D;?c=_j2b8>D53^@h?uU>O-TsUK4J5UV;=pTgBiHMptgVG7h!?HU3w_1x z+MWo_v!>UL?u-UCv4fxXtHq!xtOM;&DgsSgD>F(YYAMr}ic36kJ?7}TM`%dzr11pj zU9ZB?V?86(Tkv|(FC_Z(RE7^-e%i>&|8QpxZPa`SPb>5@Q+4xi8pWXn#3rQO1AVv* zG79*LpFolVN;HSOl@m^1q2LCQ!Vo%b^zKFI4m&1h7X(H0ep{L`9)G205Yw1SPl&1- zB)H%pR*t_*Bh|;42NaT`oW_XJmuSfXTnGop!h8 zxOZbnAD#Qi=fLV3py_x^x9OmB4pLZV)4M+9Ih0rHEK8mhjI&iaILnzn|+L6=A zE~xz3hn>}j=1MS1Mv(0o(0j&z6HDb8e>MteNXqICz&O@zYE6ZafDh-zBe|z*NKy1s zK$3DBx){kQcb-P#9*f7}5f(%|!)9?}s%#rEf2d1R6Tz%;?gDRki3b7&%6%NWn}S=* zbv1S*c~0U+JFId!3HZ;OP@Yw8M^pXXEem31;)a@_(Z4c=uDAhVkq)0HZ7A>ev2*lj zto-3R&|(Rt(4XnUl%6Ts)N+>lSk)5ecJhbD_0}j&vEjfqJ1~B4WZn*pa4g%l;VL)mG*C58tJ|#e@&Asi@D}+QV0)<`IQ1D<8aRcU&`<2#9-!Mhe z2c6na2+ePfWSTSz_95%JVd^ZEaqn8+?9($TC%pb`fz>ti54+FXjz|{{)92*D zfRQO9)J>QYClgymq1PP__snS|1Ci)Z9c?c4yT$SwgU!qwZ`*z*TG%q^@k_GFWFww# zzjHTY{GR!8qBOL6>E`%&{skiLUeOSamQS<=Gy4Wy%TZ6XcVjocR*UL)jk%B*4YCLB zS=1cPdzZMifmsr_9ClOKT@b^Z-4>!Uc$P;v?l+-(%5Pu0)m8;}vL>f*w#)31r5DpT z#5jFq8}VEGT904ugM@iJ{tPz7)alenWkRnh-PlHev4x~a**{&otJ!)s65Uy&O1Y;- z1b;oeBR};6>ldYlkyK=rV^tAf}FJ!3)P|TF`997Gh zaz0MP=xX{oG3V)PYK%H44)G567f{%cq2|~I(2g^{SV6koT^#F4cSg~};La#gV3Tz> z?iQFN2)RAcV9YjLc)6c$LAVgQ{7c30o64);QE=4K|Brau`4vZPZL&?Hm zS&Wt1a$@ z_&rg-hjEpLH525O@C3jD8+!f27(o2K<}YqqpSn0x2th3~axy?Cs(RVv2B--Lnx4XX zFyD+Nuy__i0O&75xc{(csP**A!n9HkCtvtR?x-;4RS+6&GO%GE)r31NEANv^HS|-~ zsvG{1U3$v=w*QM+tD5#&vbbrN#S4mzf=tko+*_Om_g^|efsROWZ_i*ZH~splf_GR@n2>ueGw1#++(*TU-Mu0*}C}~{#!OJ z+W(b2Qf;jaqq0vQpEr8vU6mzj;cTAqZ_%Dh+ZHX1b8G)M#Ecp@ncmw$U^ z6H4s~_UsuDsZ-9n+>B8^-P4ozVdgiH(@VC~Rgt$TW=s;PP4yrr)hQQD#(+P#87H?G&!q3aPO(_8k2+0_ zphvV;D%?Fj8>QJM?s-3hzJ4Fn1g+7~j9Icbt!*y<$=r1|Bv_-z6-9)=&t|whHyGbG zKbkFYwybSCHDMY+OzzVg(#<(#qmgoNL?fHuW|JAYL@T3_+i42epEl1uGag03PMQ*( zOf9{W%v9+Fy(V2wP7F?R1w++(B3MTwSIE0#q#odKARb9$&7b7oqnUFwn&CO4S;1;D zni)14SuO#s;TdSff_@YoQs^s#jVgey@hRfaFsIJ~?L*$$)X{Tlf$|~X`xFGCdC`ct z&)D$J=MW`U^_I!j6Qjs>^rWFnz^5=F58kdOl&yc$f7d{tpd$kR5#>>!QtlV-Q)+D^ zvkU{HL6{zb6jDFb>=X?nV%9b$PoQ$>=a6=!qPQ659y8s|>gq#s6^xJd`j4>olD&hP z2|OlzxZ8(tG~&3$n0E2$qq-@^isa-f$cBUmpBL8~?Mi%@Y3VzZ6(Xc{QPw4-ic7i3 z=c?S@oqgk9Tozv3WiLz+rT7(Prq^nWriguQ^xa59rS=iQ|3t`}$c;mP(bxS%L~EqG zs;r&&P10n$H`JIJKAUMZs-NRY0BgHusGmN!(}Uc)?LXZ`!4CO2&_n( zn98pE?B;dTE=v|nnLB48nIm`Ww&>zLcj>N-ap2t*(x{W1)RMNP3+H=2xG;yC;MWq& zE`0LrIXZI7NbS0G@m{+v-MMYiGGlO9?zmuIUVcIL7JhBY{Q28#MOT}ttJ!+6S2oG& zUJKiJ$XgNz&z-Xr&V<~wi|6n_Sy%nY{$=}_-{S!T%YHLP-&bS3cV?D>-=Z2n7B2Gd z7VffO&XPHc`2m}j6cl>KnPz5RVL)ev_Mj<#EMCe&WPkc{;u*upbJ-K&njb>Um1P6ve9X5#iqn_adYe~r~9uQcIffFeop?8qJG0YWr&F0 z#*O^mBn0GMNd{*9WT+r+#0)FB1jGxLOe2;AjhFLemWa+**Z62C)CvKPOiH$}bf$1e z*HI^n;R?6Jlp^FQQQAB?b`y6~^b@KarEio*6VnKN-zh$K#3#ASuub+9&}eUecQ3IZ z%g{(&<^y&Qa%V8({*C}Z3~m{>w<6p=5NuMe>CIyHlR4Yv?Ke3aqaTTpmt$?>!cinAX8G&ka2*G~`$i^2BAPQ;RM43!iQP@WJ z^nvXV(^_{Cv{E?&1y2mCZAy1>rzicGR~F)`$&jSP;5b74W9kie`ayE$axZfKg8dG; zG2L-q(IoAc&aKKccHI>+IwsYfHwOvcrd)Xg3K&@o^#G>-s?ifKkq~An_Zw>oWu4%w z2n<142mIdc(6r3y4W1LoM<#8aV_@QF_pT--m= zh}3AY>s$ijyF09L+-_riP7rdxvOl90E@~1+l-ac%h2M^YijQ}hds$imoLGci z|CX#5t~_PV8AigfJ3%UY8rrAD4eAJ27#`h`89=G3nReUc^>cO6@Y(PI-fSDMx)v$! z+*qt)=$CI;eOD`}v9`@z)q|s{PII?_JqH{=r@7bk(KHN;d$13PeKDyms|bT?E#Tq@ zIY@Luqj;Fww5UB(OLSYGMt`6)>Wv3rbf}5?d+h8s;%e7!4=HmRsp_$je2oKNMbXU1 ztCHMq1Sexbg6$5uoy<0TynFP(a`r=}tuaJ1U+?}IBUE+zjl>Ek+j8IYtKwTTguVs5 z60X6E`MT!Ak{xdrH7Zl2F<>YLQlY>M_v?egEQOr~N3ZBg-Z1{nFirQvY*G3p+J`4B z0CaMyJu_L|5>-GN{GjZfD?6yf#Njoo-8KXlG8`T6uJ+;h>fD{S>%ye2u>G2CAOH?# zObJLDh)xg2ZQdfHuf4icu#A{j8;#&1n`a}^U>MWWz@#u%k&{p0ublyK*m;jpu)?(jWMOuNYt7KgQT*E~ zy?rP>rC8~mLg}xmbVrQoj}{#hd0}ZDH)+^=hXKMjrCAW=B_5@$ak-GY+DFH9ccMQh zv$HbqMfF=tP#Wv5Hy4RIcRlYaFmxsGf&q*=Ooy_$BsN@X-EP6S`~`IOb{cOwn25-P zFDq!dO6_{hhiTJWi?Q!dul|*Ak=Z-h`hlY^^PG2pAPfi=Q2yYdCH}N9pi61FNMqlQc4}bT8(!Xk#ixCGb;Ys zKSkg?0I}9nIUciQQb`SvseM``^x(2Bp^f*VGIV{$eIc2zxFSDai2J)qhcMVZ5a^n^ z7Y)0UzjiS}Zr-8=bDHMNX{Eu1yEW-rLZWTcBJ`D0cHOIO{_I$)ZCZpD6Lm7;!_xT+ zx{}j!gpL6l?7Bv$M)d$#IId`ie}ZBnEn zZ0w~^uDj5jFWg01S>&$J1>e4qe8yOUeC9{h7G$uV$!8`VX73ZSw*VO(KbJoH?8}Jx zmzf#g(JK_x)(6FRSO8zIkTN`1RNF1cZ~(&>4jm?Bv|V>uGRFj3jRX=GmF@X5^4eL7 zn_^79X{EUSIFw$&pZMVNK?zx^ljEU9Z9OsgXKE&cUHnic8 z;Z#DbQig0I{YoyB0ReJaU31JIe#_F%{ zMpw0Ru>a{R0037rjGWNOaVq0fJt-Oi?G3Z%OLMw~^zrEN7;eTh|4voBpQ9b|qJi`) zLAfm!8LCv-xWW#fXY90t!hO$(Db@kHen%+QZLY|xj20`>=Sg8_l<JzqB8{=YH!gv5Yel7^kayMH~`jb+Fpc z6b?IHc5qMhX{oK7yORHq+M=|#Ta(jR%vJ=};rE=0I%Xf&E4hR-B=Q|;O702cfGXT2 zW}Z~(9_aMjRs}3jh9nlJg6eK>iN~-87%l8zPS=<@PXNS?>BD4J7V-0|_VW+{dAh>K z%`k9lzLMWi4%A|a$5MP>-_0KyH4N?FjXQ{qRzc_kYz16i9SqPs?wfe5N8?-St?_c|NSabuWQ%Vpg8);NQ;^|Ql4Voz@90X&KIz$;~Z2bm?_a<%#m2{_u1d9%6OKx0n z2p6J|R#i&upV4N9JCqqLJmkxE;~V86!?xHxMLq!g z$B>b-Km+C|LX0A8u#i*}hiFTo2DV(p?4+UNnU7cO@ENxUZUMZuFEmIP?rqJma1W&s zZfqY*$A_b17Ro~qM7@MP*<;WDv2>9W;Ay#cJN!BEMKm@2iy+@nIQNY8>K z0A2RhEhYz0>}F(zmc!%6*O1LQY~IIh52Rd)Tj;{Dg&ql8DEm8i3k{A2?h35Hc5(Bk z9wdK;6arX`!BA~hYLGiL#oWNR@gn;fd3}^rG$I8o%J|mV?*QVNyqg_8#9PLT} zF!3p3TvIAX+thO=c>aEi;L~>7&GWyB8;M+N4s1a7-eqyHQCJWge!dD!*hCXU@ zuBrTC&x-QQcI6?)cbRd)d3{-O1hXHgl;qs!5i6t~+c3r;3 zJa#`=t0X!9|IgX%6cSIqe6~7!`r9m4Q(NB4YYFiwSKjgh)OBwn2AsqJ83Y^BoFEDC zSLVTl>r+zf_>z9UXWh60Da>+MB>yz3KCg)KCu{J3)qxrZ5`r8jmb*)aM~r_gpj`hdbL*zt&_vLMS9=KtN~^alq! z^4jP-n#>gcvnl@NnGamq!u-W>Yy~Si1wX^>Bn?DU5I)8#m@0A1bvB#2l26kHCiuP3 zx%u+ts{^Hdv_UzEaq6nqD-fFhx{s75PRbgbY9O9~o-PC7?`oXfJ#Cu^_>U^JU2v{k z55x)f3@;ZA#OjK_Ezx%fl*b~wA2;?*W9Wqf&{q6hr0s#TB+a5hg~P?(WZ+bZPTV}n zu41%S0WOdh(`vghg96CnuxDGfkbQ>YI|S!i{Era((%cq2VM)a!M-TiS4ikn;JRy6m zakWQlXCIUzVKoiA8{y=Y@Ad8fm^%bfVlJnUh5e6a&g5+iVe4m zolqYk`WWg{nbCoIh~Vn+H~R~sspWm8UjG0Uz(peC@YG<%By=xR$Md9`BNa~pM%K@H`=iINawxCB+(xXC#%>%YQe=lN zX++uvcf$cd$V7f!iwYFDQv0bygk=m9`oIgVMFy{d6JX<)++u~18`OI;batX!3#%Qq znb<~@Mh4M-5ZT1t#CDs?&0m_SK#3kiWiI&NW`kB_Nq3(u8q1VMM*17i$GMw`|5fMS z1tG?{qw%9FXWef{^b+tc#*bM-Y|8yyn8IiN%Hen}fZ3V}&Yjk5To0GcLPj7s7hWec z5lI|_Sh+{S>~8w<&km6;J3F05Oz-wEy+3_9FfNSxO}0LBNx5}jj$wOPzh`OLD}=ts z5PHT4FcE1Kq;(yBDq0-(Vp%KGDn>CgL`QI_b;qG^(*Aj=%npbi(M{D|)I|X)P^CrgL-(5(2D37S*ECFt(2261HCy|VrGUO#mjWT5Qu4j3>YsHXc}yjM(SSta;$(xopNWR z=-XuHe5E^+h{t;N^Z`bVFxk>{I*jY&%ag`PnXb9goyBU5b5HFLyUq93sQRpEfQ8&D zS4M1sW&@&&tb0U!;1l)f**+BRwbpVtvb1iu{xU`G5mfl@K8B#6l2927)1)Mx$}UzI`d=5>9TxVi%Lc_bS%D>-~r!GJ2dfCei&J5Hd{^7wzoiu zlMn8|lWPhwk>ZzfI`!0j(|%kL34xA`G6+Oq3eOFHhfVfz?15Gx+^BgJ^{ZE+FO&++v5TSB-rD0$ueK!}$;PGX}oe z9T5qL_H5IBs9bG`N0J~yV=Od_ZYBYQ+{>tdHHp&>uu13vL1oA9rilPRqT-v(iDjui znV&x51cQiD<^;%S9o|2CkyCSI*abQ1Kbc9$TN@Fz2!pv(7qj;dte{$awRs@^> z8PRvA#yIlFu0Rb=j>Yy~z^cLEUcyuX(9=hNyT_Rr#?%tn4OKcJkm?v$Pzdy0AP_?u znRfTWUI_4)neKfgzx_h+TVhIocZPN(Q+JoLkugjB#&k_z$BBg>Z;h10kL|3Gbh`)`Yr-r!^rnnl zjzNl{Ybf8gtOk3W57FDYJ{$S_{{kP3|28X|d^@4y7DaY@kyP`eZ_j!*bZriU!Hnsh zrR9&!VYns=<}fmnDekVo+iu(yP`n3om|$2Va~L&R%w2(ZIcoVn|5*F3-NOH|_Jv&b zwRgM~+n3L}?jQS}>$pA_<6z|aoC!TBo#q#(nE5dNyJ1Q9#+6MyJ3#)cY%qI$V;wxu zcVkV0m)6eQQ7>(4ZJVRpQV!+BU3Sjxb@I}B&pC^Ob9;QPOvPLa&VSrS2QR&z-bQDv z0}|KLxyA(lxTH2mMNBVtTeML42T|dNzmMf&f6poN_mfv9|MuK#$-Hc|irsK)+$G%V z_tb{=%Xdkgxth-2R<|u|3)9ZpDR=-a*lYgMHvhHI?e(ud;`VxlZqU4$>36((<=YAw zQR%+pjr&vb_uvkZL`OXKzI(A%qRJy5-ou@hHw7eoI8p{V6!F(^&-9Ubf0bK^Yd4mL z$HoELE<|jolCd9GS?8PI0!g)S8JjxGI#4*#;15VH)0b$wmT*Wmq;&_yT3sw_>+K#> z-uwvJvhkA!MK)rRP~1&e!BF)nN_T=_?*` z=^bYgGgn?WL#&Ua4~fl8^1VDW^qKc(u%6AbKbhNl`J`e_Sw(gmIav@(nrrEx2VH0Y zw6XjknjF8~sf~b<_0ed4lO2x`zKms^$#mERPL)k-l^I>i%mA=Uh~E)gG+=-fn;r}# zDyn5YNO%pt*0T&KtJWf5%d+lS1Z=y$UoBf-!dneQt06~6ZwH`HN4BJaq;li&Hgu38 z$UubSiV9TA#j{yAuiVShPJfi2nh>E%cpF|39-miRy4$!aP@mY(atT~%p~8sc#%%sW zkkt_Fn$(=5M%(CZ@B_G;sB4*;#`rlz)Rh6Qw@)6NiM1hEE)b}o}yC(01#T+Q0aH5@&*!+nihb#dD_m}VOp~+ z!qG*!9Z57n6yO=mGy>;aD3%1&5Un^)X-vX{VD$kCccS&soE7Q7J&aYcd7S>RJ!>9_ z$4|9u=rG-7_1tKTWo~3Uk*2lU;l*s()!b0oZkv9<%im+$83%yAqYr73XuoVI!Z_F& zmA&FpecWqOjM|Gvp1+T=h3j+4e+|Rd9XIq}#?SSPS?hsM4Zbmoe$aD!!Psf07gfx} zFv)erN0Kpb2{uhfpC{#ojR__5#}ULbTm}zelc|QCV7K;#s1-usf~ z+6w6)67D+so^|9g13s|Jv=!1O#M%mm6SNg(z-Y%d%w-pP3(9q)w_vE9!z`%zVtNbS zfhuNMsIR-k5f^&O%Vk4{^~i{@D96_;N1)*5!+;AJ-Q~Fc%vrL8XjwbA#RigXiq*is zg!N;dtzx$k&kDsT>s@rQWK1z|AC;F3Bt4J!1sJ|~*LbTv9IKWQ-J~`4y0S1{<)8vD za{Q_aa8o(rP$t9$@Xki~QZqSm$;60;y_xAcw**yufo=kVsp*Bgg^fOM&U|DrUyp4} z$QHgc5^sBW=cjOQpKoULTql;dH;kR&$yLRn5nc>TL5wpd$QFLA6=L+hsR4cxX{-4u^U4~&pARg(_W#KqA(>m+QT|~5G zae@ymv%dN5IYWNO4^&{RdxEqiRDqlNZH2r!LYw#IvN$Y-}=Lh$Lf<1 z5gqQ_CQe77jbx6Hw_)H=;Y9^ z@k8IpnX z!LTjHNSlw4U0>XdCC=f-f^)E2+AJH<+zO~;I z+P@)m()nbuPB>d=ozqdB=z#Gtima0hdfdswrFU{+k2`s&^iF==<4ztdy_4VgPC6ZG z$}v>rKzN|^-r(KTZf|(h99`1RkKV?|)JeV*tdT;@yVmP9lZJ;j(< z8t|XEOtZIh_w~!=sSQ~s{^af}ypmI)bGqnGJ&-Rt(Zh+|_wZUyg%i53@YkFQ$9GYo z-E-`$u-jYk?@Q#gaxrOr&(NQ<^oOjB>keumXw8-iS+;Ev-ahdDtR??45)Q)4OGC?k z3b%w)3BfaBA2V_Y5YvFx@xC%$V4M{xj)5q(A8(OR&Y6wE8N(<=x4;X27BZaq1>ucN zus@8WbRLaySCJHuv&cP;K(wX%Pf0~2Kfr=be$`|WA*rs3X~;Owk>iy|DR;K_9gEQc z8Os-;XFRnDfvYdX_;3qRTQUa;SMws$w^xwC*Na;Cg{h@WJGCTu$gYlt?g)c`&c&sCyIf)@YJj)f(x(lO z5ug^=Upm)E*26tQfiFWmJmN(bT9!1a}NLC>?>C=|L~sp;pK^kPs9(;wTCK-0+`kfczs>ldho^#Yat@W78`RM z_dfm+Yb@(~dE!&&u&)v@IuCjm|Cm)XgE?kIG(0c3-#JdxBwpN)nUt+KUEDE_E|st( zMF21yU;~P6o-i*T9OMX&dP@-41(3l2~^?LbnYU1alasmL#bM6T7 zAgxUjXD%q#7CdnbX2!T-EcKsIZQ&d6;%bg-B)69hvtLW}6_9v^_dB&kI_W2-Zt3s- zN=@^_)W}y^Z-M4pm_x;wG2DBDa{bd!5w^$bANiAH_sodJ9Tfu79bLSYcgEtks3E$Y zK?%2M?gr*dCYIC`B0uVbC7EmYUJ}c>JtFX{=z`mOBY}rNsub4Rr!Ll*Hg~TOzJndf zvy?k&vB7+t6hhcxzE#x`)%u)<{`zm6Tea9Ln23f~#b}55wYtpeC1)Hn-*;Cjb|Mrh zHI$uK(JE?b$?r5o=l#G8_1v5M~v;pxVSL>Iy##OcKNF`-k zX0cib1o0yc{}zjx<7Tqi<(61sp#=5W>`9j{jAmMpT3t60%SJ-MVC%WDHJT_8%{2R9 zsqV1a6&hJDkZozi(n?jPhnb+1Cn{A_Vh;zY15m#6an-r%?sQ%M1h+Ga4{08apYP#8JrI=)`DyKvUt3 zs72N%vDv2>#@JODV{5hmD5C^=PyHtt5X=d{pC!;fGPll%#>t!5m*G}YizY{bP(~4R zrp)jj$G!}%$Vw43nHS_8`s&n(sJi2uqRBopWK%Si7b>8d8k%l~^{L)8$9D*H6A^uv zz`pf+$fvsg2duDH?dtT=Is+gQnN_#};Y@zbNH&;Om{6WL&QN`j5~%^fLEF)h?ek}U z9DKd)FrXNI-Y|;$vv0X>RN^JBVVi-yw!(^9Zasx~3K^_(vO>`c3B}x|jl7HPPz|m! zy#oN#q-^~;C9mZ>A3T%KYd@me*h}5eR>)TwQ|?x1H2Z}o11UnLZ2@^h)W3u8KQJ0_ zCp5(lgRF}t#9)NmG`cl-6<_}|^L4|+mKPJ;m0Rlmb-250=f>b(!(-6w>Mc{cVCP+h zJNjpG6x~lJ=xF!RXqiRhF0DO#h@Vi3H1(n1ee4q&#E`b(lGgFSUxLdUs4?2&NFxXm zCv4~8DUx!<{F`}|od<)|UHV8CgT4GN7T3XNdYHQtFBj3n(e53t$<^VVOefh33ZEyAxAZzC$838Gk-`i6{M_X)gAIHo&dhf&ilAX4Gm`Kp^|M zwsu1Vy5EJN`vaV1H^cG=S&f`T23Yf#K@ra$4PoquhOmIt%Q|Z_#)b}JhYKkf;`^gn zaLghsb79I|ZNsGJ@97brS+p4BAPVCYcDq8!88`rFp`ZJd2BNv?#-q5JjE`8mV} ze=Y-vEo<6&NpJTl*MV+5?jNP;7>lwadG9SCfNMr$^ix`gyP6VJTIjm+*yUdYPfd7A zAwiRKN^v0oH%Yeboc+&@M*hSaDMC7%xG@^7A_|p0N?%|Hea))$JjKDPjYfO&2TDgZ zo?0q$R09W7ReHq=o6?!NFafmt0kf^N90fcn%5cy=@hh~p*0-!fh;65c2ZSZPPzmyY zYZ^i|W~Q=7D}p!Y3|wYEabqAXNz#0vQs|~~C{K*4r$zlIM$uMEo6`>vNa~>X%Like z!4UhqW81Wg$Xh=c8a`wuAQ4HMYr{XX4Y<{r@6cj$?F^v2Upt`mF0@L~yYT0e#N3ZphbX>!J|vS|t{N2n(MffDd~ zexC%qHXk5obx*O=m_|H0ce`{0T?am3n)oLRw4VpMl|<){Tl>gH($&OM?l3OND$?a6 z1WudG)U-QwfB|4f#(|4hR1WIsxQx;_X|5m>PdIozp}03sKFRVnzvG-!T zVe_|`K;>z*hk#|^I}IML$oh357lACObectvMExz5BEi(O8ajn`6s!ni4I)%D&g5x- z_XzA|N+Isu8H+di0j4+zeqBocrlW zCr6P_W9f5tk|)>WA!m!Qs@&a72w?-+_4Bk=I&}1+!m@(fi|g`U+{#${69Zi~T#RUa z-s?Za4PKM?;&$rAd{xMQjYy@2X>RTg4=eFn zMo<`j=H_3Pa}1QFxx-J`UD|bN3a8wi7O;7|`|Yk9v%8575!-h!yfr9vjp6&Bx?jGrO3)zrpG=@}~@kD?n5 zz=0@c0GuS?GX=1;dk(BlyUSV$TVP7MM(KRlVX0?^tYu>0o{Lgqw_FD#Ev$(w5Pho{ zQZn1SM6b-2l~(KB71+rRXKyMU%9yQ5@3e>Lca^&xT+#s~Vb{p`lILXWh6jRu{IntM?MZLyOCh-xfTQ{8nK|O3h zW1BRRkqRm*MPqGky^dS)7HVB|SD*2LI|kxCSd2=8S|z{6<|15mbEFq00F@z3@NF6&b|6dd!X*|X*5 zSB=707e55g^}13k(oO`?l=84lX8$XA^LC>d(9x77>7l5qdt-k)(1#@Hr$kR70GlQ3 zx)Z43c{d+>mbdU^*5WT{k=nI_OS^xxr#g8{fu0eO$GGLel4*IRPdji}`2CStHjQKD~PY ztV!<|+E6g1C#_H`t#SqtCYjzwu>~a#@D(=R59wSRQc#7Vw9ist;P_YtIvi{B{AEDY z>vtLL$NrK@cm4S{S$U=q2djA%;~>+A9cK1he*^)2(rd!p=u>|wSIFE*ttX6`J{OGi z$hY1jW2Vpj*d;aQk3G*u>E{!Of90WXs#(Mg>)=7d!kI>!#r5fOOJWWaLv{@~*@s+qwRM|6W^^GE(U2 zij*gR&d(7MbSfI$TCLcZLlz&3>o? z6vB<^(VctBl4_>*4w#*CSNxIzdmch@BE?JSb5MF{3#W~vkF*j}<@Lffr;+4Lz8`YsU}?cj?W@BT zXuNkakpE4*W_8RE9G++^%FNzsV=s-B`M~r_T>wq?t)PXm zOCva4Kb94F^#c$t#L}9DvN>%)zZvkQkf6#yVOR~Y7)u0Y$~}3o&GIP#;?jQFI+!4e z`5W1uUJuv&_`a#eX^jCT9z<8<4eTiW@n$Jy;fesY;@)XTwcDWilHE~RJg3Sh9-_YR z!QB-8G+B6gH-$e-7XIA2FFp*6{1etLpLJ7uxq&>)@Y8MzA6)K%GBFF3Pr9kno^1c) zZVInR7XDi|g;ypEf7DIkLz0C*?56Oc$-*CWQ~0oC;Z5BXK0L=x=>2X=ACXh~y>3b$ znN#}RZb~1OQ+i`JrGFI`9<5Hi8{X-r%F#I;yxmRdV?qas?e^R*AD1lr zMmL35bw=~oyQy+~vi-kyQ}~2r;n%t;d}0{Puq^0b?WW2}p~~jjDz9`?<>cg$Uhbyw zDapbwbyN7%WZ@UPDSTS8@C)4(K0OD+p6{mg838C;XMyruH&s@LDrk3NtbewfDr=Gx zc&3}e9ex5qmVc_7((7`j`89}cVR(bH3$dY_Di?$*b=fKpcT)xK<4w18{aL52S#w7Dzn3pA z-@@%vzU3PIEC1K>(PxxzkuJNbtj5^Km7LfaUg5JI3q+rbK@q3kNmA+7{QdJDck)^3 zoh&yVsV9c~pO)H*aog@->nO=^>v^7q^CzJXG4^_GjF-ODbz|Y|`)Kb;A0L<6N7}9E zF|httDzK1#dfdrJrFU{jk30FW)K2`899nQm5DWC$2#3D7w@P1>W37i?I2yef`s(ax zWJrcam?3eEFjgN4&8N08O#g8OXOxG?ZaV5u zc0!M*^jhhioY><|UM;RV(3JzHvT9wXKiT&+C1^GvC$<@@O9 zNgq#_+6S?PJk)xirhckaU~#WrWNDJLZHO(Clsx+49xJ`KbBpxWg=gBMrT2DT?|XZs z^xn?5-gktxt7=5!eK9T;;t#40)gNOZv@;X#&3Bg$n#;N!H8y}6Eh^W{aPR19xWDf_ zToK~LaBnVkxN0WtuD2m4oV^Vs+I5LOt}C?7D$c$DLeVdMCH{xRc+P-pL)-N#R>Ouqz=_TopR$HFHGlf*#N0%2H?Ix5*!^qx@}> zM>(ztee{N?%K8ymh4b9a?pSlStL!NM>Y8(<$iU@ksm~o}B_8PURDbgYrpizr^b03C zklAi6U&Bp0Gx1o9(>n-hj zhEujXYCY<`KJ&T4y{R#~-?lGy$8GKFPS_sVUAH~bA7KyI>-HCe_sk=6#PIJJtaLXO zZUu2+vAwqMpGLa&udsV(E2evLeTkJ&70&L<^+?#0=>xZBYfVOQD1~BM_Lq}4v?u3W z=PGZgj1jUNBDCq1Wcic2FaK(?{E6L{e=S-5gzn4#HCg`n?#sWPEWfJz@^2)|AJ={P zH#bYkaVcY;Ag`lA)2XEw< zh+sLOB}rHmuJQ`@PWlN2O(=r?e^rx)A^|yd!;nB3k1Dy{oX}%E{%a+)eqxVXf3<|x zF)h{XdLWg(QbOw|_qg?!OKAO+9=HBduUiKw?CDdjhXgw#VCCOwycinq%!gVdp1S1O zx}MhKp})}Up{L#HJ#PK^5?VjQx87-2brD8tjQHS-= z4H7*a8t)Aftt~!unKUO3z9&l@`dI~sp2vGV-s_=zxSZ3I#vko<<2Vp`xO75L50nHs z&vFJEN(9ga1?P~*06*O8Id}kF*ptQ|DzWij_oVR$OKki%J!$-b5*xp$Cyn1&?a3VOEnyD7D>8?q z;yrH;_w;%Wm~|HECTTC8*UjA}baPpeZn{{JyGrQh@*>?NftE+E?<}F4tBQ2vFG4(i z<#qFiUU%d1>l*8-n*;5((0FeSwDm>ipqK(}?V^_xm) z{e~X5eq#x(-&nl$!L|k&HNmwdw0>*x*7LUW`Vv~dt;eljQ$p*1=yB^;m(cp{zV%KV zOHxmh2cqAX(9Io1y6NI7^QscMxwA+&UCidn61w?gk#0Pu7Ccd}=yf-q;{D0G>W1Q7 z9vbfr#k;G>9Q8;pL^2yB_%d~U%|$Ow28Z|U-!Ck40b*AdvL5>SR&9LE;w|pXkzFW^m^zX z=o<<)o+oRb*Xzd9?okhyPQxqqZO0OFy zLZSyy4`{;4y@m@{9zAaTq+Yk~0rP4>z~n*w#1a7Wnjd;6qR@q}`w1n^;jcZJ!|}bI zg9p&-J!yPZuNxu@a{3itiTJ}Ded&R%zh`%1@})7_#Dw|U1}y&ll9di5IDuj6cf_zSN! zdnHUa@ai@v=DzOQRLZ@-e}_dEcSn%NkI;v1p8d2x_*6Hx@DRf{9N85fLf=-XSlZ27 zZ^irh+WiSdzPQ7bOzu|QEElwR!jK}b5W6obZ?@P+m(14nY=8IgaD}|u-l86^o9&|>#=(ppCKRLs zgDFbZ7JOC^K1RQX>_kN(VCi|vJ-<*xw*W-=f6M=OHPOW@7Ff~EbBaFKspy)xD5*6k zMPDV%ceB1I?5YpL+DyQvhGch7b!y{GwXu_h`5Muzsg7)lMopxR=4gbCx=FXh*5*h) zBSQZu*l(1c;Y0s4rQJP579xDDCOLu#gv~^d`cG;MwgMyV2@8984Z-kQ3Gv=UkQyH{ zSyA8{<_frV^Pe!6Edxe5v5opGj-e0#Rc(Rl1`^BI-AeqLL#}-^B8exL{3VdY#{W zr_2fC@=k2RmJlAEb9EX9eoTyC)wug1%mtQjGUC;3AERK6c zdab~N-@Y1|mu}U{)$?_r&9FZM*dx=x6s-oe+Xe8ib;NL;-Hv}f5&VczM2zu&#n+x3 zWs0}(CUEuE5|n4aa#61fBj(BDM3_=!WWH9Fjj=tg7(_%Ip21V-nWA9(E-yVurW+7D zbaP~-C{SygFdf4UAQBM@j9En0+r{%@)wG{)4Mf+%kHc=-PgQ)|iP z9AfUnA=I?Ev2PmwR1qCni`TwuZ0Z7X(YGK}0sNmnFcZQq+Ij{tVIev*qW(l|H<)ev zQ($(Er~9Hp(F_ZvXYc-%cM8?kpwRBbi_S!NCrmWsALkz0MO&f4T{KcwJIUYl83K?# zvP;+$-k>B7uMFu_h%S)EURTuF(Qz0-GF-g~5k@y{;E*>o3acjy-6 zW?)AQA`8S1qtw=X*-HV`K*U`VsTwHO3MziYKuFk-nnH9y_!%3Q4uVuudUqj01&FE8 zExH3^go+_!St}f5ZMgE5RPrQ@Is1~t2*VY^F!3^f7B_S~i<|r`(gS>VThksHQ#6a) zevz03#iCUCcRe)SfDLIkp`9NdP+FG^&qdY+Tae|%CRa1diPV^hws!EAw&e>&TMO}w zKp3M1Q-st50aJtR<9*fB821X1!EFt!i&g3Zww{Nghlz+M+1Jrn_twrnU?^xo=~Hb8 z#LG*icd!Azuru?FLt*>3eJxPuh&cG5R>RNq_QXup2gIGAK>4ruCVvvZ+b3qA}Ls>drMCd2Q3AV7_eAL^o@ieHp*c(;xnik*AkPP)zE0I6RqVzib z2we@$6wx)UVx;S3dS0T)klf5nEk5`*+p3F__HJumQS7iyE4_87>dNIf}Ks`dX`MS z=exAbOmUxNl+Xy=t1$CncJZm2JFOGchs}FdV#wg2J@e5j3ofyD+)>0sk?Mj)vaRTX zJ5yv~qN9dPM}81{B;I9v7(W;GS#OkaBvArZ-JWKUqr$dC`jA8!_f<(?<_f5 zVr_3L+Wq=M-5bFNMGRd%Czd%)@|V~~5q7{Ad?yW?2u9Iv$#D>hWU%(vMP_E@+(UkL zfrKRx(_YWh-|#NGH#1G2S)}Q-`%7n_C5F~j+sSuEceA_K(~B@BdzaX@bEB#i(1);_ z4lO(~Hur})BMYqzvR)B9^w}8cQj!x=I1+i)M0{RuUx3t;11eNEk{=)VVa2V7A-=7& zX{V<~163X|(yC3>-@*PF?4z|YEp(HdYkg=VkZOz7*wkVQ4J5H|(F*B1GD~xn72YldL%e4`)9xxQYs_u~uou7*URtoaseS1fR>*m}8WYp3|u zlIM1Iuo=POxuW$~4?sy27zWf3iPgHUD6eqKK(9rID;jCsQDF759e+n~X)%Hz@We}U zTG1w79EfzTN~Bdlg2?R00>_($VaHwC%Q!H}Li^9yx8$av`lnLTLXZJwxwcBoN;3@i zIpR+crLHRqkz2sUEjM_?UtP4+b8Mk1_xrMdvo97Vob3P8s#9)6D0OGiQdd={4)k5# zU9`+))#Uo~Fgg(}Wh_Z~Wm(|0E-eb-dpv`e+^It{r=CY=;h;8~I+k)LXeMp93|Nmpi%6QNW;DNGha z^>$BUi&y`!%j$>bRIfK3dS)-8=(WLwW2w^s13JA`qz94+K({O0eSO-+cLSnz0T#FJ*T~>X*tE#7WS@ngus*be$0iV`o)feNc zV-r>D!dy@3vg*rmRdIN6uW{9rx~%$Yp{g;2PwcYlYjM>HiC*KXCv;i$uW?loyLiBH z)#JOY`g&Y-bb+d?x~%#}TvZ%eey_)MS@q4hYM}ui+hx_a;;PBTiRXGumsQ`6s}_Rr z(Op)3C$2iFz+8XTWz~&cRXwW9s_({C3xVm#E~~y5S1mNxBf6~meq1%Vb7BY|-euKI zaaHl|`6zK%msLNAs}>sYpsnGqwRk?B;y;oxz)#NkhV(cD$H=CAsigC-boVwm+d!p2s7 zU-B}ZHWsXSx7V%o#_H}CCY)-}zTV9b=iJ6MbaS2BtSj!;GMIC8m_3d?{10EJ*%@EN zdbUdIEP)MkvT3@iPES+!gKA(_qDRmO0wply0|~cjwa(hTpl-WA+ZMdVNTAo-Y@#r5 zT@v|ZPl)TXUtGWX4H!QYDDvuk&OB7dR_wq{bd42|2JzYg2PBAi0NKrBtVx1Amzd}YtqAo&UqFeFLcNuKTp zrka~erf{kzF+729JXxa>)xjBZ!#PJdfa8?9Z1EX}H!VHYI^O6ute2_4oz1~92F5>e zjC^eu(An*vuiLyX6#PnUsK5%p9gP*&)h+Xlk)==i25+oe=Jr_T*1BbG#(Xk9NCKDF zE%gAUjtTv~rf#WwRaYqWiMpkJGqSYK_x$|2WqxI-`Jod+W$&-BSY{yyz)d^9I|NGjyXv7LHC(b5c+Pfi>Wt)spn?~-OtqR%l*Sjr+ZjmRJY8-NO=bb zK>x6Asm~27UFK`LyKb2;QPaH`Vp`qShJaG4Y-!g*I$4Ab=O^g zy&JpvtNcA~^Yw1zW;cIxx|w*=F{NAF>dn{RLK(N?=IgHKAx9ebx`#N}KF-`{>dxH# zBT7&g-}%jTOMRXBmA8Tz5?lau@YMrMI8q;IwU>Cg+c+dt@X!NmrLM`a?yb<2E|s^*6VPp>_CM)w3T+LDd%OLZ%|JC5+Hb<5nv z{E7=Vrf$-JaczRgS_#exgd@m*AE;dcgyXLx;FLO#ir~P6v)yaiE%y%-Gcpq=Ppw@&Tyo!UG&A>8$A=02YV8ST5!^Lg)c66nDU$D` z)oZdNi8`D`c=&&8NZ!(y{D%$%bt5ynSX)J>#EosZPDCA;uy3s^xsw|Q+_3{2Y2)T~ zLDHk&|3@l77fDL(Ia>9h{;*H=t?BRH!h;G)2uR`R!dN~AQW)uTeWKh zKGzC9d^t54Jx+)$TfMZ|Dur_mr6VkPee`Ef_Sw zbv!Z29{lq1ljuWwgad?o!g{!F>PyDjgcAfW30NWb?oaFbrs_;T=s21lPseby^XpXw zOII}{>7n+!JL;OgTN;{LY+?I)tGahFCn2$&`e0covP4JH`A})jVYXK~##y!Q*_Z6z zmAtwydAUBE8=N)EJT*MO$Tv8!PMIY_xOPH-n?2SyrzC<<&mQ79a}yoOo>fEDdZcuZ z-N^dr9hH0wi@kI?|PaWj<-G}q@K86Hf%cO6pm$dM{P=Gi7YL)XwyBqlbr}t zpqD!l_PK|@+?gf46S)a!4SVu*Xa96Jp6=?yH}#dA^xXr~A^YhlD(E2}tg&CmpD7}3iN_=w*L>AY|n zqYaI0db;y-ENp&l7{npvC{YMEJTnB>(msg(z;}cfJ<01-Ii{F&fu*|4Q~`C|ub{sw z{1wGS6?Aa*Rb6>yiq17@hGz-OHc5MPce4CT?#tUOa~EX<_a@41;zam+$b`^!U$|DT z5KztQh%HzX_v$ceb|mM0v-^p)cX6@o(bgLSh=2R(I&Xi*w>zsJ;xEf-@+1``A|j03 z4)5$xo)I}2M9aC4toNsf{)G?yoQf80%&V^i2$=JPb#Ndrli+PNa0$fj8GHS_2$Y9u z_L`;d{=`do73eff=eZ|tjlY6urv#E~>ggMc6D_3Vp2{n!><1HbDrhgDlfl+HGif=} z{vN>hGkHvm{QRV~H)(kt4|;h(WbVAAbym`{KM!W{U@UV3`nS&JSaWx*=3zEZ!6*_? zdJfi0J?r5aWb}Zt%6U-U8ec6?rU>8qPk1oH9-O2HN@y6KH1$GH97=ApyW@R*$wZdk z++-s00f%PSGi-`~4|)R5e#kSl=oVlg%x+C@WG86-b|ZW6dulRix<)u@y5zL(_EHxy zZ7~;vf7P4}!dh87+)T_!;f145? zwtyLqYSoK9;!3ivc9d9At?qZ3)^}kA1<$urrRJX^{F^P{aVAcgb3+#;V?8DFgtN!9 zfh(7Q1l2*J)NtSEP{WN71bO_20VM0l{f2bqGyz;}>61+JTmuO&!W2t3GnQn+;e(Aq zIJ~sKyv2h4{GboOhyOOa<)q*!*!^;f`!p%fo&2b-V^n?|(A?(Hek>2y9t&N&h;!0f z-Ku`E0_9=2A2S3c9Kp}pjDa?%i%NZM%6jPULPEWP1vgCVItVe}t6TNwN81UY<1FiN zTyL_w5+Qp{F5jmwnN7}y7OIFht(}tW@+t0mO3e9K#p|bCf|(sq%+BLaU|DJ;3+~L( z_KhFaV^vLC0s*5sYc$T5QfX{}1evS;i(gcIVS&HE@6*|wUUy8GjVo7|&qf|&e&0~d zKOddlQaaVAzPW1~15W&KT}c@xSTLF!7f?f+^&yYJDJi+ES7R?7+6RT1sw|z+ZnPHV zQC+%X0dOf6a{;Wctz8VTt-Y-sDS@zZcT}GWF&9>7m}D~CRs^~GXdfWjZdf)JfvVq| z?G&@E_@LDN8jc|B7~?**o`u~Ck&;?7+8t)1nURKrG;R|~#?h70h!?E?StM0bup`}Q zzvI)3ZQgdfP__Ob)Y_^%CQ9*Wd6wqqt);C9Ov0+62PeBuOU7#wXIe)RG7QAojp1s9V6m%_2Pw;!a!4xZ zMdJy?9Mj3Ydq3t%z&*R+Wo@>v>>D1NBgnv<__&59jizD%T3JWxOMLv>q7(b+dqOemi2I zYG>NMKFLPuHVVpPtW%e*%R8k!Xi9w#;^#;Gw>^}RNw>av_*Rldsifqt-xDa^->9-g z?w)&uFZr9@5&3%EE$fZk-3HgujTGJ6peFgXINpwW@D;>Zd#QS;#>Vd+LouWW$M|l3 z^aw4S!r|uX7U!Dp4vb1}v*2Pg^$k`U+<|_v7ekZkFDZeKt3GcV>9UA3;3DfY3fLR` z&nx^74WdnpYz^y8$l@M0pFZ@$B1h;B=e{o>Nu{aZj95_L7R1w#I=Hj@uRbJCiRU{b zo=f(;r=c%g!-Mt0in6?Dk&hMZj@b>YU6b?NH zwUVj&py_P$#x%D15voQW)9+u87q`GQ=8c#D+wA1-Q~QNSF$jWbuH#vHcweEcyJ7)! zH?(g~yFN>bp|eu&)cwY$t9&=SSFw?9$Vb$O-lLzX)~QCMUwi6f*c)M>cH3(q?Tttk zD%(pGZqpi*HAqfxYft-{-Uh9gct36itB-vSsJ&yc?m8q+8zT^QA$?BNo$!_!m*OTv z0vx&(DOHqGzv3DbK{V`hl2JhM{mIKMjzQu1jrkq~(d7N~+k|#tSd9!;0i7jx>Ry3o zA(N9W>*cqDE!~%HSUw?KpR!27(KL8Xb-iMT**5i1%X|0IYGhx6k5aUGHWZy>4H}b? z?vHy7XkuBpZzH`@ePb~8Ta_Ix>&Hm<-`2rqJNT;E<4W@wv#kor7Eh}m|_ zXYjm*fm>W+U8^!gP~sD%4@w$mqb$Gc{l z(l#5G;%)OGqGzxY;38#eN#Bq?kI-0_J!!#aSL>rdX{m@kIbwlGz<7>%r{;5V;lp!t zQuo<;9iT*E3c`yPtP!z_*bN1mK;vm)a%{PJ&I&VB`_c%pRkLfXMyM+RqNC~aqAq3_ zqBSQolYU_sc8k44zlec$3w;TXJ1_^xl!9_BTET8BiFQJP-zEmy6l$jXk&LU2CYGjH z)py1<-V^Ubb92aEA(WKJ6enf8BN`l0xWvN-nnKnhxXdT8G2)IybVz! zPFKW)8aymp82ji`_w|MWZ;bbhW~#c9F`BlB==M0GcKMy}Y`0${3>4Bdr>ov-`t!_k~rP4MLmlZu!Z z`H^2HBHxR%dddk_PL|_0ejORf$HE_4e<5F8hfEzl3j?XqO16F=f!}Osdt#y5Z80c_({a=&4r=o z>Kb( zgIKszkKaWw$Ux5yMpD?ok|Wl#w8;e8#Jx$h&K-hXVe=oiF@2H%%!phL<)_% z8h5%GtTB8U2z%lf1>G)B;p9Ybv2$-O;HG6f{c&ACHZy}v+VnO*xotraw7LCwPBy^d z%S18h5_lUWjfm=u@T3#_lYKDXp~HCMG`FpNk$Fm5(+y3p3|6>hCj1i(814@Vzl5UW zrN>x~3Cm&(WX!#q}eZ7{R*O=jmM23+?mrYL7Ode3!H;?+bWSVL;7YP1OcFq@&o(r8wHjs@{auZ@fi}70RBhT z2WdK2lKnWc!vg-#Jv042)vhsOBB0dCDN+JeW&|>qE8CuYZ9z&@-7ox|E!o_53*>NStr#z2>KjF9&UoxJA=SM(% zr@T$GQumh`MwNctP^t0cqGVKN3R3B#MX5A$(;!#0V8Dr7IKHeQ3oGeI(+eRyD$+r- zy44hAjf-pk>@(!df;beYr`a0aabBpdz%^sO+2`G!sDLh3nLLl~QP}P%wx}546du*u z2ja>%Kf)~do@!jVU2+Hkxld}X&`6Oqz7r9K84qH}11yeeFjcBVwLn=Z0~g9fYhXbr zEL_geXbU_`TrhqTj5h{my(m;GSt|6^f{Xq9SZz7;E#SvtacEJ1$t>#;6oukn%#AUD zmY2zQYRAj4xqKIJ%_h8PRf;Sph$9+sq(#O+q8X+jlT0j^Np5_D5yvXmRIZdG3f#T*> z(uI<{Wt}%EAQ6dWOkx175alj@hrSNRWAHbBd^h}wmv193y_^8`xbnt<8{fx@I4mQ7y4>!ZGx zlf;O%aqd(@I>&t+dv*obvc6htBtUv>v%6e;@Eqx$e-7KCz$M1g=)MSU$qmz(Q%iec zGc+@}mX9L0#M8(>+2YA1tAh4$ww8=r8ZDUxT2e7cYmWw)u05)p2!`@{>48*k^~w0) z)f#&xcIJH0u(Qj3PwR#)ao0CK5Q%l1j9MJS?^TDl&wX~iHdwZPr*Y2R9~!dmMnac$ zm&J2A@;pL^*#jSalLdlwyYr?C)w@0P9;sS*ndGmC=2ye>FdaMdC-3K^sCA7-} zG4|gh!Go&+gdp|8l-Gy^Mj_lK1Z;bZ1E&l6cwrF)(rsL!CQ0`Fx$j@npDXAO0Db6q zf+s))eD>E_z)^_qCou|*M{_$n%6wQB`z=i9^ke098Sb9iL43?dv7Lg4-*0WMcgRZ5 z?jUF4G`E=mBt`X3$NM*k=E!=Zq1A{|5(-KU7_wIjowNz`JprzcO5KM zp}DO@==v;{<{pA_-Nn!k!UhQy!@UQectybs9!0FeYKaUX>ifCq^Pb2eg7{=swVGmu zr$0XD3(1b@S|ze%kjlxDx^F<&g}YdQ*A)>i_COQh?@dBt6sCSM3wl}zo}v1OI!kVH zM&mM46D?7{q3YU}D38#e5Cw%7qC5pyM%^Nq7;To!u*2T$ zf$v73Mlctuh{no-G0`efLrU=qm2i^>S>*8yxq}2w-d2g7!vs4(>2YY0g%{|4yq9>3LjPCjUKm zC@4`QIIDbZp4{zyN@KGA(tC^pq4Uu}9D_^BT?H)!KZl}%DgC$9Kuuu5RP68sg;F*= zo0@!n&6?R~<|hmDD|}fCQwk!T_>^fC5i??k3nu#j*#gI_eo}3vF5p-|7Y&ULzM3EO zgV*!JPD$kh&7F!liseCz)yj3Hs_620amF?%Wt|Ar9@w6zvZL zLGh94p`PRZ`QW;%IuBU?P_KmapEpD)z0=oHSOS&nnCQ&7NF$!cWmNzIK-)EzjLSKe zl94bZ)iLoGTT{)-j)E9)U`(}qAfoHIQMc5n~>3iV9!dqLzarwJ7n=7>s zW2Asrdz8ZO>^A3j_SEn^nwhF4BDGU4UE5G`VLSoC$vBtj^qJOlZ;#)fAJibf#~>}F z^xugGkpVP4kmmuA*Hq}BFN^65i9)B=7_?P^jkK(6q06E72DoBO=SoY&|GflR`q`gWE+h3SVj{ zc0`6@RrN97oC8&kex7UrOM6@;dWc0xMweOy5544QvS@UfnNEVlVUNt!jqW}jqQQ~3($3d!B|%64))I1 zI`C!2ULH{)pX*%ViqSez2^%o74NeHtw@XXhB4m#3mSO>psTqP(z|Kf~qi7&J^rAsA zoW|ub?j~T1F-L7fLTCB1EwrHV`}%f__#dT**s7?or`CD&%mMLP(G=|R1SEmKyj|04 zOlZg>GOM{=MeqDd%tvc;+?SYcP^LP(GIl5*3b;QkgkoO)`t6Zx3P11?ZD>?&&t$Uh zZEXB3f$CwUhi)5JHj0^}kJ%i8658dpVG`8n91fTklKMjpQ5}h_R#pZZZ6q$@oPKtG zoO>G8rUy#SeS>`j)F!7jG?16e`&NK$j!F5P=Gc(yP|*__!Fr8Yi*9unSfd%Y^AmjI0a4qPZokRHI~uHu;>z z)fr6#Rv_0=f;MQgrdI{v7R+_E!CQD5aG&Aii#g&@q0WfJW5N0)6y$vX#xL`3d${ zsPaasf!yr-qgPX-9{n?B-_O3P+ey`JI$^xuO5(0Lv}E$nF?W?qPET%>>*5y=7uN+K;ek}x`S0bHByx0Jk@U+9CG z9tt{>PXPMdO*m^Ui($OG|8_`uE50WMA(8K)@9ZSRkYQtU1^{}EOprRrZ{n64rhJz) zXYWiUvG!9MrX__aEq_E2Vv5PiHhPc%3eH{4a4RL=T5}{mM#7XK-3%ZTgERNAIjVXP zGgfXN6x452H(EAkAP;L@WX=8I=TpuH*s%c4qTUN_95G{5!i9{>nUV%6UQGp31 zpVhc%9%WjRqXH+A~RFr`SSZrMapa^`zVcqjaIrq3Du#2V_lWP97g> zg7+GFr}o^hZ(c8w=beS0RDO}x3BK{DHLlE z+IPP=f+mX6=Lpxr$alO*xY}UcX5XJYE^Lsqde@6=-OuW^m8}PPM}(*5pznE+&3e{w zjYp>bs!%o)Ls)5IiID^4q&p83(;|gV2Bo8l%+`{neHfuA%H&A76`uiCFVe4wIL~)y87)2w|+|jw(@AUw_56K+ztgBt1Yykb=zoiiI3o! z(yKCj;6;v;UM(C(!>Epc2}WEBKmRHKq>ZaHgbk(vGjG`{T~o+8$$}5*TtW2zi5k+Q ze@67b#5yoJwjY&qw|{)b4CWCM^=2#5+-%;Ni?;r%oDHK4z|%Oer03|FC?vNRE~9(% z#_fU=bLs7`3NEhyjJzmN0Mm;5y@AbysAD2d8mvQ9jiknUOg-q(5^-Y&BQvolP}p-1Z^urVTL+5lHzri6dWRw6^zXMUXW)5ihu>cB42CrOS z$dFHp2u>)w%_T^C$`GJ4YeIPSy)2A6M5&+#UGvJYjM!MCs;@aQ59&`oc@Y|wtK5KM zCcDu-IgMUHAKu(}BWd#624(I`s{mzGTOS(Km@c+4(dgPN)G*>@mIW^H0VvvS4n=$F z`#V3|4RM|w>cOT+*fPki)!~`GtBvKRP11}hNZnq!%;(3RS||3&kTndoAWc`Sn~b>F zz~g>6e(iR9a8M)b24%2%20@~?27Zw*#ld#6H|wOWY9srVDsfhoh(#oQHHdUZ&FBxC z*-n)lADrZ0dX1KOEhqWiuaIaH4g}DZ-P)i0xO5tZ(FI?Fs1)XhfFlQThmkB_^Klhr zw20m;>~HtcrBStrMuQvKQqQTzGMm8wHiMCR>TcgRH$mLIU!R^y!-y|4gO5GPksu?t zs1IKHy4xU7A$>vO*uS$Ffc&Lb1WHHBbD(q)f0t)Zwhj7u{T76tg$BPQE`&h60p>g7 zf~!$ghKq$gD1!d14G_X40MtXOM2{Tva=tVwZgCf!e)LK&2ZblIcB7~6H zh)ZP5HAY&%kk6A8roI-G&oUVaMy$8;_u6k!U=%L7^Ii)c#q>v3>aSmpt%F5NNM8>& z18sj8LRu~Z<+j7~5FLNKug=F|vi_@-0iB!N!&lhfjpuocbJRKG$faxni$Oq~h%g(> zNyWjqf4rO};7)$6Wsop3?z6~7kK1PtYCwNtL(0~tP+r*ChYit#B?sG$Z}YEOh!KG8 z?t^~exvl$IyFi2|X5Q(@*3`+{Zz#ui_+oHr-76j!Ejf7LRG8#h%KAvN?kdV<;VJa`febY4k zOn;*q;*<84J3t>`3%PDzPrhxnu;;&EMAEROAl)@Pdj}pf>=pf-+>#H5t3xr<~+{ z$w~jAW>Cb1EM5iVZE5x=?PSnvPwcpN+T<8`rQ~uSc!f!+Etwp%>qSGvVt{e8=CN*G zwjhycYgKndU$O_)vEMc|hKhYlkrMrP^>mu|M>DF{*sAS3n^C9P$|F#GoR-b%kM=9% zhf$bvzhZyZz`Jsmvs+|20w%x!HFu5AxEb9yR@qGiZ}0cp9Om+1 z0i$t(S73D6dLQsRL2^ci8VUPCE?`Qd;|_a)rw3m-s4gqZ1^;i)M3y-fL^P|_Fz`NH z%5TmfWN+}%!|>66)Pm{&_*j7IRQLQy0~dy_Fuz*9RF(6%xcW1V0SLW6H*19zS?02j zN2!`CX{0%Ocm+& zw+z<4?)Fb@m>3=8pP?6jCsnWH9#?zqw3Ch}b;2^3*^Qk;v2@y%wrIDrOZ*ql@kN&P z`y}DKbtI@9?M|B&q80v|@N(bm9NScy?FACI#Fpjv-_a$vk>-Z9Izqjdb){Q~^WgXh z+d%x+$NJEk8vP|4#UG}U^|y(E+xG5C2Br50=l$NzE{`@R)v%e#gz3r9-ekfI;YK%e zp>#{p6bsC?4It!elI_PmBGb-Zrbz*>v)^jtrhcKN`^yw0UA1IX2q&@W}z__0WN6`2}qxG}gvzlopAef1V4L=aT-sew<;=lppmg$ieve4)o zl+{5Djuj&f0-db3Emh7sonkSiO93d3UEnh=*?I`y4e9dqz`bXa8Al-uX4dKPcV+9K zmEgA!%&b!{M!B!CzzZzYH=|Y-g;3uCTPjt0C?)=$t&hWkES6Kw%ymtvGXQ*O5xol0 z-Z){G-|3c<%oqSB0}4aWDKXapd?2@~H-5HDv4abB6UA&Nu+XT`^_Z<#-)EdOCyE4lS z{`T;wOhi)<;9`5eLsc^GMupg7i?m8?xm>;6j@UBW-LE#S4bLbdJI!=v(18O}B5uT# zB}woeI`NZiiuoirADJxNXW@du$W{}k*Z&J(dS`^`4H2eauK`om_Z9-FB%H9a#q~g0 zO@%74*k->4E;fdUUIi` zqygg=-(yGmFz&1Kaf?JSZXnK<=rvkZ?+>;8Z7@8q+-&>4Qa-NZD+kk+`#8vIQ@=kp zWPEZkO(N9ADlQmI6+hENx}C%6qZ{m#D(=DbJlj)pdoe|7BVUhRsQSW+e~K)4G5`Rr zQg<&XsRdLi@ruoWpCRa9JR*pZy(UIRA@P@k5fVRz+BC|Y#1bvrbQh5*DPg1-!u3$iZ={YI5pfrHORtOG#+=wh zBcg}-%`0CV%zbOOcp`X}?Y;7{V$#=5^wZ>iGu@<^ZR`XlFyXfDl6&1id)U$KD(`9a zN8F0dwGy5#d>^|w8Rd;&5>gc2B#0{pT$I5=PY;o#fslb7W{En59628N961YOQrMGL znj|aLGDGVB=_VO6TZi|1!u4nCGHbK0`=7!eBFEn5^&Kb)aSS#~oRwsg1?|!=ryJNU z*5&YcsD6>8!((rC8J|sYGPYREy;rXGU>g4bB3B)0zTgA=YZtMxTeJo`s>!E&q9NK6 zrqYnnRF@}025wWJvz4AEPX1IzO4%%bweBq6B|JPeBe+4ju{;tBU?=b*5O~Pf$Nvjq zJ@9~jqlKW!qmwJPdxUxi0GS{#JHYLfU^D+ zOxH&;Q+=SIetJUfP~^}Fn@o0j~Lx{(U2GVHUcpBW4^ngyiVD^3{eRuB*k z?tZJSEMnARQg#dJLZ@yQDPa*$+r|%IC+GWlT>jp6%?_0Q{LE4+bBenH8l^Qyw}L6$ zy4B@{4^Hav(o$oGtS%D;)vQ*O$ zVro2n=EHYqn@UC*&2WX6(ixd4%IxXwl~wHQFYg&FX;oF*h{pTiuuRn5`kpQ;8!T*k zp`m--N2A+f3ZGTu2-N$jM4|gGHOrACC zwgoTPG6XvejF8-^{lP&s*F@_F)H~=>B+^xrN<%U0r?YG|znLPLdv_zl>Ht?pW5lzt=R#{323>twab} zJX=LXC+wr~hq7tl6MV+u+)X>gLSM3faF-;Xc%+IJd5CGPMvkZIB8LJy8r{ZDA;1*( zfj20{#2T>%uogg$A7r9S?qkp<17b9Wb|r6Qf^uu9C{5Vj{z)x{ZH6Aw-_u%Uj=*8} z;4Xp8f7(>}nj%Xk7*PBdY)ZFT=HV;p(n~N;`Xh5kxLzDS=IC4O?Kc!CTlsY?)8v21lB=GX+dyAe`Ugr+k@LD2x1?SZp5ffv% z-Tu6xYJZUs1717I{}|^r;ogw#y*^K{;Gy!^ZwIUYWnGZ*?i>teUk_%FbDWgTTEfc7 z7=F|oC8`3AEE}9?oC#IMvFB%Nh#&I$mHZ%+7?*WRydQykYRYpyxXCx+&(#))f(bqu zw&wDX(S9Ad;B5?H`v@31vhgOCNigl4bKv%H42JvYK0&^HP1R0%fd*g6+AtF7?(ale z(|{1C-hee&mu8x2_j$%XTOR`3Vuh?I2U2I0d7K$Qcw zaW^@#E-5-5Jds0X>>R{@_%JVTCMW_N(PzH3OS@uC`dITsRFy_fD|^ zj$pQBh}zr1v0ozx(t|ueKQNei{;SP1ot?QYC>XV)NkJh>?19JD_6(Iv`daEHLS#tW z7Wwb3^s+Yp^{VB~Y%#*blbhvdChD(tTS$BQ+=1dN_SD_CPqoH;Ma_n!G26OvTWCm3 zRek~*+z-{Xyv5k%pVzEufSQbMxeNB`qU;DElKaJhUSi{AvmT&}(2li8I~e{|t9w{A zdbg+sLGxFrl$8ja;nD5x7XT`p^Ah@gYQ&N*DoET?BVC6?>YUTcw=u>tT9T`-wrFnf znrx>J+{-jpqNZ#lG-bbeoTu!{!q8E@$+Q{Ch@NB?xGUvdM@@@)=HuuKHlSg)&J?xOn3Gs-sezUoV+A0b$9!w#Nmz+Y^VBla0|e#!&5Wn2KI9H-36T+viEdoAfvSruWmQg6Pgg5o1+TT54$QEt!9wPnD1+~Xrm zW_X;Acg=doY-e+1JiE*DY$>(}nIUFEce2}o!VheR6H4x?%Gk1)LE`K2``3*mE^5Mz zAwxJy;8Xi+xlC}6yv$+^cvf*(iR@tvT!jVdEz01H|KUN3f zdaCrzMWRslg6BR?xp7W>{f$LNUMvF2s@BJ$o@{*rW8Z36I2&|lt=gaVXs+^ec0>U|Hl`b)fXlfrtrQ}m+b59oh5<8gTQA^r*Y3@ad zOQh;7fvh|OI+vv_e{dYmrw22fU)XB=L%!)@FiSP3r&L(&+T(u49*grl4h>a!IfWm; zf0_cryi;Y+^6k6u-*eR=qz-fR$ZG>)Zp(E1NuolV z-Q5hz=z0{1yeWqoZRPj)TOWp?V~l5%E#f>=UYr97Ushv&7;U@X2pRFwhHX2)y1!uo zYh|fZJz;jEaA8GzXh=;sYr7Kyd3=ls8Rce_xjizV9Z2on$*8zLT@kVTyJ7Cy^@5go zm_A}M+D-rFNK-z!zO}v4+gYf0<0AuMYQvS*0k>URCo8lSB0tCo>ebumr!nRCQzho$d-! z)$O*aBV9hKO3;h#-&nK#fr=jAQRwjvHNPnI`0Hgo&W;WoRFA)$^>~!GZb;jTR*q&2 zR$BdfC_N!FePBQ>mltLZc-7Z^j^K!bGevPPmV|Li-O#er(5p?B@B%|Iv9v;}bXBL} ztb;M8&4fkw=gzLs?1!-wXdfSA=^)7OWoD)I5$>bB8S4H>NpHm7pyr8vYvJvV`yl;p zBbv-S<$vo8Lj0-VNgc^QkA8a^TuI!A-Y}q{=l$4if87BbbxIqzYJ!J~bsu8BMB>sW z&qyX>@rFd3f-@s!Uv$2~oH$KHJ!JHpQ{4$42`)IJsysT&7JbE^HrW+nn{x+pk0~YH z#7&iQsKsEak2Y;{yi~5f>fUqulDlK6AYr;@-4NWDy3LsI7++f(687k(w{YF#TSNCy zZ53j~W^o%&4SrRBZRLv5XC;5Htt2BgJclNXe?acLII_@*lH%1lxK1}*2- zeEYhf`j}whqtx)~*fKSR>%SXF<`Xo9Sz)k09n4@aWUv-SdcFo*rRDmSbzS+&dZBAw zbFw9@Gy-W20jy#)e%)x1@2HD?{L496z^U0Ldi~w>oTvnX5bSkn1wptz5`?dncUvtK z2!h>)6EE9C?__h3VK>m0&9SPlZnLTYknP3G#t_mQRIj@>5DbE4Wwxy%7YRB@S>)-B zf%ZrWSYP@TuA2w$(iKR?opb&l9&yM2Mi3fcijgX%O^GsiwJn4ud}}b>xYoMC`n#(!noGFLcMF~3 zC%~|!-_L_vEt;ryE>_0kkK37+_IuC#hBKYSZZ_ zzP3fPVDJxG2wl(j0oAwQj)oJ>H-*fz8W!M8aV#X`)hLw-sz{JW2j|7pb!=0z6v(rO zlk3!dLQs<+&o>lQP81W%sTqEZk)O-}8TiMvCo>=t zZHi$)zn|0Pqq+CQMKp36pY#a4QVWJ%Ae~a^1^0xNTD6{I+~ifHZCGO%@okvR0<@2}gEuS;%Eg!$nJIlwSdE8o2jw&_FZ20t;xf~v#bSf>@f>Hr{pWeF+ zd!buLXRwO4h|G$~OHz2eCLLd9fU?Pgnrh~9KVrs=SgVsW!QGJTygv9vL^66IX0oj5 zZ44mUo9p8+U?qpy1!%Mg+T4a*D$^7kY9F3scWSyEI4G{Hi^9PLCp}zVIZ@2fb7^X# z``Y1MLsEFtDDxWQoV{gFVgW{u5%Z8sd#3zTN&66H%y<{1Hz_cCsqOpJHn0SEw|f4&IbI z&1K?)o_u@HI3q*)cr*knG?3pd2-+VntHe~JHikcGTwzil300U3kQ_}V2`%dB4ObC(g5B>JA%pmbq$JQ=`@XJ2DeGaDq&hcw!I_rpC(eDA+{`0cW+T3zf- zKB=_XEMp~iqz@%1ZQ+yBfKC4wIjU?@pSsL^Fk*tDz}q$-(1d$!B>3Ioj_K!2S~mU> z*a$}gVnZ>pw9Wt{IO4W79hnRzUXvQ`W)o0S*mgZN>6o7OivCgC0-2744W|VD=_UsI z!Y6CNurk>eAgZfuKzaC<3{{zj-+}_A^ug3kZ`zl6Pnu>XB@yC99XuYEG#xyfn*kGg z=)y$5{Mlc~fcXP%au)ttZQ9etZ#2T*p{|Qu zs+pVUY4a&bX-1b3hbP}IgMP`KF$sEObOx?smhe_bq-{yT%{y|0p6JPrQZmBg{}LJS zWs4uwxMQ+-9a|M^<(C|$?xfutxDzy4)i4zqREDKtL69V6DXK)DsD``XP5U1Pqim6AG4Z{77rJqwnOMbHRz)qd*kjB@f7(@27?Gr5 z&UkAxuMr_CsUrvqj1*L0sG#th11fyDc9$se$B9&x)s@aM$;3^uh2?(x_6!9m_!~8> zDVgHVB?r-?hOdCSlE5!k~OOv22rMa&2cLihLTH{9NE2S{`}7Qt5&RDU8C-oX0>mx z;^hn1EaCs{6s%x>XZDd>mEfqLo z4c9<&^_o>{=dU?JkB*tQG<&vS!NPv7o!&24vV2V^|1b9+uU;|#=y?kks8*`d-9lBx z^%9jB($KJ0zf9HYC5x6@m1*A0GG5WDb#ZZny|DV%<_)Y}zJx|8$J<2<*Q{8%=7{+# zRxRX#+VkB#;J~^2`l^*3{W1iaMh}%ROCP7W_ftGeBQE!s|_eSG&JyhMSzb7 zn}Ld&n0#MV=qbZ#0Ckhb>lP#pu9szlH031+R7-JFf2_TT&I}g)Py+wGDxu&QkrD|= zV{k%-JyP)%^FRTPBf#0(-`{?#T$e#{zFaCi!b{0L zbzXFaTNFbQPiHGH#eZ zC~RmY`hJM@@k1}PkDp=lY^eCktq$8~Dcy*)4HYqJA~}bYrIb0`eGzkrR-Lrr(kZ3G zlcYB(P3Nybml`iOD|Kpo%^teX?0^cXOSq9e5glu^vU1T*CD;qGnx>l>Mq-%E5)AW?7R9u69`yRP=$x`v6SL&`vr9EwaMC+P;5J<~0Ez128`=Q8>#Cy>&!r9jA%@p^W z1|%g>wR7VGBq>{p(2q~8FKrFF;#c#${=ywMCPq}~8saqB5h+J!RcNsRm54muQ|Ss%Dh9P5<~y|xeCZ+7r> zqk<&q3zEQ(Em=3;6}!p#QubyvgyldONSkpUQ3ZLm#lWOWmF7@C-#_Xp6T|Y9>8v7U zQcsX!)v;14`*UdnplrzmHvymr&PEdwfP-0~xyL$mP~IW>Q*u+gc--RN+NJIpm3!?H zrV$e}ES3i&k``Di5wpvQ$C8U+sN7s!i3j$Mg~&>^)9{R)1uI&F2B)7D=ljxXJ!+~7X~U=B41;o z?CvB*;(bJV&BlUaj1n}s5}dNi?+5>Qk+c%JjyVRqBnOd-3kd41XE&;R*ByXIf(v=;yP`3@&cORR=?o*> z%LeT30Gr%Bg(yyY^(#QEWJn}+cyBTH%Dr1gBI8$Uda*aO?xS5i z)v8*QFvaAK^d^x~x4`v9To1fONukSzyi=9}u=}v32v53YUi~|sbuG zF*PcX2MpSRH^E0eln}Gr#0O%Lh!z)%XH9ahphODgjOob;cRkI6!}pNgt^}IW65Vm0 zg56;P(ncC1aD|N0PW!z!HpR3~!}84@_=$nTrl%u68yONw~WPw1@jegHg%U zeOd#p#>_q3k2$(V19Q)wXeA{78Ey`29UN+6rFlju0d}=_cUczU?mo(CCo=iE68;7f z#4aGh8wjK|cnL9DnwdWS%b#X_y1EE& zr|`ekP^Dee)%~7*u}n5TIoQq22Iw>>rV&;CHu7_GHd4cF%Y<~ zJ5gY)wokHplVqejBhi=UT+pxB(i07((MA=Y!v5qsBq_>9lc-hkEorFijq0 zI=}!7&xUmyg?{3F>X?S%TL{wZAcvuToErx6*Wy6bZ$FT&ejsh`{S0J;d#`4TZamJ8 zdC(G^Ih^IG4m_^#kSaLZaxS?GPv}bB&V4La6+%yO{WdkYcp$Xgj=|`yU4lmTh?*In z_F8pa_&;~i)*1zllyY$z!AAt8<`dOaF`qwn0oi`SBnM;*FusHpEKXB$x6oOp>L3nbRM&RvQ)bC`m zmqKA!!9EA$4a;-$2+ktFc%v zVK*|H{!nbc+`XzmD&~Q4P{HT0U2?(4`k|nH+;Tqh_cH#=&aH@;gdXaLUfNT_`Ro_2 zrQfbZzEcWWS;(Mp+-pGJhhNJ?Y=}W;=yJ381S{uTLp&|`+VNWF z*!h#Dx%vw|HOPNmLR~weJ^MkI+O*igebvOUu4e)5;2u3uH8io!q*XkvYpaOLf5|BY zw^pFWa7AbIhDAeEhCp^}J&;lF&(O!jnlHAt1ASPG&`qP!^hTTX>Hgy_u5LkBTZhdr zJ8gJi&J{3Nr1}|6NJfi+$o(9)|VwI@613)zO)1JxeE zj;#^{twG+Fny>g`80ZN98aLWu2rK6L^n<;u)?f(^V^)w;96fhGF5%NLb@ek8j*}(J z-ALEINm)e6EL5$|WSk)D^X=eo`(arFZAn*BEk}`1BItg_8q}mAYfK4yn^-$!Jk!e| zlCFl>m5^blt<>I(^ALI8{%ZDja9_)2R>|Pg_<|*=;C*vxObiFNy2H07dv9QZNecIF zs1MXa8AjRe9y`8^IQMR0p8Mbs8#<`+*Wj2&i%t5=IG&+{sKj6jOqN+dW&cdd{Fd808ZTpP89vHL}Fswfxl@- z{fR}sWjYaY=#*|mqO~;0JdVIW_Eey;C!J}=VT_RnirAJ}h)qD**#{V)b`S+TXyBDumwy=BQ!v5~n$1R`V{oWO;j+T3|d&My; zmv_p#Bbv9<71+#YMSS()@=4J%LsuluB`#)&b zUise4XSqryemY|vWqsp~SP;C4Wvd0OTfA_dz7mYr%v-Z|wZERfV%f44a-s^tYu5UU zf~8z8iB;ZPt1p)<@+B4?vv9fmo%~z4{FozF8~C^>H=^fecKRjUliOm+N}I@;{_8ac zT79`{#j#<|H3y-4y3FfdyU4~#Y24&Xk6;R^q^Y4{-snu-N~u zJbM1>m-x$L_wISAzhdyJfq!5!bWx2q+s*tH%jJ~zH@=7pcP@S3Y=5_M?drujZq6qZ zU|xX7{8h)TT(jbcu$;oT{@Ic8<17!efU|kYisfOP6)qZIhyQlT2M@o`srP2{K22>HOfO+I!EMzeDeCxVfefE838ZJm%QJ(F?t!sZFU z7|KpSX6O8#J~~e-n70gL6P6Yv5!VX@Gs6}=M86>I%*9u3GU^<3YP>ZzRIeWZexr z@W{-S=3K=(d2I0KJdM9VL{*WE?3qne&E6QkR3IWZ=>X);YVyZtp%H>R)M1lSG*=A(DGNmLsZLI$XK zLzB=aD3FEYsc;-9kV#>>YQ>uq8j%u}dPs&awnsJ4>XvT8v?Q7Sd+Ms{^g1vhopz60 zsqT%J@7}z~fAi%?8o$-ql)GsiYnuLQ`v!(RAcLl+TInxnTB=ScA#bWun7nD(U)-DLFz)NKc$^u=q7 zU(lIiaf-c+k1mPO{TD&HP$t$a~d4yz&uGce=%*M&1Urp#Tpc`_w)>VmzE*# zDBMYgyT{;PK^tSj!CN0&!4`Mw{5bakrgo@%9BqFb#{{#tj(dz#eiciO14`1otT+Oq znKJYZlQ13AS$)8c#t_&sHb88C)%evH#hV}zJ9+@}L0YPR^}{qD7RCjO1~lMw zV0Bptd_AIR-Fc;NuC1YwM3MNw8MHAr0n-8tt4jXfie=^JD=e4#X zA^PG&`lWTrFk_SZDo7ktrPb$dKT!@nXiO@5Ebm#<_ppw}`nVohj+)b%e#UMon=wAV zC7ZEpA(4^ZB&5Vp(KsALe&TfYweD}{K7j~*j(g|Y2K2Nub+4icZAH={%my~nWaV9C z_0l!#F|H)QVFG9`>XV_Oj8TavHSEuJoH*#UQpI)eiE z2xbGU=-ITeeXO6$w)W8+g8-5}Cg-c{X2dv3x7NP@0DPjm-@HhzN~i9_$-}amYO3!z zQ@zb9M;NNADD*Otwpx^gUVa`hO#Ec5ryc5`1>TJ59~?iaRO$~gHs^8z0A>X(ylWYP zUw2H=G>W)uZb}IOi`)1DI8d5`Zfey>dO+0OZSC zJfxZSHyEbt%>aD`cm598CQwfFYPcFvoEAQHLZw^hYE#iMwy6(v3Ui!Mt2cn_W4ox0 zub;)Gq?P{Soi0mH&d8A2rI_27ycm zM{)f>)%``O?*9`Sd%+&_KcT$m+IP_!^nWV-3sUJ<%+KN=SFC#Pyj8)(uu|*V^#3Kx zmjts$xoYpV`FEd$emqlt2PBWXc93jQa@UdSH^w}9>=6|_dD0*6PzYhslc&-g_eby` z-}AXi9SDD$Q7l_sOTTvv-c%-FSQxw)p^?jOJ5h2!=d!{qhIMJToJsjUMDTURQc`)z zea+f7xvAvtQvIo05wc;vzKsSpZ>IsV-|{9TYfo{{9S8IDB9Qm+sjDzM?;Ogn{E@N} zV29}~L(mVy&<{h=4{YC_QYhT>w2`6d$A+g1KSX?G>a8q{*@Fi-3(C_Xz{x!0`Qu z5=7{|7aPG4_a&UZjhIk+B_j-XpGJPhk2Ks1BwiG~+9nda4D-ySr>@K7H_2Fg+UC8p zN!pSCqi`1CYU0i}`@=~0Yso*{f70%Ea(AUsx-*ZbeKy-9ri4a)$dF=6Bmw3zC6+lwfCVtJcFsS(#90yy z6Is_X2Kbb$WzHAP3kwhf~tW?%ciEolQm>ff0IXU6iX6u5#ATwC@n zNNh!aOaYV1MdCamqufOmJtPRx+scajA9Pohd7_FgiE`&s?sbT6rrd!Phbad}A!n}W zlc*)4G;KgcdD4l}Ny^wTM1;QCokDo6b}dMn!=?qz=}}@D?pdSl(8BU~BhyOq^W~jynN}?d93iYM8 zq9?w}gN+TzVmq~$y!-Gs!Nxw7XG%Q4+}1B^>NN9|45-Ir4JeNqP)v=tAQrL3OsJSk z=9*-Rj}pW}A2GLwPTq>)pu@e|dTDZ!?OquBsoEVm2E)_R7CxVCU*EKzTxRY*vrgIi zHe=8E7;LwJ$!a<{B=1|Vo>I4~1snVD8l8m^X<5N{cbCgf=D44Y?*% zX1g*_3Z{!8cH??+Uyb|_rVAs6dK~t-`fJ(uyqskImGI>U;+Kb7NB?9Utph%F(VcZ1 z!Vu;YI(v-H84s<6U6!g_+dG*ukXsjNPm#oH8?iW<`1w4bj|oPMqv-0m`>B2%#Nh0F4)O?!DSM22vj?uFPUI_w%Ybv;RvY?zx5lR%Rp_ZTk=u8!WyVyq^IZ1$bV`C zm7;KmN!dv{)`#ffEi-{!%Sid966qzNTQ|df&;;&nu-LuuUXi9&ccbn8AbCC{WL=R8 z04C+T2ac1>=7H=k$5rWt|4h=S4kE@WoKn&Zv!KHjC))S!0g!?w$TUNo&D;ZKYU`u8 z$;>w4KP6nz;H-60BT~((KcB#4A!?JmOpc{y_h!)o600nsE1#6vxP->_$!@wk{x;j~ z4cmGvPS`f@ENYgc0U!<4=@$@9Fb{eF+4MI5uufa8OVu+IK>40pGh-o>_$dtPBkgb- zG^%Fk+)gBEnG&+l&SjPXmqI0lhT3mAT9B$6J*c7(EUCE2lT>I`i4)^Oql`*#{oc?C zdyeRCsmBW`L%i|0F*+a-CV3v4b7FA-Kp-?Y;qqPpt_qJIMrWXQ-ulhSgnh&fY*UJ6 z`8hRw=Dbz77L+bX!$frE2J`q}e{W4^#x+nJY(+E8YjHBZZ@`+N}_~QvznbYJysg&M3_wJ^B^=mnc zuFnrlB(B5>b+mCVOv9+U(!FYT<0hlX#i&zvYlGii2BKT5=fj~3Ga9j7=MISu6i4xJ zwtX4tPCgNg6&k`R6t!ri-wj}84-cOgBlGW{Qvkj$anjopkDbnkSUaXo+P@Rr_3NGo z*X#-PfulVX7_T)C&uwn^4)mSe8S20!f9GYAbSAO0DwBmT?0#0#AX+)jeNgJM+loVi zYPgfrg*&QT1dgY86Hb$^iw_E!gsd}>uVzk|?o4`SC(Q@2j}Ifq!|fO6(I&P4`4)dh z5*y9T(H_=w6E==BexJ0m79bNN4ot?doi>61nSgAJG9h*IVDxIZ1ohbqmQG8g;0t$f zPT4JchiI^FAv+Z}S z4Sp20zq4L&HWZf=EH9qBY)c~m6|CqEJN;1I1In1|>)XOqv?^f;fr~9PcV=*G z_)pclQ2Pv3*=BXBHahPvIML?I{TV2!#|n&94^#IxI-o1Ji{-2d>4bZ3c+P8ztGj^@cXD?M?(EYA*qPZ|Ime-Stma1eNFcwA9~u+JKYF&^ zy%Gw{@MB7zVI<{=$w936-SNRod8WeZ!`@%;$tJSyun4hD#57oAi~Gn4#t&bTy5C9O zlOtBo**=eOeTL_@x-M;3)IHil9;P0hw6WC#qXZ>AC42u6w&5`rEU2dL*WPqvsh7+f zPe#SfAwu|)v<3Jhl8BsVWefM`A7tUGAMz-AxzjGGrUi0|IcJ#r`|)0OI|Yq~Oc(d; z@%U*q?WdX`u*hc@659^R)^o&QQZ0N*Xs)FO^1R8NVHFH>Pg;e{1`ljjjfHgCQBxWM zer}~*xq(_??4Ma|%W}3m)^k~nZp7*sEBbL0Y9i##9C)vJR zl~RS!R&n@{O#L13X&$WkIq)Gha)?(W84@RCF-S^qn6EhWh2aQ1lfRx_x5*aSZs|!< zVyP~DL(`;L7WWU)7HcqJlwI*mU_cxcSxLrc08NqA&|~mV9551h0|)fLEX_+5E$);*|M5Cy+NLY7b|<4?7?<*3ki~l#~F_~CGZ$w zn7ff_#}xc^Djv=aBo~jp4^xru3za1Dh;+7gzhQ&+9`jKwywtwRz)!(*M%I10c1fLr zhI!e)-8_18sw}LI=0G)w$LlxIdmrP`Zb3ze<;u#JR>B^xSZK^@VR>ET3<7AT_`@OH z$L?sxexuy4ySP4Cfr;C~R7g@}#4T0KZA$|={#+?g=IapBZgosC#SBqe6< zQp{MJRlF4tOL4uYc2P=@WXcwOw7fF_CZe--yp}A(NZH=ee|%@{k127zD{Z1%EPQ=Z z;`||D_pQXJ^$SFfkRF6FSuEU^#&Q`s$QGV;_~@pml*BGemJ!Fp-6;?jB*w#qEXZnv z5Si#HpbQ`+fI$**v}a)R42$-dPMn8p=zLLT=zm%I#=p(DT$zAUKUKvi`QU^?dtj3fj~yc+7h4IShp04sg5m5$usl!Ngm27<*8QxM}Og%=UB$a+On ze23(NR<~D4KE+0@s>@2+L(`rAZ%&7BTIy^MvPn*w}x1< zLQS}KDbOW%phbC=l2@fzRF&GNE)D_koBaqF;=F-4@xloCv2@ker>xng}@ET zMc9$HlS2)COSr*@xi|JTrg&^0*;VB70rHyu9eHu}$x=*o`#00xL3wQd9l>#y&}5Fm zf*Y&m)@}U@@)E^u+@c@Md%u)2g_o~D?+Wz1+*?>HMSOPsb|+Kt`APSMG53K}!F6oWBRk`y9& z$%s!nRjg?&J~zAb-|M-QIk}Z&h#R`MTsMh(mrOjvWW}`GzY)`|A?zg1wznRUgdyvC z>L!U9W5vbLV#XehgSJhx0EG6Jvb+oh18wngjufk4GU2yiB2fc@9WqAaUdHCw9~~Xt z>BQZRQlIjYv_+YFiE9O_D;|0Q>k9Efb55l;f>&*ZTO zP-8>c4*wO~GLajI-Wl?Jn$gnfDbReW#)YQ%8a|mNsPP!DG!NCYl3Sd*e)ZbBXbUX@-fUthwze6N9iov^0j0RtmG|#UiK$Yr7 zfEgAN{)Novw-i$Dff>8}rb5C&9{`pOk?1cqC(zQ9ORy7~?#8~b4YF+#dLLAGOL0hs z9+ZrDol0KIwzo2BSyGfvXg?EHCZM)c)$En*UrkHP4-WO&HLwPVM;9%DfNNlS9ObgKrV7AF39R^@#8)`Ri z9U`N@W#g~l@ujXQ?ni8p7qeW*pF#~Uu_L0E0On=l3$=1Dbxn^b*dj@9AngZ3GbucV zDtFNn%%0$yW`3O9F}nx_C_7t7GS{L#uCclARawTN0vTlIW-=CpQ459D3dG}P#77p9LAiI|x7*J;PMWKX}3 zb8w*PmW^@nr-_0wJyMAi}|r$In)c%lT5vhx?vd4byU;H>Za+ZfE;39^W<*0y)@T-2N`=fIVn z9!ti1!>v+Nv&bKj3S8z@1V)r%1QVwDcf(~G&7x?Vb{0)wF=Yl>@O`e5dIK$FEtJyJ z*hZ?+pH2e!hHn-ZBijaXTrZtsSmH9|>4M~ZA zuA+w7F_$n7`3mi*qn-BA6p3%&EX>__#mJI95 zB*lx%B*9-e;ZP>e>>VR6Mzs8gcp&6od&W0~2o>lh)hFp<{q+rc79|NS1Q7Z5wFd0U zeOrbXUHZ5ye9*cvvV`GX4pPYmw_*&=9HcTAu_wbI(1>l_V&7tA052 zM0`wJ$BGq`Kge0qDk69Nu+(vKkZ@#Vf3kBpLU>l?0|a+pLiAsrLVQ}ZJ=Sx=-v}SV z^(rpg-EcdvXES32Z?1!?NyJOt)f$YDdLy!dC#BvUB^Z10(miFatsxeoCP0Wf^HY+6 zMluT0$Sz@N{MztPG_%a9MTv8TS#E68UBCzAu{pc+66Wj&$l6BzpTQNQG8khVBwtZPBt4`q=cNwV9nxW7q?m*k*>me zfra8FaP!zmeB6oTgOMrc*RjhkE%j%y)yx`tE%#Sox5|c z_g1PZRjDDBgg_Dqh747e32pV+_Ui{~WguV=cK5UCn52?GNMa^t0+lcX5wR5!#e_j3 zC}PwWFgP*FB%nY*0fXR#s7M?D6@9<|TKn9gh9uCm-LJpS_oeO`_t|^xwbx$rnq&-E z&WmySlJvjFm`zXa7Fdnw5vl8xJc2+P88k4$jXOi9%w1Ey^>M5kkg~!%3)Gqs`s~Co zR;Ka1Ji(J^@MZA)s=g*lp%L4L3K)qmGBcuR?R;a^T9iy;ei)iNC?e;V_t^T)1GbK3 ztZ(b{=;%kiDRyH@PlX?dKh3_1!xqO_%ru~@_xQ<&2K*%ZVEm-lObd91+wW_;(*rGMfVRT?W-}QM&!4Mb%`u*Eg7rn>+r_|_N2D!p z1XTdQ#?EvEVg11HItT~h|nf8Lv9c@EU1Zw29s0fEz64IHD; z7omE#c~TF$jL)Isqjrk$7W;w|^$Jrh9j^;-6z^J4q8Z+DCzm<|WOG20a|fHN!A#RS z-`E7i3tOvf3V0qcNjVZ^>nEJ0q3DR*4*K!U$UI-e3(y+1;1h6xjwAkF*dGAeqapyF z9s~f$?I5WFaNqH63eb7p`*E=GlvE#UVjZ()WoM8AIs=4LI7XZydZC2kH5L6#$#RT6C} z`fc^(vl zHtx!+5b*q#e0UP>Aqh7LNn6wDKHk7_Hh!Qp>1p0-Ykq8;$_fE# zPyQgR4Kipk`Pxo#STwd38XIl_5$nQN2&mC z1SYQdpG0&Y@MRXshtXmgAbxscZ^qpjvPHq5o}w&5IvfB8$5$5DhYVi<=+92>jbP>~ zID~)5BQ^LfsgaHS8=;gVtJAqkzWaL+w^tnsXYy>x(HS%WvBH*9v_C|lXxqU11Cxt> z(u5kzLq!2Ci(ZhR4OV}Hy&ckx;Kg!8e}g!$RRR@P8fI3DsHyy3>{MyKkG0jytLQ~V z;ia)1+!-fo0dGDjnGHur2?o9gWB6p$pnNWk%*z>j7f znK_%MN~E4WLqzu1r-<4|@=m#)zPKW~LNmJtnHg(WuX(%PVG#hM$h@j!_tX+yRR&!; z-I}4odHu&-CZ;q-?r?np%`rt^{1c8Qe)Xyi6_kN4lD=8vlmfi;Ff-y0Z>((M$9h=A zd1r|8dQ*QCuh5$EZYVwcR~gImt`&By4!jGcRp zdmUAnrTb(X-CMP?YU_46vnW|AV?xT3kq~3)K9w&U!2X?OJ~sQe-CwqHy;)xIEX%Cm zU{mQ^d$xk>$^S$v_`s%b@4FJC%0kWn1`WNfGJls%+SQiqlK(-;(p~mbcsVxnzSiac z0`~4f)26P98CfeW*2gcfEGSHQrKbj1zI>(fq*Nje$Cb%j``Eh8`@?+~sx#%fO}p+3 zD3P{HIiwH-X$c$B@zY_8x|I2Ae10K@!MSApf?!%E_vm1*y{?O7hT13_)3Ib_M;WBx z3LXz@#T7n-$^<(iDKo@QV01f^M_ba7(hqyBPW@_|O%D+le5iTBR^Ef`*YSU;^wO>D z8aZ0M-2|ethAiWVV4-fnci04%b5H4!A6Gf8e+bm8VP7p^2{exN%`$4&hC5E%&DD0x z8wrQEs$0q=ltlVqEh^HPXpmOP-lM>n32nfK*OKsabbZmXj^`@2NNemjrvb^F*#0TZCH`drkCxI{~)JYu^;}-;;bSwrEUvkK{0nC%gbZH8T3^ zjln*@pLyY#DoasAV*qK}lypp&{%X?FaFk^GPIhE_y%2tE(aaOV#ppOj*&ZBYy47ya@vD`naAFbifsS(J2_A zetx#pPsyL$dk~&l$Vxa3=$+|uD=?MxL+Fvi19>bku1CJO1bg`hs9Up5*<%_^+`{`} z0#)z_jsD$gt>szr8d7_BZ-#O=dxR=k^t9*t1$}FQ|iYj;c(#rJgY?6 z%_NtBMJ$qOmBf+mC3*n)0HsJ%$(p5xFEly}Z$4?e7GphOnP`QzVc8b$KN$s!Z2N zoZQs~z0*!!1dW=R^iZ)ZRj?KN;_}_5{tllub@#)ZIFvi(eu4W31tDQaL(3?b{Vbi% zCA8}d{(KwZ-_qS8BP1Z5B$yJ{zK^yM%Pm8oABO_AcJ(3bD$ywOvc)p{`2aoQ8HL=J zJ5O50PncUxdw2{tn*q9?b?z3Sm~{?k3jr>aJ4dV|9e6`W53>H><-Tg(J)jyIqi?=n2uS3=|Jt5QA%-j~Ic5{^};qF$MNDN~} zWBEuE$lmXeFxfH$pky(o$m21#kSCglC#UmN=ZDO$*xcLm_41LS%)6~EfsKd;+8XbE zP!gt=311j0tL_)99DC$n8FAe-US$EE)?IR_`ACA%3f5iUp)e03-Uv3F#&kc+AImh6 zEW>CnpYdS{H|q&!m4#kcuu$?Vl?+p&(o1Ypbni|)Xpug@2o@yaZtApa!dwt)!zrVE8%L`Bs{xX)oriPPMq8lP zgW>d(C4!osJDg5viK{$S7Rp3x6NN>(**ok7)2F8Tkm7KQ&U8T%S(Er=OcjN8Y7MfX=5O^QuvCL>KD$(=bEisZYhlO`{qyy`)UfKa2Jj~ zV=eZS6cbvQAe+HIuXrW^2ToqX$Uq>0FMNaJBz$2nt=?^|eh~!PYpb?T+(4_coQqd6 z0}9&*A8SsQ7>T71Sd^ zN9apDRly+s1IjnX9;awxw{lXC4^7?aQQ%-xv*t9-w^@M(=IVatwg_hpU>AvS)Sr)qB3NgbR`0HH7Ipn33G)W23U z>)R#uFOY&bgY92C&9g0`a(j=mA}vYBPfgo!A69bv7i(k~^8E48q8GKF;;e^BUN(~g zVv06+O$4!$hD?8tWs60KYtURj|cuOo!OP=o*>wkpsm?if3f&A^+1Pk%nQj^cdx<+s#pm z+u~_>tku1a)Bx~kl3O%mt`<88bsEWbOGF~}Mps}Fw}9iYKlhk%S*mx)hTzP9);S5DGPxZ#bO`c_n1id) za@h(wV{^3CPoxUFP&`B0mkWK?3ImSl|*R_|+VC z=ew5hkIDLD+B4mlth(@%6Q!mKm(X+z3K=BTBs^iyH$zKlBvV1nNk<VZ}>~!K9NVJRKA^LF3rm3>099KzU3$3FhK+W^90z;ebs~D z@V8jK#Py$hlIaV#WvaYFc+T#O3h(ERBf&3qC6Lz4^ecwP!U^`D{o!yp0=b%{OvNP# zB@*ENrw+Dp^4-Y!96LB2ZR@da63fELiCe_E>_7@R!|7XDAwgIMxVd4OMOA;Z1J zuvSH`vZPlmjAbJCTn^zX5&9n?J*I6K@1XeXMeK4zXR+OhC*WXgXu#nNFKAc?IZU>Q zlgSe_nil6o#$%~=8@BvnIQ_I9b}=jCH9CASw?hSfq?Z#D`I0LTl5nhTf~cUhp^Xk7 zLga(tBQ+B{G;vV&aH;;c@0b=0vnOA#L&60#BbiqW9BJ=prGca}q@d#?W5a#O>#ft$ zv6H!HPSsRhOUGH#I{V&dOd5z>pUIEBhOF@|X$|JuBflsqKm;XRgV@O#1iTD8=M}jm zyr)++l-dEJ8en^unJNh{*n4G>rp$kzMVH&@ax%-}bGyF5WIU|eji~sDY)jq>XF(_j z;S{ygqOYGbhBiSL<`B3z8%()&Js$^q6 z$H(l@F0TTj)oQDnppttrL|9li8GRAb4Bd`H^=s3H!J@(r}+w$FNMteSO|w7M;g- z%O=k7It8M372w9ZNqB=X{c}CvGpw}WIHNYrW%1s(_b!kPYs$aEj8 z&)M`I9?nC~A}H8C@vlNZ6IRFsBV)TG6Wv=oF~h27_I);MNAd;8j|4r=P8 zC_pyQV-la`vr8>YND3g3N1almPvrzHI35lVC4fwc6q&|xH6N!RJsMV_$>W3;8!V5k zi7tfZ^m$u$pJKR}@9_UYeR(ky;nL~ZOcr0{WFV!6&npti4`P1yxYG|=RclXi(;KWcK3%Gai z1`~0mO*SW{X%^n1TEBk?U~LLJ$#H8KER0CP_L7hq@j*>})28R{lKu&V3){@I;2=~c zhEYx7EXzLRm0U2|y`VUG>&UNaqGA0l=z~CD)}YPg#|B10zJ;Oqa$88FNQ{^1c6il| z5o7SrQ6%9c`c25&0rNn{x22;+Xe7L zzorZ^RIk@(BbECh2;%;otN~EMcc#Z{GG|b(s%mEv8VlF3DPg6W!iWwI6Ga=F$+&N4 z2TO~6c>pDyWL|elFH1SU1ci?f`Bp7g8Mq=M`wG^hP2qZJ=!Hd?r5UM3Q)<cPTHr7>LPnWaZ7?clsp!jlnWZ*&X4_Tkn7%5eT{E zKNwl9WRV!Ff3xJNeE4-ePPN}e0HugxQ@9K3+oqC9Tne(025+M5tQZPvW$gN{tt0^6mJ)1SvI`^3vxfY$I(B58#S2ZT?; zf>=xKab$1A8A0PxKeBPXQC2F;3pOhjrRc<6qEqe?oz1P%mt+aYm9wi9hhi+-1ZpB= zIUeaSehl(=N~el{B3;WL?t>j1CzG_2!2HT=u4}@UjQLNY%2DqY@^A zlp*o?_kv04?ssf+js2ijL{Z5_jD~gSCma zs|b#khiKePErHCbhZN0bWV0i0S1wRi`ABumJpwb3&|3;oMcq~ za;+TK)ZzQ#`Z_6>Ax>R{%y5@Y0@zz~&KQzC!6@?ao&@-gzTgrM$TvrZ>+l8;#O_M7 zz}4&Mg#?kpwv!5jG`J zFj0D)GD`B~go_xa>O!P&lb_C6^uY`Z>St1@+D2M``N-l+K@?=p-)9?5L)YRz-OLi-{3Nb`A zxhb|h$sK4re-bV{#iE^jO`Awwy{0Lez&4f~ZYWAJ@VKZi;-W0LI5J}Yw1ZAfhR6C3 z@zN#~uHe!T-L+qZ{14HdrYDDlKS`X_5%kF}2)q6KVEy>Y))A}QFKC5VKA}OI*4nzI zV9`jOzVD=c4_jRlKBE1Z*6`pu5&yjW=KOaf)q4cvp~%5iq&rVX%26>LIftp0xaW|1 zz}l~%e!_?dn@`bhT)vDIa?&72n@^i3O)YK>J832I!Q^1HrEs-N*4lu0{$ZSLx;TV@ z;2y(YSOGj=)F*HOFEz8~l89yz=Uvlux?Ai8H@mEmOt@^X!>qYSqV9pqfmm9`5kF?joCVpbtDTH1E_{3j*e9@Gq+ybYukS>8k%S4Fa5EKd zmSQ1Vtc~#Flye*7sLw0rOH~f)7puxa{nY#>*@W_wxQq{D_Jy8wN-8Lk$R ze>L<(1rrdDaIZ}87coW8|NV~Bv}hfw?11?y8{u27hki*vQffGg4OEiuN^;FDvS2_x zMBTq`T$av7?I(n9#Pcte&uvk#%D}T713L3j<=t*GvHI229m#BRszb*{h1ercThN|j z<%gP{DSX;K*AyNM5&=>xBH+|s^umwIYKD5~wg4$H!a@TuJIVp$%RW#o+dczr3S{=N zfn7^B^NHqNfkgVCU&K;v4qy6yw`GoBoe(T9RGckdBp&iU8ZjW1nF<{eKygChojg6> z=u7b!h%Dnpu<*e%Og2)qSb#uMXoDgHN5P~i%ptt1K;{a3fNAS})`_CxoMDuBGMy}1 zkFQ>l96K%M{PTVj2>IlZ+#V@xCf6^q(LYD;^_uWO+~OL---*7|QS4G)iVfjuaeR5C zA(>&L?t%|L!$VC7OO`PQ2N=xB`!8hG)rGUneQ*EpJ9K}U^7RZ>PZg7B!~n@lT3OS_ zD4VQsm1|?g2PIY{hIts263_waOz8a{`8=WzQ*!u@PGR~`2L4b@FPD^ZeQMfF6gWRc z)S1$1dJPwyLM?0ALj|s4_!^no@SjDTY6{2iPEkBdV-ai1jWCS`uH}}`F2?_5KL@(TJA`YDqaAqf z{T7_7cp>&hU)9(4=Qi~P?fYQ&{R48FBwe%H*<*#bWXecg78uY3@e#H@QoaG?x#<+S za?g#RKh(T?F#-rXgykrlqa%i?^3(yA(mhCgas%F8`JmFx=!MdQ^pemFTNxj)fe*Se z3~)aI0JOa%)@&XiiW)kWQ6e5BnA+Mt+&Y^C+r9U`F&4wKyeNkHstr4{<{Y5b91glh zOZTz4G!SYFOheO7O&_c{n4i@#P^mj>%rp@|#{~w@91xxwa0)Yjj#}#^`rgVIU|tcX zH;}yV>>(ngeY`Mix4{abeMjk(}^91zvbSXW(AGl!HJS6;}~qi23}vG z^Q=wV$Qa37PenmLcpWgteRC#f_{p+$jqEXHwYg-f+5z8WWy1n$)ze22;0JAldqy+i z6@tz`699l#I-T<{slp!;6|vKHys@Dsk_*OpM@HtCQeK2}a%PtI6Xb+#V7z&bpnSOFO=i=<`oYh4YEs>7PSU^UqUCGnT6KwiVnsH$` zv2@}|zeWNSR`6{kSxUl}GNxNa2*gT>l{uGn&lA$EtMpHa1;Syih8pc!naX_-&9X+d zc>F9_dl6zbweO&Wl<{^uR4TM`4O;|Ty_tBoZ|IQqu0bj?cocj*CBluM`?PWS5G6d- z*DGvp_E~GXF8ol5K9KW{$mG2Cu)uUi!?Y=66#>aNiTAmf$OFhY0=G<^I+f?)use{v z2C;jFr+{=KcM!V_-m}xvgC>)Z#=0b;&K^~V&d0!yVTNAgydJ@SRs=ui^cJN=c%;&( z5I#wb2Xjl+w7kHpmDA$tBAbbWi2%~b?;dzM#0no;JsrSCLX@V0zFD=7-&?KQlqpbm zjTUZ_#KDWwi?Rn&E34uIdS86XDCdo<=9(63!}F#SZ3>&^#4pw~ez4!%`?OU|J(-$_&t18ZL?t% z>o7jpQ>5op?F*C|c3wKO_AGConWnNAg_iDOqTubmbD@<~7e2{aAUC=p;^RTjv34#; zx|1xh%d8L?` zc@)S3ZpIB%e5>znAm1LItk?~H4JwKexUjT37;sS)5p8i$4^fD-Uw9JAL!ath*|DFL zXC-WNvG1I|kdm0HYkcq2#G$z|qS;~gyGJV>Zzkazq={v^*X%Zgy`+q=d!^z1=A>60 zxhFDAWe^Di0o}>69PJwn2jHd@vB(kwh2;eEV*X|$*P{9#IIY`OHc1P$MMnLa3@T@$ zx{BFGKppPdF7W{vEd(@&wCo4HnjBVgD z`@IA@EeYhtWM*87zocslBC~ZW>%Ue=ZEya&EX@)dm@G=`=GY6t@_hsntnyw!6{#P! ztzX)=Q@#-|TU%L6lA@7d#Yk}*F&<3>4GlB8foG{RmaSW(JG&mB{wNqH4XZgx%aKx;_TG$a!=@+DcRT~JvmQJQy&p>hc z$uR|RE1G%oR@=ZnU)7O&Svcsk(TD5%?zUVcA+8jZv&2J)g9*Q8-#M%`T@QXEL@Cs^ z4bp#~-X+62#M-AagHDe#oEU@pfZWi+*J%vF`<9|@W2nzI+jNIf5hCu{ z|4ZbP_AFLTVdC0Gq7n7Iq6L-aX3b9|s=Jv)g$YM8+;W&$L7NzLE;@lWf{kM_k&;MV z)P#xnnS@InGV%Jc$=3lBVCO;t9aw-J6KUK#X@()4)$pYLhMVPM%iFO4SIe(V;(?IeAz(!zACCTuT&175908|fgp!w}1EP^5|hiZoUd3Mw9p1;N!+^EDQ3%4u3!w?g8m&!~_M6vXIN zv7EM1DZ;v-BwOuxPm_J+?P(p+n-IhN;Yyey@9kmoa<5Yv+9Mz!jcF4G^9Wq1qrui! zn0iJ^>0x49w048x`*s*6c6v>Xfs#>#6^2=Xj1~X^dW9f891}eDvO}o%U;vBgvEN$( zAjKx58@WyJ(wP5=+9*q-CKN=qTVZQ9nf=kku>-F?>q<6+jZ8_^7|@xr=zYHCndxK1 zOzasL%|<9@?Fir?Do8p7s|>(ur`u6)Fazy$v#>*9;j!*<9LUIH!42$_BjtQbRvJr3 z!)%F1tf2K6Z!*7lK}VkjVMzCH^S7yL{s@x?cs6-6Bm4wKuq}R*ouyH3m_A$cs>d0z zi2MXiBk6^*iTFGZpCij6oURlQA~NV$Zsn(I7JfAFPpzy=rkN7hHqEYU%7;TZRyMO}uZ{nO2=TPN|VPi`U>9 zaB4BMwlDf;4Z$k@02hep*k3|Ki)ga6Z_D9?UESPHN?Zk{o~7K#FSb>;Pw+XW*$jZA zI#PTQM!9)bZ1K+#-q4TbWZ1ijxjQ)g^b{2+s|^pG*4xW<+*a5(WXbp;YzipnT$C&8 zNcoXjW@6ed#O8E*_%M%75IqBxxKQ$97Yj&gW>W?>ghz&exa={BmA%(=N1YI_uq#4? zT+{cc^-)q*reHuzZ{j&>0}rHTHH?^QR!6ee@w%3Vw#zk`-3aX#5>Q)&*;pP)I4-q& zm<`dxh$8E4e&l$;>e~HkVQSh)o;3BBn1mKHn2SHwLpH=Yc zinUYM@n;2BFtC)uV0msYVX*WihQWHTEDV;{1`UJd9&@!Q4!J64>oR4)E!ewD7cYob zj!IidWg^#-m8il%QXO|ZP&6!&zU%pjrfD%!uS0B4<#ge0!QPFhW z+QkZj=HJ?N0uKL5;O4lpJZVLe*kVo1f;B6q@jOSC0G8j?YZmy0MN9p6)v*iLyv`3# znAPaCr-!F5KPlD<9k7DysMj4Tun5$d0vI+qyBB6@TDk?5?ckb1bZ* zae6w2^g%dikq%2=D0P9ak00RcZXzl_#;fnam0CT*2xfZC${v-S`z*UYZ+YQ7-ru^K=b5^#V+3nxE?7kg&2SJL^IlO#6Z2 zdy1X7$4q5}xFo``j8u{^Qjo$w2B3;krlp5nPs$azy~)FvnpWkIIl!dS$&-13qkOBl z;e5yp=LP4M*IVFh%TqYlmq{GB4}S7ElQ@pwdF=MwX8FQJcj48e3-&zMAI;6NDdRl3fMr(FL+9rk}9a zNH6d6zh{Nx&3fO&YUzf5Wv_0tFGl%gz)+whJiwQW`CsrntbOYiwV?XE%D ziZf;^Cgw-RrO9`a>d8dm}QABSBapJToVxP4+Z;(e{Kk%b;vMC)p zn-73mnh=EWnQC)@>neS%TTu%G+AGtO(Y#N*0L{DG_9ndw0ZW(0H9QBqj=k1^W-O+K z%zOy4Us?0B4(M01KLi3Rh{30_xvuokthv^-(bCYF7^Tc~j(_i0zkVSRkZed8Z{(vje?O78t$QkI8sXvhDz88^oDb*pd_C+9ZE;z~eeC|OF z0~vTwK;13ROKnc~`mR*DUqTRKwg8&OO0d1450YjW=$IK8s~AI}>Bg`K#Q=zr@3lwN zLGvCjY0b@3RaJy^MOOEqSL3;eWX$;Boq4RPGrTcjWO<_m&o3{CxUoE(b}P*#21EU| zI=qc$lcS0r-&>L>REa>|F=xgnKf0fB6h<;dTA9%`(%T# zc?jQ&^UGPP8I(7He#mdApHk;FU0J|gVVt46eS2Q~;-GyvWAA-o2?c-+-a@`O^#U4eNK1f}M$;0lG95E&z(sEkcCLs-jUMH;zcs=;Y8${sD6qL|S~CLF}6b!6G5X9i7B0&@!AyWy7*jU@J8LbLbJ`ta2vB_tD- zjt&P1;ACnQs4D2_yZ--BKcRzUFQ~~eD%kVzB zAH2W%%HaLAYIqwmC`!($;l_BrX=C9Z4PxJUIS|u!GE0aK#P$)w#qb!&JjbVJ=gavR zw51q!@p9qKmfX_aXhvGEW!tG_eT7V=9m!CJnYj;0R89?R43t^5J3X)xW$u5OeX0*X zbd+fT7~$slQa8x{!nBD$^9m;oWu6W{`%6XF0WAgS>4a%73B(&ymHOS zedLt~aOmnQuL$-Y3nAXEvlnq!=`lOQJ4ig*k-|W5&M)VJistJ8svs0((P90`-eNM& zb?YVL0OZDSKVlIgj;r(;)pN+ke=Zs4>=mp(i^~g-Ak-lrN#srQ%U#A%8jH$_=1w-x zq7>SH2m#`aVz@MuaXw*k(LgfJcWaaIDBp9bI$TWhBlu>N3E}MFF7^CK(&)n{WKz%d zQR=ye)h)6x3*fWo44cm{@EnFXLImL3q(u^SHm{qjqs-%dyFbcL+fVFK*gCzvhu-!R zfVRB`1fepnRw)tCR=*^g_YX@CLBBvM6D(#Excw&LNG7F+%p-W4qXv*nrn~u8ck&QM z(UBge8_|P=4Y?@gKf`K4#spV0o-yJo%su8`oE{OemDC4(9XcNzT5H$?nRdF2My0{) z$&nUozooo1!&c&N-E!loJSIGX5G+)_3MjG7GGex*hiP_b7uQ>HB93#m`8ARj-^ys) zSt#nISEMK&#$b*daG>#tim`T=hH79_@&M+uySJmW;|zUXXU3}hadn0(AFemI1^kN; zu8oix-^BY9ENOsolhjVF*EUw6cC%B(U1xkIC~BZ#Mu!rJE5V5{deTPJ2}6`-lm>>( zwC9H?KpVrC;Wr+CoJIWph;wbFy^lNn@%u@M5-5decn^e1n(p(px3f2i1Vor*RGQ~V`zA! zR`e2uAkYI;L`=gi7Ia}4=eoB7WpKcOv0V$kR*GF79VRSK!d9a+*=pAE@g@EQt!AkA zsg=U`VPU64a%B_qv3?|T?HdsNe$+S+`k|*1=nQ{uatXOk$$RBBq34GPvILFlsUggb zJv>i;!8rX;amLy;+G-bmMcog(h2w}l4sM`ih4If&($su}wV|sP4i>|sprFFPz-Ge@ zZ7UFwwr0y4gWHE8mwZwthI3YSX96u_XHmhD62|qLgbz5*$Ob?`)vZ~M6lmn+oc#>t{!0X~Ys;0o) zE87-GA$73sYWHrMn>N0cr8Z5jZN)HVhk9Zwne2($3zP6cjMXMs;B@{RViRZK{jiXr zAL=>m;-%e@Ip{ZQ6w0wZNs;K892(rrEB2T+^2YU1`F$Is zfT?@*wC-)DcZY0^-ys(|@pve)TABVNG+0PxWB4)~KKTdeXd!$Rue8P~+JtT;Wi*k% z!YzDoZjg&xn^KB3O1}at1mkJs=2j+9933!f$!5|V{bXv7Wbm%ck-_P@5?Z=`icbF9 zYiOW2l80$W@1WWWwY$^()ug6ispxqQ2R$KdE}Xd2P*zSMo}A24R_DCC(J{!9reS6I zw-YL|knts2$ZFvl9pJONq)+P?K7b#0j4~@#t4t#{gYH6R;huPS=_vuJ&7RuC+8==x zW2`*QeZxM~M&e8Pe4F+1QqI;sga0Mq-Kk~p162hS7`;DB)f)hypLQ>u#69_kl6)bO zFn>0eKPP=H*K^^d9fpnqggKJNwHyJH!G+HeP9i_;@jS>p)?+WSRhPe1E~KEj+f~}| ztwJxLanJ)DG%*L-N5^7_=}$$<*|IN7+r0+dWluzA%cPd%2iW) z=OZgb*ev|PvwaCE;%0MY6A8YI0(@jinQ%qU@o@}`A`TbDTYL(%dZHZJY(UD6XN z9GAEQl>@b5s!(U;73U+O$I&x2uH1a;IQ65n-Km3pIItvqc({GzybZhQBrKLCN#L(6 zb50Rp7T}@bF*LVz3NkoCQ>Og0q>`Z4OP_LVMgz1<9chmZ=K;#U=mJT7z1yvF2OLQb z3mEZ=;iZFqQm+1eKDuAH660>`^mM;TY3n@u`oow-{OebaNIY)+^F59g zTn2}4VQ`xHuk={#1)t`Mfz`Tsgbnlpy%LLN#pZs&Q>x2E=2ZTsEPl2wxh#Us7i@^M z4?t(m+$@n{k!QKd1~nj|`^pF{k=OS+Bvi;~o@ONMD0P5dPYt(^+{tBPw}?OUVcbr4 zrqU530`q}sb2@1%uXkqa^RME^cl7yqRCUt5TkYF-)kG8hFIgd)qdvwyKz4q+N10Rq zFnsG6?T&!DF1#-PN+f1&@mi9>&RwWGDlMb6;cQ zI^TZ|C_=#@y)OrEU+m{894@?&>`eEkB&qJK=IGX(F~tZbOb zGx_E)qOdhY(pd-6M`ZL*7i1XK5P4w}FBtvQCX~e*9An6=I%~d~6cE!MK8i(2q)YCa zP_cv2t8|E|5)4EUsmW@ykz$}!lc37u7D^DW8ff9lEL0+F<-<~Y)!l@P2Ew$;tO}B} z2j3LmzoXy#)^DKrZ@jLlsk6-!A{yUq5gU$|G{#7}ibBB*)ZF)FI>n8WZwe`b&jH zJK5+Lr>6hgP9cGQSNu(&)ArOOIX(7fw&vAtS;(l46y`o&2V`H@zHf(}7M~+ADmxd&)VYlZQbQdmU5Q_E z6M^9`Sg+AX&c`^nu(Zc{I$uyXoqXgJ2VuB(CXp7&|c%_!peO$oluE+^kpO?Q|8r4u@;NvmNPhT$t%vX-(#Aok zx{(z@y+9#8?U+TFOX&+|fMIu(aL}mAU3^DdQj`&S2eG?dy0`*$prwSk2X35!;@=<& z*cXw}P#A}8dc=A)i60Wr!CyG$LRV_Z)^2O*e{sJL6-q~Ml+V?E$oUo{%I?|)EzX)T?Xh14L8W2sVnxrDkIt%Ya+w%h$X`-t~ahpMip`j(% zkWUa@7H(Lq?}W9m?cq14?hr?lwr>#;Juo`D?dm^=+J|`p>H}8`jPC-Op!^!lQobK< zVLo=eJX!RFHp5BM{e!)7t@3bw(75t#Y6@1_{*nGfqmdyn>@!SWDrByxRh)^bO&I3Is^(X7x5^ zTW>5uQUwbC05S8n^@=s}y;mFtmEBnGRT9^%$XFc3;2%Q_ z_Ca))fo;ZB0UpmyOq3lqL{NO0sMmf7$uKZHp?9_S2x+9{=zyj(ovhiP$J}712us5; zzU}ErsV0=y*EAWneOaav6?k`STWY3PQ~V(BJLq2OBWh=?ynpPBXn$}Gtp%^>M)(7; z=&!Wp+x+{n#T;I8YTWNWIVi1s*d};* zR2)dx(nsEi`{L7aUwjI5>yje9b!Hx)-6WkN5Wd!_8e7*#*f5pDKW<%`H468|d9Mx2 zR9Kk1qPhsyQjgSy%fuK^0@{)32<69XO!x0fCt*8%TRI709`O>pRedvM_6{4{;MVbyIOl(R@_HX`rbRG$i7uq3VKC%@m z#z$Ktp@MB33GM6Q;zi6xbm`Iv^i%mRc5DGI!R-kzlM#grWm=a>Pv?TTtB8zYv)4%9FFbYT-_M&!yH$^n@ZP_7ah`m)o6v z1GWZ_iL$twYcQ1iPgrdYiBMVCLdV6YguzGvktBNif zB=qO_1UKy~E?UqkrrRlvOw|Un9>CtYQ*y!PsMTEX_8V_QM;s zf*^_}Qo~7w8`)9E=fiDm9>x4wT)5sZ+{uMxsp0}zzsl?LYjb2ThVx~|#vKZ$0#=PD zBzczBt2jJ;J8EsuKT$1<7^995HCB=hwo`4L{KVv!Vm=f3OB#bAO1`|RFR+?*0X-IU zWVAH#NvFkO8VkYN-GpKeY1_6ywh;W)pp&)+wft|`fTg`+q}CWqA6^9_1&xN~Hf@Q7 zB2iQ^Cc~qywh2S3m}v9_B2Cax*e-3js+Xc)`m7&?x7vBQji(3Nh%0yEIeG0EXaKfl zWl-+Z_T8Uf;*rmKl^^55{fqWl{b@FDU1v$KZ@EmYxg4M+0P!W}R+9dZu*8hQYK?9{ zIdSggOYc&JvrhbO#dLqKPct3S2bt$om?sGb7v3by!2Q5Te1gAz2awE=;`0JSf3_dr z9mA*V!9l(a81Du{Q0(YUP{g=oA;5e?VB;s%oyq9P`hy32c!&D(j4>IS9jVf=w1!sa zFPms*0zJvhI)vb~OyP6B8@A@>?;@vlO3FN*#Ffj~xuN+jfM=*+WWljGENE8i zmBP<1hO6U5voDLU7YB?`I0(meKckEs*NYTOBO&+uROw}$s^=st$-B+7Y* zfKV9g;QeR>?~k^@E~GP6&0B~va4ZX0i0~*iFbmpE9nAJ72lis)@nVu|hu!#BHl9%P=)a5I7<{wtyRE-!jLE)n9j{g{*jEsP zU9)E4(#4C`?R)yzj3w!p3U>9ng=>#4$4N6&B~E7F*%$E?8T-PFNA@K$9fQP4b9XQ7 z3w?Rn<$|l&mkLg;9Iadta||yWV~#l*FcdhB1a_tbaN}-(k@G!_!a1Ew4uRA8tVB&C za)>B!6Iy%$4Qs0KEv4$w8>-ibDbiL4{s9* zXVC>=fxH}&NlL_18_ypSG4H=p&L0GZ9qB-yx-llp;3iZgjb@G1n~DC(cs!2}m7 z#506VXjHOZXbYeh)Qc4`Zj)P$xzp)k*~AJ0WOk&s5TL^MQBX0j>Iqyy*plmYeUo|> z2#XZ65RQVDN>g~9dfsY^6g085=%#!to@vS;w6Q488@Q@{3XPbF$ZTiBxx|#{UbuzM z!852!f2{g6SI^+%QmgajcXiv=*r?n_O(>AE?Jhcw@Q`*iMrj;`X0c7@s2++-nW{zB zF+*gs)K*F0O846_!HJ|>UU1^ZSAf7yA>B{34cP?Js z!#1~KVW%=YD3?g*%Jr*OOnvvdWy=?JE?cp1`MO1mJ6En+yn@p95Xr@B){r|v>9!Y2 z2CPi-G3XBT-!K{ZE8Szt;Im!Ex1>sW`clwY>1jdmNQSS92(CpHygrw&1Ka|{u!o(| zGvZTtHpcTUwp3KdCzoeAe9@M}ivL*-ds+@zHF?A9fwR<9up5IS`+sM4tAfX>;G32% zSe4Zys7|KheA6Ss=tG3j?krx+Z?c_RY>bq~Bh8+Q8pNDVv^(POYTMsZ6X&ELF}|k= z2OwrAQL4{odBYd+oY9rKrDBFMU(ie&trx`%lp4rduC=&A1W((!*mf{-v6017wnZ%6 z&P^<}y;}mNZQN{Xq+?MoIy$kiY|=8vG~10XnaW^sPs^%|sj?A!U^L-bF!6+0TE1Zy zwa`^(<}#TzJ=&T+JOOKw0GM=&CBa%f%#^us->+Pm`=20P{n^yMuXG=K83GwehD`SH z{jP!nRBnBP$^RPS*{b7}qDrFQYNc%Az|`PKrHI^?;EGFCG91WK zPHa_~%&IcU)j)}@7O!8tLRxD6RpqU!R#TU079H427ORRhWu&<};Y4p-8vd9ps+10j zZ?0OtZi$VJ1nPwurycvW@)ZCjA^boTE1*e98YBmt$~tXkvXfJ{K`+f zuhq$~R;^pJwA|>z<;zwqh#!cuaOCUayQ@!JwRYvv?^Zz-%pyw#*p-#3vig)-sbpR% z_(FTHx(o}fBh4{F4vwz+rY=;@vp>m)*Hr8(J*yWiIj%IQ`>)hhqgB0Oun zOqMb~!c=kmg4NkT7B2Lw%T}0agV#z)yh0nUDS18ykl#d)X47FVpVc;R8K)% zQ|@WA`SFQ{r99+`iYH->)RWpL5rAm{lZBgCtZ7713BZ#u3YvZL<(?@*2<l0;W&ke@{iGVS^ZzW*oxIea3@!{ zJTzvz5h>Olt+*_o3#`@BSft!RAbAzq{1Yvl*xZfyTP!1mHzRmOhI`>U|6l75-~R(<-D_UWr$%}+m2 zgA*_^`p^ikd+hrRupEA58FB~*$ygnp{`>~@7E%A+n%**GuAzGvD6S&NA)*H8(pY)i zZU5qYY1m90%C~Y9s$K9r*oMjDa^nRLdI-?L0Qq8YGDm6Ca8L+ECYleR2C_1c2Zc7_ zskB@qAfj;`K-FX})NX<8T+*E$9-6FSYHq(e^S6cAF6m=ROW_gS{Fl)qP9mkwI)fpE)V%T2dIdm4BC-7R^Bn$!zIf;z9IZwAalf zJBZbaAh?qf@^HC}qR*E+Ev?ikc`mHYc{Udw{_B6ChPHND?)n8^{0Em#^TPP7D;fb2 zBbyNJmjHQb(~H$NBSlG!Rx^sG{c(UIyn?2gyiN;ED=4>gIqvW$*tFQ zr&7t{m$W}tVRfV$XA<@|BBX7hGLzvVAW#TTX#go|R31fl}^9_rkq&%Du51&V26*l~j0jHU#nx=8_(% z=t+S|(_eKcD@H2K{|W;i<#GwuD7#o{rZRZYp>F`Fk>N`QC`A(ohb zn!0b7+5r{9O^h)tgG7c;y_y61R*rH=isyb5_?Gdz!~??ZCy zD*ba5&P;z-A*Tyi9CUV)z^(KU(`^_3f8LZEi zoz_f>MaNWfRLjP#C;vZED>yJK@-J8E88m}TpvJUz!P<3EqOTM_2Thtih?m@8iiUx8 z2d|EfKmzmn#jBU~oLDVL@2f!nie>nhr9CMt9sa{L8C4nzS0B7AMZ>C0wew094l6Uw z!m5Ea57jzx;a-M?tNjJjk(F|YSNI*Qv85f!#_GjuRxVeXc0C?*p1Xp5=3k(5P|Oy5 zoh(46hP9}Vkey}B2&GU!Sb_# z$v89Xc_Xm{QpAuaM4$+3W2O6h2mRc3V9`jBL_&yuKAhgrBM?{)xS?`!XgwrNCUvBT zVp>K-*R0yBaMFTE(5r>nOIXaRN|nCiCl?xiPsv#_2ko8NHe4@Pr~_POIz`} zC$X1A){PdtOYDOhR5)HbBOQJS_my%v=^%7MJ$rwaw&<(oJE2*|WJ+Pex#Xk@U(XSc zabtS0L>zIgjbW!WafE6}Tne*=J9ApgU3(H=m3=Gmr=qY7^2A zr&$lX+%;GZr0x_fIn$4TvW~-9KzfpnaKF(Hu{inx@QTq*ac|boG%FC4qSEBMx?sUd z@dQ!t1@s38 zhi@vR4XoWp#VKimF9vuG;l~!P&OB=pFVNbyxKIf|8?6mZ4a=4K&%AR35>!+8Q4KAP z3QwNmlI74O03-w^k1*Uz=~l_>btpdQ$@7RgwBDyOt*Kff>ZyFIFwcwaf}mbl2<*5D zw8G5?qo(O`39UWY#sIlhU+ypuRt~b_=F~^ZhtD+X?(p!yN)oc=Sh3+=7Ha zxu0TTpVk`)1O7j>8y8GvKjmy}3xO%)sV@%GtXqUC$>~H6&?Az;m|NRc`I8JmM58Gz zAf<#B!gi-j{Wl0Hf&kXN(NkV$hEw*ZIX&2Jd)_+KX?8j_;wI|+c-I@jD(&aCReTm2 zCy|rl(bl{L)J~zZKbMyigK?ZqYxdii( z$!w`#v=QKK-C}A*skfx8QI222jkYDw>9lB>XAfoDnv}-B^V0MP#>uvUJ`m%EcE{o} zO@6as(dYO(fOe3zOgt1t56!hXXZlnv)|{p!Ck1>?w8BrN!_ARILqGVc$;myp%#sG@ zP}=H@j2ZgTMkyMRLkTJs8!y?ZC*Y28`)s4SWz^bUdioS$vQC-B_4-xj!h0FVuel-q9gUl8KO@3Iw0%wk!2sUZPNbia)_YM{ zORr7}AFe_Hz%dWhk$)omi7lremWY?dN`T>)FlKQ`&rna$(Ox5BCNH+(W?xZm2K#FG zA(YBK47%Er>gNEV35E_IV%J93qLF-$(1e!s&Ghqio#~sW#=p3TM7LRUXEZHVLyw|I zo2PWW4a_IC+C&CkPH}>P$26L{s)%4wi6@OY5Y7rS&4L#b_2&#`XmBqvyo(9=EkE8% z((UQ(N}yn+@ER4ieFK9Y2$Qve6=@?ht5^yiF^We(ko;j;tH&x~{>1PsevR7KxbjRc ze&B;u-J`t;BY9#(_zCs~pHiuJ9loWUWV)gu9zph$uWkS^bfayWIsUd;x+493clsvQ z1u@u4Ujn<`CP!g+KPKu?DK-MdF9j2+b7g50`zK8ptev_E2JB>m5}knaQ-vS-(X^}B zO@yr#p)DzGxk=rDmRz@_vxFZBy2~wbX z@lh{;5!3czu-46~ermUDJ>60xEOv6k&Vf%ekCDt3~83PFThjXN8rt7c2(MoPNF@IqjPw|c&&5AwK+B)z=f2LB49 zLTW()4PuADQVf4%>n%~ny?(vc>NC1-a8d2CLlHvT4>$Ob*wjnIe{};1Xf^QD2XEq! zr-=h%DE$1QhDD(|H1H!0^GvR_pR{2*iAr=;OiAXypJmqYY*8Y8@-u`Gw!3UagS7%# zI7ylGM0G?Qp>*6&=0RH}FLONs&t{Vu4P2jvMXlFDF^wnEWb;wU_1ULQ&Ob(zn}kWm zvM;bc3k?bf#z~sfqAU(?VU@v1H=~&$MaXDkJ)qH(m16)(?Z~YqGX_gn-4q_1MgQ@5 z6jhv;(T`SYN2E!cMcewC8)It?4}aqXwdY9-K#GiJ@(o(Js&dRTtTB=TgztjEQhjN> z9csg}cQ3*K&gMXE>BvlqGc^Qm4!g+RM=2!>)uth`w&=8Neb2-fR z1obKe?F}Cp8}4N?rY2}do+Ep&v2o#wlSTiN@c0nLB>OyqJYGcWLuiC78IB?G_o?-* zqOn^~CZ(ToE?lA80O>T%y)EQ9*%-3SB?Ufus4@46^i)x+GJ*AzqcWa;Iy_5NcRE>= z$T${L2b`&|E3TIf;{~|24zAXQb58Eo*IUAie0-FLA&Z!x_UXu@RY(gMRHrbVOC#;H zM9k_Od8A1YpqLR9D$v+^vV-Q2a&~`M{xI9$b(z^!Y9b3!IZ9Upl}p-`Aek1{A`cj` zKbE1BImwe7&*))cHimc74aNY*ckJlS&)ZXH8V`?;HjtC8n18Fc^TuAFMJ=M?%&O2> zL7>olkE%gl#}7j^CN7^#Z5NP3j~4X7|&P@MK5Sjv%ugoUJ+=wO`)fwdE9Rd`C7 zfgxhyNtWv2uQd{@_ttt;+NODxgHqHKu>a4#hVIuj#K|p^^NNA62t?7n79&eYmNtO{9Y_zxL+FMbU z(J|Yy-Jsra1mY5XS}ErVU=I&m9!5i?r;qBFC(hPzd20y5mwwbFtc-6(XY^6D zX1hH5#7j}&Nlwc?iA=NSgXLBtHA9E%j46h?5!)OS0 zc~HwK%OBU9a%EWPg^`E*aVqpIggVQX6kj@r`$C4{$bpNPGNp$xl@2UHL&uQUgwszl zkrh2KPt~%AiIzv%kH^XEEfBiUHJ6P^%mYk=a58MQck#OVKI0^xNS#apY>Ez-Po5xf zGM2I!<=Xft629~rP!qVYpBNY@%tYcF6L|mI`@0eL2bBG{?jZziKxL7BrZgbg(tPVhLVc! z(>Ng|y_&?0BXv#RI8nf?*vOGwmiNHkY8b+di z*LoTlw8oMI@wEl%O zu%Z95yA#btzIF2Sp0`uF7F=!48fu-L?gs-og&kk=3Voqh`-OjC2c!Qpll(EXYCGu{ z)|y5>3E!mebWp07uuTJ$Zc8dlUnBS7N(f5jqC!YXJD@HZVad>2R8wA_$<103@E$sG z>TsH@D@DpsnU?lNv5$mpXhnY2&^YOq@84+qT=-f+uBbyGz+XRJSD4|iQO`_k`ljRU zmR)q{5CM=PFH`!vmJ4x4bO5>Nfn z%sSF{!A9-q4+bpjz-;;=c3nCfpPf4ScBAb5Lr z8xV^9Dj)uIiUM^7I}{U>^D1B=)vy%O{XWx@X<|*9IScE|1ml26I`HGhNKG!XG4`YJ z{z%%iA+(SUOu#s6;0HnI7f>lvfEUbQ;{PNHpAWqxCl!+HV)CeWz$AnVTXa~(48u~G zG#CEJP9q{(%X8;A)L~4B2GWbaYJ~A*gTC}{*-FW&n;x#2^x~mLsQ4Z%mZ*A~Kh{3` z8T%~ne#LfU5?{6;F0&#V!yB!t9FTmVAu(q0GIZcBsM!|M7#?fZ3W~8)qC|7-xsTg( z^av&K6WGrzJNfbs<7gXo1tpp`eJ{2dJC@}!^KPBrw_ELP=~yDg3u|c>4fJQ2bj>D? ziCU7PCB^)^_1kfXHQfde*^`chO-G~>t&}>cOrJ72Z4S=th~AR!A2-1a2sOAn>P<2& zX%jlkez8x;&N5T|mMXXw?>QWFzU<2ZXy~{$|}`&o}_LdHScF-MEoG8h#j> z8#8SrGGdZtj)|c+zk-Lro+M+?sBj1RD{P!HE|E?Z{27hC$}F9F6e|%8-BVIWse@we zx%D|#qbLvRJ}sO6)}m;qyof%FurTsxu~YikH#_)+^%nGfjGE%1>0$S9Hv*r3och|& z2>k4D1cvFn)`d$fYad&$5MF5FSy@|Sr#2#|G^b=)!iq!!ZT=oi+Hr65Rk8y!>Ze%q zZeKD!(BL3K9=@@>_vO!0BaElEor94RBE`OqMObV@I|#%VtKr|($mwttKy6_MKw@K& zVriL-de88#@^8h;$Z7*`Wh-aPpOmH~z~pcKVYXed$aopZ+Us?flCY@PmK_QLuigcJ zKSmPsY@W$kK%x!+wtnb?cFA16@K3&_>H^F_HZxHtG9A*bWZc!4=V0{-$0!L-67EOj z+3Tuog!MHLG3%owXlkb<<2Q7b1^SNN$Z|*q2tQlOLx8%_L702~2KxhF#BnV+BJrUX z$9>k4-9fwzW(^wbgbvrzT!K4etvs@Ci&)mBgMs)jtj407P>L>6w z>BqDEXEKvZKb7T{j4vgu&?S!6;y#{o2 z%XXf7B{P{%1Vu7f{Nc04>(+&DQ7X;PT?M?D{zi4MU4X>JR88w5OYX&I`fbg0#|y%E zeJIVZjph$I(t6q4e3OLonj1{;boHQc=Q`g=udj7Y{Qb^8WB#oLhos!+ioLO2d=gO# z!pS?#@u%N3egR#MrtzC68^g~uesM@b!DG$coz65z2?t2WhQJ0yU4$RC}3unkHhLRb%U_yd~6qdv9?ll70UhZGq=pU zd9`&j0@hsgnHcZmLj(5FI5^lYdnPdhK-y`VDSqrK`cS*s={JQZ@m$7f8;hx=fPu2{W9&v-<5c{9Anc9(!Bo{`TGLDwhPXwAZgLz1|Vm#DhiH1JHdZ z-XD~n0a^|0dKfzFKrAmNk1>bxi(pyIA7@*ev{liszA)YzzI=s71#Uo(9&OUc3gOBX z8c-eQVnFS@mkU5_^KjpSf9Z;_edmDgZZ)+80>yDuccQZx4lz}TLT0=hYx4dkv_k(RoGb&rN z7s6VP%+EzkF0i?W%`2R-cx`x)Z(^}YTiZOct`NE9dPCt4w8DN^4C_;6Q85XiJI0+m3Y>dgfF`@53&HYVFUX;x5oDhBEx? z8U(Mft-eq16VgOLE49-l&dH@=)znjGjkGgSi!EG+CIA zF{hC+;%-W939HA12jGFxA&!yITt}{@o(M5sq)dpUtcnXWP-i^Xs=P_coSg#S5DU6~K}(V82n$e>(KM2guCf75zwKrTzO&ftR1 zr+#k_FJRB&tO3F(m$NBc8N(WJ>74{lN{HT?;O$d*r!0jMh?$*MtdfYg_}-`mdWhU6 z2_4eF2FHk7=NKkjRv zf_!j|ErooqKviB9cGOy}uYhzJJfptCvk*=Ch|=cvlJu-=;5Yy9d-%YwXHTPF+M#oKzQT< zqXw0n5`$B+M$l_`eEZ^o-{y%Q8aRKRBkolT4t=F5c$4rDTR_V^*(?jPT%vr)445|5 zZKeUQUf#^cLySS|_S1xfGAIV~9e4pvJ%`_`agE9545*pv!o*I~GSH*1uxPZ*|A;0b z+g40X!oBC~ab%(~1X;HP0>$=lEACO+r-Yk4w7nQdeFwx#ByBKl^mTQ8@Wf8hof>xd zGSYTT*Be~5@Fg=B#C1FfDu3PPmQC!&^{9qT9TPkDd|^)=BjUNNVWw;J`-@DD>jM}! zBm464B!EFQynMqJRts=;gB+&v)jZg0`a$x@H-(GI{t_lJD%yKfrKp12o$BhnPK%iwLuNP>f0=^WbwU6C+lMe!X6@T`h2wks{{4aO`>Ukqw-(T3WGz^epa!U3*+%&Z zT{R=1{V_jAJ2D4IOuM?zY-R0P7jS2=+t{k@Hck(H9kZxyBcSh%?tWnc! zxbu4XOBjZ&$!3Qw%0@eNU*7U#UOuXPj?S{GCs?4fbLng%ZJ1;5ls2NmWz|kw-Luoz zhq+jx!;D{+SFyh2=hMvFzI@)dC*&T`^Ri>t>R@D+a-)bzJE1NE6l2GR-PRK`ju?yv z?N}K;lhhi(K!^tFrYMH=zQ$D6v_%m5jVs3&oI%yP^o4#dOFO;o&r<$ zV>7%UTkvR`$r_eqbAR_1)@5fD<`BzmyiNG{+Q=+D{w zDy_1?RGK&Irc$RWLIIarbf$JdZZKOU%Hm)TS5Jzyr$1%*IHIVl?xsB|wvBcfYTIs1 zaXxH0L7ZhFT*F3MAFhKILN;!*;Ah)GALzS-vTwkdV&*f#n=jG9n^8|N2;hbLjmptc zFqYOzjg)EDCIy%Dg}p4Q$RJ$66Pzl&w=ge~*uO*k~j zT>2&&Q$q*~nyH2(K`75i#CB*{e!f94!!Z*oGK`ZtQb-q`0i2R_&s)K^TjH#N1ozHz z!yvQgj6P1hr*w1^e21G0=|9dney3JSKAdr?Pw1a=GCIgumdGO~)Aaqp%pCnD@=p|( z61#eaa>*LIx;Z2*EFK&i7>|4+a%9FePb|)z@?~3JLJs+2w4*+45?8+?2!+Yi!W6Y^Bulj!G#_zS?1;HB%EH5K0IknRL)|Jo>(#qrfBtNfp$P#dp$bx^ z2?3-@5fD5gp@=j=Km|hxRZ&E`5IQ2fzyDhIv-h5vJ(=LA-+R5+m+Q*xr`*q7*S+r5 zSNYk*2SHoyYmy%90MUJrDayAG-w{)s8EQOh{iR=#F^E9u61{MNB?;>bgsw~|2%tr0 zMR=hNLqYwmXfA@7H&OC$4r0xGZRs2hz>P)}ae!@9HybwmptajhdwgeS!X7VQJ@s71 zn6`l~t|eO$AoB6z%KKO*k{7#{E@}`h+*6mCkPERe`IJTHCqyr+1%){QfdYJ-1%8?o z+%eR*ia_2sCl8F;@B=6-in*1_!~)@2wuPUF;jWc-8bL3rfGh#@n;lNR8Z^&p-_A$c zK!|d++)NqTph2_*tIKK$8q>XLM2lp*8s87yvR3vqa=hvXe7m}pdbAH+dB>dT?>6|~ zW-Yy1lAl&Wb|6edSu2$U-I*hPl?x zq<%HAxOcOpSlB4Hs*X3-?E4mp3Xx5tLWv+5XUWX|&rO)@P@rTp5^EzmY!F~&)*5z6 zlCDsn%%sE!g{Y|}&&D|Y#c5Q8iR6$)3)HD5i5)}Wm+|Qs2ug`kR`Cq=@dOjAxbkdE zhC^S)X<`_UD!wWF4A;NjoyF@wVR@LHPs62l=E6T~HXxYS@`DGhmitj-E&I&_lXfK~ zYr^oJ?323elRL_Pf-U0h)YC(yzeLAN?@q}~sGsfgMd_A=o6*4yB+z+SAYByy_zN4@ zvz3+4(H9uX3830cDqy_>>zB3svweWLh&n~j+WyG)4@OY&aU|rTGeX=@C>3q{gfpTB zp#m*AETKPqS@=tz!eW$H`4I3_5fzs?=m`8U}O+i8QxpwQ1dd_ z*O9Krp_Oa1--qhXi;ba$H3lE1`B^p*oIlL_RuYmMn=aRN2`+eE%cT}S`<+DVv?3vQ z65e-x-FD0_Znjfow4D2~6?ZMq9VORbzGnDz=3-=6W!kOQ@Dchi*&_AC`#-}OOVzHn zrC5@|%13@AkLT-Dp}vUxt|^twguh>xC=3aqW{I6K4%p)8`z?RtjPURw4EzCnD~aqPT&Kkh57Q11_&s?K z+V{3^*I{JE^pS=6U>)>nxTLZ@H#ygn3ztZu9R6UUH#;PMW@lROvwmN42_iNiIn=(p zq?PkkRruM#*`d#?%+??pGTx8ysYs-mrAwoT6C>5=`u!LOWB?&Mb=Gw!G{ly=^j2I2 za9Vj8l$Q_RI)sfsJiNFCXd;|_NIRkjTt_a6YF!| z-bn@^mc)BkFtjqTqS{hpR6yZj@7D|TD-Gv(zkdHo`lVi(j~p_?#}37qw0#XGt4ZQK z+f~+V25jX?zFz>^%+T^Ew7y}p=JP@C_p5X@AI|W8zobEI?tI!ZXpY8)AAGH+D7*Y` zuXr{5aXx$q0%m+iW97HG6+^Rtk4(zevzURo1-l)eKfxkZlD+MPGnF-jxSYO9PnWmd zqr}B-!YJX3Q#``@e$^OrpaQ9S#zq3bF57~Qo)51cgs<3c2v9(NQ`6mcP8+6ii?K7m z`Os5=qsV(O^EE9wHa{akzcdHnX8(J~4PK&Il4nhvl0Hyg%9hO({| zuJ>?^5)t69CC<4Aab~LkIV`0c0$m)8CZxM!U#6p=4H0B%N^$Pc1LRQq(vOLbR&Ou8MCHTmUCM*3iiq>q;hzix-GDsm+-kA$Vd_%(!q z3kRZJr9U+jatnY&D64i$kEWeRH{fon!$b9-SZL<_>ftrSJuY=G{z|-I$grrk@ozHGPh{RKj_z} z8F`>cSzYTCP-@gl_y&ul0F7u!8#wMof;OP1&->|J-5##oqLYF0;X{W+x&Djgfsi8K z;=D-0eOo{Mv+|E3yLrZrf~Kb`>U$X+vr zHS#|Pbx>3JpYAv}MkTd1x-Yav z`T$xZfSp*ThOny5SLx4PwxhvqPqRv{*CD;6u*Gz3RHaQG!(BT#Ot*#FPPZjT2yo zIlkKnU+U(`g*v>j`-WsY3~wSS(Qc7(Q!B0NV8d|a%RTI-4TnjP&?>72qb(mXCyjjg zKJrDZ8CoZ6@67>$h3|sv6UqZeQONj^(c>lbs@5usqrN{3Ynw!YK8zZTZL>|EhHc)C zCbyoFZudoS{}f|aWk95bHcn(UAKp+RK1;t0^>es%R!Cn~IX1kT1GW#H+sh|rZ9j3O z0hMWE(qo32a3Q?6h*e^O({Lt1c*I6!LIk;Z(5F@O;+QJ#3^ z;*CYBgpt_C&t)V2f^`Vu^<<4-Yp$2`H#7CRjr&Po=3!u#6k0t6@WaEb6{G zf)CqR0$$Nkg<7@^uSF34xXTdNj-dw{Gj9P$!l~WuYtGCWipW>jp!{8ZPdBI?IoZb%#E-T;F*yBX)?7)mhBNxh5 zu&0H9V9nL7ikvW=2X%2YndIct8f6TA+JH=jCX>nfqtl9j)xdv$eYFIa?d^M*)5O?g zb3@uTw`Elv4zokkKHh_m<>6hv<3e&0Sl9qeFT`P>DssE)uT8hVwGcOY)~o9ld>_|R z(68)=#hOep25W4N&?Lx`#;O5=^6Q7WwE3dF>MzNmpe8piWsi#zzMKyJtty-8y#SZ@ z>4mcIjP(=*wo(~8CDnPYXu~m++Q~S$H+_|JG2{WDxM#`fI|GrAV0l_vgM1r!7^~EB z4K8za9?dXSclLsBlia?xPwxRg8)n*!eF}6Z;f>agjk(*IC+I8E0wxd(^*XFspB$Uj zR?mZA0HZci8bB5!+PShb-DU;^E!zRsR@Ar4cdBNj^{NV6g@f7w8(*OaxKSiVRXQV# z*m8idC&s^E`KcZlm-{kXQB_o*bUg3OE(rfhNmitp(Mm1X)?1(3s<2{Qo*aOppsCtX6u`PPn+3=Yz!vvC!P4S1B`rA zAMP2kM%#sxy|Z-OMh)doRdZ#ASG8foNUbaZ|L8|@iH-H<12$6M9IDF(GAeA74de&C1|mos&zHEE7(K^G zABlsq;PjoDJC#sGf|Oq;H4FYtb_^#oW7YfsFKr^4CIUl4k#TRB7mIx#?h6%bco)I~ z9v&-E!SV^V-MBC~D9i_fFs33r%lJoz3&p^5t?Gw|(_8et!}*Jn5;X-SpUj6B}XfFvq6^1g{6+%@PO5Z$bVxd|X;TEp6F79d48j7FS^GMi6E5gjgK!vAVDV^@sRx zT8d=LB!xEsxx30jM6z;~0h>eXwN$?Z5@91G{o{lPU?zzYs`lh^5^Geibs0TD@5anb zcj!sCK;SqgNq6Yf6$67yzYkKQCTc2Q@6^ajneI-V`oPIIMq?~?lk$AjA)-B zRI{PcQoLY3zLUarOqA%A%CJTw<3ZQN^~?!${KH)xO=%ALP(2S;~kxO>P=HdTD@`*w`$tJCll zsH5embQZ)m2)5nhb3Q*e@;?clZokBXL|p3i1Q1Cus{Q3qtwcWj)Im&ui_dGuivGak zDbUH6*nB%;uqUb=jN}N_s52rn;_?Eq88%Rt_>}Kj-MV*RO2P}K9oEuP+xlDN=Z41mG24=+p3uuOPc`XkGaAT)qyMZ0R$8dbXgwaRNqz4umh+ zr(l3^QKy1$QXjILw^?p*e1mOkXg2mU(Wr!ofV~|#P8E@MG_ln1Mx3mYqbH}M_`4^P zJnU!$ilbz{&<+hDtIA0TzSGfsv(@DB@rzLsEK<;r28Qc8CS5DW@u;2UMyZgZy5acI z&qQfw!=6}rsxDF!psU0rQifFCrZ6tvI$96>G2~{CSJ0@b=}yy8Fwisl$!Ej@+J1`s zHAZO}`9kf3j{K)a=4EIs6kbw$w>UHEAI@Lnt{x!4Ba>xF7Te(o}(wCP;cRXy^D= z(_vv*lCaf!U|OTr1k~w8NkErJ=BgQS&J@3POKaSTEL78WGDPv)1asuKa+ACkkiFEK z38$ofrZE#D0_7qG`Bz6QD~LJX6x;^{J7%?#!hYBbi=;@tYa>Z-F}XtNS&&7zxNB<_ zFEuJ>ife@`+0)k`O4UwV*9v`*Zj)(%d6^(?(aHh8y*(q>!Flp6pW2xOj@ZB~ODjci z>uq+?UjYirA=BvhAB6ds?WHC(jBvi1(Ulw6MtK7@WD-e918hAL6FmWOS&-~Y2ORVh zTWbXWYM>{Ii)3L?|8?Uz*Xdf=&ZZ={Ruf~Flm`EGrBCqIVf*lUeebu{gKKzU*4cGrVZL`iM0NsL}>BosOZg#?0uo&J&W5NE?ft7^s zBJ~iEae0xQQr z+weEY#xhu{ll|u}UpCPaXAD;I|5UOTQg$CW+cSDB^Bkq6X-Ni3b7C1jVrGHCbET~4 z?94L!77~__K(Uzpq>vJ2S(d(_B;QDB5);e5(I-W+p3Pf0Z;tXJ3{`fHm@k}+Bw5N5 zJ?@pVq|gm2xAY}sMX>ZGDw(A$Q6J_nnn$%cFkK( zA_-DaE>&?}#`Gy)+;ip^ct976SE^}=f5xKk$MnT?7ktLe;`pv_-cwrXm5-!%s+p3M zBqeD`G|VhNMV6F>5%x_f5fe#hls1uZVLd&>>NAms{V=ATB84SUs=u*e+J{BDhlG z5h;Fh`xr%&M=t6#&UBOD-b{ZjBvW%lvz?p{R{b6H!AoXe?rrxHi8Y7eYZLPwe8U>2 z7fuo>x2PoauvS3{qs^nfI?Tg=HjnPu>zl$sh&$x5YLF$VC^?m`pqwIH?XA_iXg6w=1p2>~r=R@mn6+=gc zPLr7-ZlDMR4YL>8I$5)&9)x$Kw8ArN%wxj`D>>t2_$qoboNO9?$}2dL#{F!sahsvh zj?)paXWvlt0s&e0e~4$V4=f8t!F;^`2XyImtgx2E;urd<-5Y#L>Zkaxha@L>-RBHm zm^goIEwV2jfh?vu*Q0UaO&g$u&R$vh91B;4>{@uDYP#sxstNJ#OQm;?LlpjA4)K%} zjRNV;(zc=lAig~QXVsGht(lYrt5^+xX8{_&eRo4!7^{v9^Ns%D5tZ9kZcEpgz8g$T z9|RP=G0A?l0VX1NX1YFo_%-43o_5he?h(GQ%W9 z3O7s=vnG_mB!7a68U&MEL4V6*l1J!+@BA-Gw9}!@FRzaBJLUx2TaS%4CFLTx%46(8v|bD;gNATf8?XCeMY;-D@q$!Fm|w3wLy zq;xS$>Y^m_Br|;_%#~IPV;ehqBm%5r-;c(}Uyd*P@eavd6?MW;VNAztXaOq&)V9La zh`h#0595Xj8rGNIvLQCS#kCAljM{_=^lp8~TJ!@l`en*Q$9rrP;v-znROiDJ>~KQ` zN`PtOLbzV;`)n@QbJ)!^F&A8YKF)x%mpRC7Pl$7u1yy_gy06g{c8s)+LR+J z64R{g)$MYP*Vg{FumJAfa*Y>khvzs!;=Z`>NZ%JcvJ>|F!oBZ{GWYQ?eRfE}S$_BE zEU(k{%h?tg=R4$|H4WvCTDJEf`{RQF_s7R9=%)5ZvnCLF#&2w&;%!`!;xTjjAxq3AJBdBrKzCO zy>!lE?`H;(!gE@FxVt|eOe3Nq*y|blD^hO~=$`DZAZHKYXiDPZZFX!|gfpO)qA1K> z$HW;es#ISGV`O#JOczA#Xh_y*mAyZ~!qZoD>P7+`$rxf0w!h!J46!CtzzXSetPZlk zO0vTjv3X)B9$^jk$vq+oo~S61Lr}t+s)RmT|GaO;WFuy#=>nH+)#k!mv}+a2zOe-ntFqRaStgSHBr>V6Bq<};o7k$NgyN>PbNEUHHx^}!)w#gm?TPoiZ}K+wUg$R z>PtI^&~^Mm75fe|U!1-OP#{T_9|EJ$u96*$WDfVzvzw3HXo3Z`X~cxBli*l`M5+@{ z<5>OqI%oP;-wXL;#IC~)56_j+r%AmFuNrBWV!bWJS&AqwA&Pmf^6)6Xfg+kAvk~ky z>}U;JD^aucRZNA6G);kv0@DY6aqodY50I4WS%#VD!#S+KR;kTa=|Zhi6g2^NHbctQ zVXgLPo3=?%sXZpFW^7v$?y}u6hJ3vGBnj(vPc#GbT%{n-h%C+AnOQYOD#PQ5q?yXr zHDZmZZ5vW)kk%mF6Jo2U9jW+2un>krBu$zd#}X+b8LQt+cO7+>s4woOzdE05CH$Hw zysETmw6cZtKz}j@gM?+g;IKk-f?8M&z2*(6{9Rv{C_k*T!CWsV5<|~f8^gkbyb)+5 z;Q?EFee}%X#G3V{ZG<;-&Q&s^`;?-~I%1Cn61n^rlZs5E~cXs3y4@gSDfGP#Q9y{r&+O- z@}867M7EL{tl;Hfuwnr(1?E(!Wu-S<7S_~2wzO?quxknMrY=81mNoCo378S|{!|5V z7*P(0>UPmWCEZV_z1qz#-e`BE8kHq`5i|jVX90+)jh+> zn+^(E=veHR&4nuJ*DtMAb@+(=uf^**JX^d%KaovXKb=h3oPKK6%^kQp9DgKy1ylRi z>Mg`CouR@)_hf^hY5ZwMMfF+cID7hG0%fbf`jSF&Q{4*J1N1CpVHP)IdHeS3hS;xr zKViQNgmAdhPEl-Y#=0{iqh!GNuZ9wOFDsvMOuUV1TWk6aCA!EaO$U_?{qe&M5sN}$ z2O*i`C*M<1g>1fhxn%SAAgTQu$mS>Z6~6z~(x4Y)^#kW#C*ARU{tqJcALO;m<|lS9 zSu}6rym_4ymmRuz&cuV4EIoi1izY5P=)lDj_Fpl7;oOPy7tdL^V(z?&OAeg3m>kAK zKEWpo4_kuRciBRh{g=q{_b-*&FPDgTzs@B~m(TBZUK!C# zRSKvXqDq0Qn9EsT53F3E+#t#YdL5Mu)_+$nsQQ7F3%u*AT;S2>DHlrfoojiQ9yD87 z(fNnk#4qL@G;gtHn17p<_`D?D`6o&eK2SpR%}r(Qp^zup6mn=Gv68vLV0Wng&2%eGmTk>c|%gj+r0+96{#u4+RJjcPc{{1cL8aKkkTZ=m(j_LN9*Awv-C^TzcHY& zQK#r1NLrYrUqHOFyE0rS#Jbtr{^q)n(M5NAmu9qN5u;pUk-ESH*6v`@v{B#z3E?(+ zG9g8HsTeIGvxEoT!H}t8w&aSZ9`TdBc%#atg(nr> zxK@o<8{?~Q6kcJ|VjsO3-<(){1Knq@-ogU_uF$4{DL+IVHBQ=oaig|hGx1UH#^U_> z)DhyH5d^>+pJb+aq;Y^*;XydrO!MMBDOf!POoClb_@>z{)5h=NGh$g5eX79+yJ7}D zEGAu4$N@AWJI+npN-hv>OHNdPE4PH8x&tMPB>XQ+7LJ3r-5l_G8_VjPmh0%Rx6gJV z6E%H*C6t`(f4RoV0%EU?T*36F8U32Js-EP+mn0l+4Vab505u6_Fw3hX%%*jOV=jSb z$WxOpd)}evg6Q2uTi2U*S(X2aMs)u@)3Kyzn`JH47WOpZLD z?Tr!Isq7fcFe}NOs$P8-hanKc)-2UT*_tyPj14JPz0o){`D5(B)*jDa?|!s5VP7{U z*pbRw#yk=yA`{12&!A9V>JEh_OJUmNkuFIM=Hc8O+AfEyD-ThsCzO(DxbIK{SNz*4 zLw+FBUs}wL5%PHwnxo<>mX0^Ip*~7V*P=KS)L#YG$}oe?1ek$}Ca5x!xq+yf(c$V%Li!LM~D&}+k>u#NRI?frCM1epD{DM-@rduAP=Vb6+!H;;nY z+V621wVs?((h~{VrW^E1R%|t$<1*gxLRQmReQSCltLdaZHGL`3>?S@>oq^7fCO)q6No!Pghm$I5pj5RSZ%rsw(i*m-Hq)JIh=5RWMHOc4r&h=?Fgbw~`{%^4>F_pm@vZrb)NS)k|9VCFqQ3)6@LfVJ<@yqk)XK(|TcFfTS{x683LkTMTCQ?ColZ$^F~`m!(gltU zPaVSf;M!i$G#}F7wT7gn3E_M-%BFG$9` z*@K{f^EDz%q!E^OjiqZPlazxM9$hGPr>6fxVDm3SW8#Izd~XS?>06iGS_ zF|>uNVhHZ_Sbzim_hRSE9tNJI%X8Im>5jkA*3W0;K(&e19x?!ni-Aj8f)9mX)l z`P}6K9+O^cv@G~xV9;QabiF79&k@rhJ%xcusZ3j?slfCVs9zG(mHk#HkZA{H&A{u& zi53CENt}^Ox8c*+@jxJ)!e&Y5o{dEZ@Ri&r5 zyY6jFF8OQkQt9mm*rk2@dsCsmcl=+`Un29nf2`T{7)kJdLBGXG+$vInxCk=QEOh=y z19d(FX;E0VSAgrk2#E`nP3>gJ;T?Ec5m%oWw%39x7{nbKM2og#c%F08cB7Lh^pgVn znv;PxE3BrYc^s~UvY*6VDIH;7{?N%|?N%q^bOei(85w>G^D0{4W@Q@SgPfiiaZ+;7 z;}S)Pc>XFZ?Px&^(lB;1PArh{$&p?qdwzr3QYu{ytk12P-!#7A0F1z9lLq z7k)yv2Cd$0%Qs{6;3x~a0o}cM#qY4O*nt13a@%mrN(HNfGQZ{Pk+k2HSQx zmr1S4eNn04AryC^=OS^|mRp6Qu?Z#bu67%(78ZUhqTDJB#1z`c-zz1+*c2_Rg(u^I zjAt@YlHm&@4P6Gy;owM(Ju8TBGD_~3?0O4=B+T>yOtsS{)lBxiD<$3?6V}q!Uus9- ziuzAVqR`hF!l3;L@hEUEkR)s49=_d1#N>QMBNM?KjT?FsB&9?YgcDR$XFB|rzbO$V z`i`l$9y?3>W42@X<6)h)Qe(nH);(i6d!1rojEwg ztdB}qPQhD5ysr@yoDVUL(Mce7s`Mn=)gXgj9RnKK3fv3G;_S+UygRvqcR5%`%FR_s zfE3?$mCsq6GaMANTKjL&mvuM-ei0Xw_E7C_QZn#8hQ^-yN`%fEGr2%a!{nzgF%1+6 zP$g$5^aIk;a5o%#9!6N|m+Bra_c5dp&NEM1Yjpb#846-uW0K%mYUg`WC&<>OHatEA z8Xi}Ao{;XeL(Fq6HV3wqm{{)@Y58J6lzU)%Y%*h#+&;4^s~M%P-Ny6SvdSfd0!#3S ztSQQ{wt`9wTlBfqLj4otj)6fDR`@AYHS|M;jU}9k`CjZIqIm`S_+LK!Cwz5)2AicT zP*l|FWULO4uZYO~3i4ywtnr+uOlMFrX2-bEBs}AFz;1{un@kcz|g>n#GtPM1M7UiXIO5UM+Y54e%9@-ux8Sy}jiblv(W%2~3{WrO!(T%P5M~1EO z9aV08ItD%RC+Xg#<1zJC$sb9$?Rhv#=s_jeefrVlm6y#ixc31~4kw$Xj|lkTv&0Kp z3Dt3q-Wqg{PDEj4RN(JcY!sv=;eKHl8JkPq6aHuAeJ(cQT)6xofhX}Rh>|&4cBaHq z8yVIa<{KTp$C}qL&A;Makozl>5XaK11Qi-+xWpz&-2Br-{7}J5$cD$j^#Hqag=hPQ z6SjrC<8qaP4`<78#@3)Z36GGJUKrr-lZcMjmk+X;ifw_YJfhHpj#cExR0? z>T&LE4GgVX+-+YQ`T>%aLX)kG?#Jf;;sTU13aX{?7io`09ng@~-)(%jnWt;$v=b_pb5VDdr{OQ>UO%XZB0mq?y$AVQ-;R?%Ry zY#0&Sb|rm5p{PmGCq9|*SgTBTx)#tNQQM)OP_&(F@Y+A&jvU)lkoVfaXN)1%@B(8Y zuNk_@+K9#C_)jdHCyGvEOVWpGi3ft@Jx)LwVlBbix0i{M-V0HH)IQ4ma> zWh&6NsOt1b;o#!KTo|hWsixH|SODmNO~NP^T5%{~B%qE_Daxz{)*shU3?GV*Czd?7 z$o2|WVyHw(3UH;Vr84u+u)NaHKP*`-r_`k@J1mS-qU9$EAqQ5C7Cv)Qw(yyhO+VSPfEfbGO(YF^4# zm?7&1b`y&3$=6yh#jaIUkLr7KLt0B73sQN!6^}>iu~DVw;KD%y4MI?oMS3oF#TO#Y zO<$d&u}hm~h(KZlhiG{CPQj?rRf}rKg+WP|7n#8ss;)%JG{KS~m9tfX^BKRgq)=5Y z(}~yS1`f6};ZtP&;o+>Qkt}aBq#z@ai;g)v97nNRZcRsx=WdD_er?ZYxHa9r*Mq9u z6WKdmifK~fK-NWuOK|fRk_Vc85?gO+$E>}ozzP++?<0PAFHj;uARKeW!m@XT0E!D5N z@jNJwN`G3wV&Igb1`k5`CNXc}Go645k<5;4&uXbcE-XOw3d1Dw4s*Ai80L%k0QiW! zuZJ_pg?|;J8uoW=oX=g9>tt~~)@PV5cguZjf1l485S?=h!o_hp(o1XmSCf_69NFm@ zPttMfKqQF?nCu7F7wmT+4({@dgR2Se;85Zsg^R7xtj9=sd+TyVStsFD8WhnB&^&J* ziV)Ja489gTJ`Gl#4IrXAncj){24?j!202wu7PUdCr)9Qfq5ik;s}p3|Sv%w%~;7Mb}HC(_ot z=v?BjtWX5o*oUb3Vmu_Z6>A>*AT>*D-DJW@^ECB3oE)8YQq0ygw;{H#Q`(MC{X{PR z7v)5;I=0wD*VOA1(P1C1?H zkIGu$MNKkZY6}mOQH8on?lY?r+UnlWB?{5E^GqWfeq373r@|evnmd-FY!*#=2Zy!l zy<@4>L!Wuly(&%JPMCyj}lm2Pp|G4;*eD@AghO86B5-6> zzi>>Gtune^#z$y%z0BwK(qA8W-m}YUC)eZ_5X}+lyd7=R+;jv_nl|xZ50%J6Y?0c* z7Ud;0Y*ZS~wkXp{IMdRV#4T9X&Wss+9$S>p&?p|~a7ou5iPc&&#QTyPrst%>t`4U!Bb_H-kk+d@X(r~Y4B|{u^dNvr z_W|7=>%|RCNV+_m7^TTPn4mmT5u$}MjeeLE!OO_s8;2zIMK%1}wqg?KeS)g6YUiworMva=qZk>9Bbz<;!JxZSemi|XVf(rds1_(eIKR(?g zoP$q@9i^{oqCAi+g@9%P&H$x4ZGiy8?F;w}0C=(~S<^|G+He_+q9`Zfy=)OEu%Rgd z#fjA*;x&P96_8<9b_*BANUD-yWPakw_>PpI24W5V9k86`wqsmheaSM_p-`0+&4t6H#RMg(hgSK}M z?GXp;n!|~n&U%44XDE{*=aBy;e4JNxOokS%>of=^@aEnhE++C>d# z+i>;Q6AWz)pdaGLjxn8Lwk(@-ia~jqO#jZWOQfzb3k|YAt{o1Ufg?Zdl2ltng*KE(R(OCi)HerawR91#}zoz}#5KcjfsQWj{-hU;&9~EA=_gjV& z0g(o(6AW*yCY$*@2``Io0fX7*BDdr*N?!pSuUiQmE2@T~h5^tu%KnAQk~3thaK@43 zddlsUc2XDUfN|CKU= zJ<`GsmXS~iQu(5B`Lrz^>-ETx9wL%7g&kNk0}Jv_)i8xg_=$1WO}^b9_ajoG`l6v1 z^F+QRQ=wLe4a<#12beA;Cz2F%!1^=f9UQ}1jVQlGUOtv#}H0e9P>F&9i7vX(S=JRdbs zgim*&6cM(u1Ox-|xOo~n609}!?dNff@a%}&Dp7Gas4*P6o&kp@H(c2{;1)V2LxMjy zB)BsIANr|1EH}Bf>ChfXiIA7I=|B*3(oSn+bVH;ovWs*loc}eLcDJYhlMKNfh^*8` zB(^%!FNCEPb3whTq?-XfqK(uXDaJFM4iMV|rYcyT7jA z6%Axe;m~Q(WxTsKyv^+ITkx;i7fi%YG~h&f@RF<_qUm>y2as?7a4L+s^bK?9kaov9#Wkpwv%`*X^{(7FL0JOo~x3xMLOG z#EGLAw8yv#>i8rE*N3a}`nWo*H%k)^;^KXToA2g}hWwU} zi4+?nj%ET;<^U-9+~i|n*V-h0O!EY^BM0@=w1u1kxykbj>WZ#(sziQdgQiryDF)K~ zj|=Zv4IXm1N^Cp<$`RhRGu?9UwC#el2^wRj2-KYx(9MtEU=7P)XLc|TnTV8|#JdJY7I^**DtTO$O= z_ym|a)fq;-b|{ip$q5h+dsDX>_sOysPs-TTozRkuqz<8l6bT4@2Icc0B9E#U@oi^| zW@$$*8*-1?T8*}pZIpo=%0v@QqPoXZ&=~;*6CfXy(SfVLT<|?i&TXs&l7Ps@YaM`2 zJIAb^QA(pyuUcEedC<}T$k{97Os*SnCfCB==u~VWh*uy%U=8(UKx=H3K1TZaol-4ZhUkEz$RM zI`Tq3LHTfGoXp$$%La>+Ni#obOv1165KF>&a+)K~1~r-?{v;zSGxdj@n1OYRmGUgR zfa|p0&`SDGTry+d^6!nO^o@~L@{Oe2az@n}TNPS`Kd6RqE;<^myzazDLx%R21W{{I z3`AM_`wnHL-EEqcHjm@M6b^LT5$`V24i!Er;eL#*poC^UK%P5*-8l$=-D&{#QIRGm zL>pBAt&i8acC?f~imzagGBMPLe>Dclci215mYDCQ#-~H0kEf+jLp)E7Sz=z1*Se?X znTHXVpZ+7^rH@cc1bq-FPNR0mrDFALmKY)g7vs=+h`bMH%h*o4@^>z>E=A7(Qic{N z`E8^e5~+l(;uj`t9*Fg!+)esG9+lp}nVW2Y@-JBfbn$7Jav{ug8f=7Y#Bi9O0-<3s zIC^FrtvT`ndnqJ5Osz;CLX~Eu;5D{DG7p)nXZ&Vd<3OzJ808?%<5F9+J`?C-#ZUDX zn9^ZyMuD`C{;^s#l^JN!loi3?*OqNy@7@>dBRwM`SePSoLAc(IOQHR!YxqT_9mv70 zQA@@KC13*kpU82xcend)nZ7>Aoo4q_AKs6yyvOx-3I?Mk z=D{|d>29L+x}Ez_hreWPJTUMH%=QC$Jz7f~6rpH?PR2A1ITvzWcvq1pqz+xsW|(kH zkJ1<^mX$F$auk?lD7V2@u$Gjjlt=#waSGk3-A7_!+owluavM?dBj0vMA)Kwe2FjGE zkVdJHF`~-^h1)?phMjrVnVY%F7GOv5GPD&*$k!Gzm%TT(C^ZIns!5rZE0)m^im4L< zf+!B0M<&Zf`SJ(wOoO)3Jzuxu2J*`k!IVCgxz{m}XZy_jjOe^og85^j1+dsq;D_Cu#YGu&v8qh`;U

    @uu{}9p(KP&;qseHQI}!TNbjpM!f!FFf(%Jlj{_2X`xdb#^bD z&-304&bLS>c5B=Dz0$M18~dO1O{7bAt%aWl!-sSG;Dcbve}E5T$afjE+}8&ma=rL) zQ7^nOA8xaJxUv^cz=xYGAFk__K8JVl;hNrj;NAz_dtQ;&o+sz}+wpT|(9zlpJM{jo z_<3ty$)a~s=nU?CU=A+E#24SGss8f5|bu$_eB_cKxeIR&3j?d5V2u*}N6me6fo>nqSQNkav-`flFSiHlP}(Mm*&68x*PCG z@k+1^u>SC@IgJkz+SzwB{(5tlOZs7GnyT+N*3{3?|CM+{T1mDl|ei2w(U$XA2+Ak&3OXR%k>82&@o zYRWYKgY0b>dvWKyEd*&?YS380j3F3%0i#E~J z-`>e9+WNuE??ab#*lV^-*5eI|x9#n-N7b8l?x3Ad(1zDSZTR2dZA5aoAKosuyv;&a zAw*Xo10S(6Ap5O3+3wADLwn&aXC|0uC3li<>cKaS9K_p7!ClStKYJ|?I&Yu;WL&zG;@UE}awm-yppJ8sCJ*o&0o{x8^PS#>{ukc0QBsC_3}x z^<{P6J^K$pkNR`3tfshQQ{|w`SdVW;cC}{QrZE>I=3aA}`djUi-PoMwp6(G#w{RY~ z6x^4@x{$eyvy|ldk3;t$6BiVbn|GCkBWcf8+9Ew7nzur;_K~DV!sAP^a}noe#itb` z?S6a#G-_|7nEo7kA_L!PlVnokk8^-N|Ffym@V{x(w4%;qNC!1*JxIHhPi<1aN$#st z(i>CcPe*SoGkW7J>Zw9!$X_KrQspupsO#LUucx?+v_bQ0Z`qe0Q+zXV3(|2Z)`{qv zH@_F#{x)rw%w*^@@m*;y?bjVX8`Xc3t#rQF9VZqDJs_UwE+Er?Nn#&UZQkdtFHQEu zD%B5;)_g2rYaUAS?sRyUgVRBp_Fi=cKz;v9R$r*e3N$?d3Am^ zkl*n6BgwB~mNUrjdiWT~@AGlr_ac7WhhJ3lk=B}Dq0KvJb8kCRx~vJECb^d0J#Bc! zHs|A5?eJIc$J%%4ipKv#J$%sczrkB%eZP9R+4A;q=&BFV70AHPhWRoPmkj(5>fv)k za{N8y_#WP+hY8-Af+#!KZifgR5`E~#_$QF3RtuXiC>mG^Z%Y&RT(4aabgYp+VrnM%1c=ldv(wP-r zI?XRdUahOq3zgICI&@SQ^(tS{=97#C`9y_hrA$v1!s9?t9c5pRj#8Gt{T=X1{%uHjE3k;eUg-lArzA zZw;2Wap)Q!qKoll=8hk_zD&d=1OH2U;~8Xjsnr{=64MdPe_OsA+kPH2ruezNhuHXhNVH)g*&$e9TZszWj;y|L_%ed~?dUV5Ww@eWpRJWajQ z8!y{@VZ9+5M2qO?t8E9PHy+qey8^v&TEM$r{H_i0`$%x&A$}if-|OCko}Lw=YwITb z;q}2}@7lk8_kPQN>FK8T zsHcmE`(r2?>eF}A(;H~R>`)v2H+Xv>J>5wg#M>vJ>y8jzfu5dXWgspY_#f2MpFl4M z>y$3^^c7Z5Ur+2@pr=0%jag`1$gioF95-1xmQ0Aw|EYC$)4Qy*M{+OD!LGBU(af@1^U`wd3hv z=a$3lxEN#eh36L0AX-F6Uu`=WU01Q6b_Kd_RlvJmGEyJXb$5f)7~=P5?Yr(Sl0E*9 z%;m3tu!rB{{)M;|+NwGNem}Y&epmP6_d6EvVEO$+>eXCcu=&FL77e0BboAA>gW>mA z_S3F_-{%Fq>&5TtfZr~6B(Y8!UOT)HZORvi*SLlDBj*(=++^WV?l(VjWWG3W*u27A zo+}c`!aR3gAv%I*$1TX0_S5T{pK>U}-=m&L44?c?oB?#~8qM+VSd^YHzBhD-p3!0D z46;5cBOPM=DGe#sTuM{imHZ=r_#FE}2BsK;R^5AFlZbN$k1_d?&-(e~H;$1;eM9&* z04|(m-e1Tko;%4_Py5d<{M}U;*Mx`HbE)YchO)8SeO}&ZEZ2eopCL8gsXQAUl`A zlRcv<@zHe{U(^fWHsUvn@qXfL+L2Yh4(~0e zl6aIVA9Zj4!WEa%k=3hhE|HVagBrfyl4K2Z#pE_ z7@l(;g7I*lH;O#^e;of4#75PLkNGv*nR1{r;j>n$@43Gs1E#6yJALu_;v*S>5z5@YHz(Kl3j8S-TJ@)Xd93^vk-x`-x^%*v(cVKQ`H(h(X0CFJ6CwRUqG_z9)6-T{)iKu zq)RLtzcIj)XPoHlp4H-vI^91DFe*u`qMa{wRzm%xF?GM_sKq?XZ(IO)h_4T6Iu2ad&~MVzBdhhJ@$be zgUh_%(8hho;4*I#xZ<(u6F&obGolw-XPP#*mZrW7t$(uTFAc5Cb))w~!`eP*7`Y!B zrb9!(ugTDHqNM>^t4(|~eV}K}t&RJs@36la*UP;3^-*7p@?#G7klr5I7U({WJ#2%> zFzz+i8clMb_~D8q``|73cahx&+O0V~4*$kjdAmE!ezWlH{G6lgdS^c4rDvZxDthtl zYOk?6so1{Bu+1VE_u{Ga(jqI#q{>3@i(dm8WoQk(5N#DJ@dIw=h_gR9}3a=?B7Y}U`ywY z5S<%RD?H7yhL`DlalN6lbst_nW$9E*Ms-r-XtIfE-!u9JYY*sq#LTsO>BJU84t;(u z^X{>9%Fhl@iL3luo>KNcJneUKzIY@*$)3voY^dyi4VC>lTQ+wd)#w|Czj@m4i=Cl1 zzD+#f1HyyXMxN2Xn}9tGtc!6RafXz?X7$#3-n-CKg5@o&8`ydaTV`P!fOT8gVhh^{ zY=ec}Wnr%X+h}34ENm07S1jxr3wsUNCJVd7!V17%v#?1P_9n1`g^jnct-#*2uv0DU zZD3n1Y@~(l0QRH-HDvn zjyevw3xRXT z$hOhIwf@Ng{}}Kb@M*wxA8$SIEbtM))hF3RPTyDDmSC`4pj2DaY9R#?~uVBHqhVPPAAZLqLK7WN9TjTUyNg>3@%iiO=`VXpz( zWMNlZSOM5;7REh2hQ2p}6)X&!*TA*{d(*ZMCp57PbS}+ZHy$!gd1NVPV*x zro3Iic3K$wW(Kw!*e(l`E*7t3|31r@TEm#yP1Bg!hvDm85r&o@L%_ z*IF|n8JzDuMw;}1&h9@;+9J}Pr3}SeN)M!guLV92_*&rlp0xD9c;IV*e;)W6;GC~E zdLRM36ZmI=cLLX1OM0Ll_-f!c0bdPVcR)xFIKWo{zYh2+;NJu;J+PJWvJ&_ez*ho) z0=V?RM&NnimjcfNe-OCzz*^uB0lyIVL%`dCOAq9MF9$ve_;TQ_z@-N?&vyVnA9x4w z+ks0DWPrB=KO1;EaNRW|JunUU-N45JzZ>`r;L-z0;0uAD0(>Fx3xP`yGy~58m;WFK z{FA^d?Ra?Wvytt`@-91bC3f)}3^I*>=>h2j=>c7xbmw@4y91mF^StD+ zd0vI&4*5w?H+i<`&X+7PIQ6t!dTtkMa?$5fcLn9@jE%EnkMnKXrFP2hdcn3u^L#M3 zn=ze2kMLcT^=>e~4@O_*yd*zo0{@|Xhw8U@-Qf9i{$S291Wr8^M{*uMxcI z;AKO2Z-VFBAA`#-IB9+^cxmu5A-t{Ny-8Zc8C-7S{|tUj;LQLp9m0DXysZ|mng3Vw zYX!S@OFZ?!{R0QpW&APF9Tj8gtrU4ofdBt|7YP+1+z{Sw@OD|e(fpsyZ!~zb!HWwIdBr7)eU#(OZjQKD{*$J$kmYyBFzROQatAs| z_Z@1kK1)7K@@cNtJf0>^`cU@LX{0@y${9U59=P2A6Y%IOW!3#|3%P)(KI>`J-Alqc+i2!QjPRqHiDlBA0%^YP4@`hFUIei@Nok7 z+eLDPXliI_IQ<`S=awAjX073jE_B@V#Au{rOLQG&b6;BYkz9c@MffhJ;S;%FNHX;R z`c*Q!82=}>(g?n@i7n+M77m>`Y(-^q!~;VecVVTISO9!#Sw5?*zQqa7nZoBzaNQ|G zQ);>dPb@+o=Zm}Wg?8bO*Lc(1FZ!J>WV28xJHv8?TH4apHP>_2<+cpuzOSTtp6exx zb2+P&?eg24Gi`oeK0WkcP_F3havq@UxZ?5~oC4*h3Vd@TSLotgQf(o(CCPuMnDvqq zvW9oWonw0`&yccNS0L{yuPd?G6Rj0)zL=%VdFmhdt@Ep{Gq;qc-_XZ~e{WL80E5@= z-3Ff8qju?xnd@dtqri>Qp7r33qR$O)-1*-3pr7BiCMyT3=Nj^7(~Hfz;sbVG9L)dt z6z%o3I4AKe+xVka4vvMtxe>?#wDD~zY4=EHf&0rR2c zfH~7iq$gGk>ex~dksJ&vSAa`=enT92k$lMJ?cxlc_|vTZq8?+1vu_e*zSLd(UF_9R z$CiOE{l&90hQ-?z~czzEB&~pZ!c<@SQAhhN?f}^apgiiMb`( zx8>*Hgn27|mTbKHLGcqg)wtTr&tCRL#W46eNcx)`nV&o84L==ZAAUx}PiHQ0_{o1KvM)cyqb&Kv(--kq?88smAbtio;_Ev3G~SJ$x_dQ) z-b!@nN--iTz-=93^2g{x<906W3b+54< zv~Er2{dKDG)$G-u`|_LqeowmNm5{FQ;knk#gUvl%@|C}vyi1n#O(@OXS_d8qKeNy- zUyb;yJqW?8d-nz7fc=zhe!4$a_RRX*aiFzcSg#met+Bv3h@|qxpV(OLKF0!mV#b5| zY+!_ z>sAj1IMP)s`rviEJ_a&-i)J8{J3$ zdA-KZNBZbL`9{OzNByTU)R!InpEkZ(c5iMS_78S|zEwGz_u1d{{W;oyt-$`Nz)sP8 z&3T#z<1cXW7swxA`~{a!tYyBgHTDl{UdEl@m(~tuU2p8)VcK7wh<&nfXwx9(m0?SV zI&th@*SCM+Yju|Wf8m(>KxO}8<8>v#ODr1d+r4~`37#7}3VH*bB^!Y`tEhRpB7z;2 zz>W&d)wPLvU49!`i-X5LtC@RDU*hKoEe;?*e;ji+mUkev4#rp5c>k zN8RJeX8qYMj5YW-o_;m{3hXHHLb_5ujT&&)gCknSV^?^xx1dww&BQEPTiY&ZHasy=kEt&QzQA7WF7 z`_Nx=EcK@M)rasR+=r9?8~V`P(ZW1-&wupom#@A`a*`^u=JRbM)()vOdnU-tghS^W z|NIL#`~La=WFM>!+d;OP&Kkzq7yYf$67rAB2S1;+NvrpU#V0O}m;_`yga3e^#-Ozq~nO_7vn}J1@ok3)HQB_Ejo}bu;Q@@7|#3jG=Gk_t5@b8#r!4>$7Fv zYp2s6?5)2xe4ckV@BlB^8&|x6>@3;1vUSfFPvDKi_=^O471?Fpb65I2k!`whDgFwx zSFyFkH_~%;M z(JLl)Ky=-1^DD+iZ55vI7lEtu)&WgsA0wrGjKGg+_c4Hl_bCIPXLz5|>|=lz-ltq7 znF1Exr!@N*z{2~KW*-Asc%SlWn>V~qY4$O|3-42!eGFjXeaf?K-ta!9*~b7cyibXp zZRiW{Qyy($;eAT8k3rt>KBbw1fl0>J4q^`jKhWA?eB+0{lh0h=j?iAlVaWC>;Ql^F zhj$6-fqzc>7}&@;Ql^FhxZBK^3Q1>V;pdQ zAEU!N6S(|yvTgMpDt{jX{~vJq=d_QZ`%?UU4E%q<<)70&#%}Bd`R(MNI{~=-bK1wy zoz?Q&$v<}-aQWx7kFf!`{C4useF(VxbK1wyH*e&(lYed)aQWx7kMR(2`R(MNI}Et| zbK1wq0hixS{<)#R<)70&hU^#F{_@Wa1TO!a_Aw>{m)}nQx&FZApVK~u?x>dEPX4(H z;PTIDA47Xf8Vl-|@7xsGyN~hF3g5r4{fr|~F2P=g=DuHX--(lF9nhXHPSE(GpLg9v z|7E%N5Zl2?s{b!4I>~MiJ7se!!#ld=wN7H|h|8)(HX3FU%avr0f*7%(+`FTAu_|x} zB=Cojz8ZS}s4~$Nb(vhL-slVB4WU=*5qCl9!%yfg_KS*@8q=x!iH)05W^cQpA2iKM zac4H|TcOx%t8cPn`JVIG>|R}i4r-`KU<(jK)|JQ^J5^=x`qU4${)RS+Uu$nt9GMUM zEwDOZ-vXxnk!qf$m!5)7%}?47xg5T&f3d|8{{}kTKT$Z2`y~B)@(tk^ zD`N8*-&!!&HQ724o4s>qpr6k}Kfj@VML%~_PN1JlGkltR^z;1EU|UXa{XC5J{RVyq z`gw}gO=11~H46*t=e&i5_46_d3+v~_78cgecUf3iKhLtTuztSA!ovFb5(^9K=Sdb8 z*3aWDEUce{*pje*4q{8f`uRgPZ&*JYA27N&te*#2Jn854=sJD(O*;Co#D;5Zt%%lWig$y&N3L`F|*WT;qkY@+kb5j@JH)_E6p-O*)$Kw@o^F25{}6Yy~bIt=JOj z=<|SU52XZLI$Hh;>F80wwTJQ=aOr5RpQNK3fol)t*TAKtzYknGItE;OC>w!GM=Q2O zI{IzKq;&L)z@?)f2QD4`3UKM@^}wa06F7Lg>1gfI zNJqB-myUh_xODXSziYW z#E+{rTO=LV_b(cP^_SL{W+pr8Z-wfS?jC1t>l^8d-nR8EmfjxSy|DC{&EH#hKMn3?`Y+Jk|G#ZL zg!6vBy&cxw2WwleK^K1UMr&J-MPEnIEjLC&F+v^Q0@4G$y>E;Vz9!P7x3|(KJuyNZ z-tE8x+qx%4sKc8DJg}`5D;U_;HvkW8>z){)4)1EZPURc^ezx>M$J+^gUI$LY}ND`k< zif{9d^KI4)`lu59C;hKD&#kBL*`_lp=H8@?Z+}O#`QoQf)jqm^-`KCn8$a#FqT+=g z<2+eKn(ri~^-`r| zh}$?&Qe4He@<-xXzE3xS_T{{c}jPB@@;nGb4v2vY26Ts=L+BaxX&NXo4r`g z`4!RLa^@cM4WoV9rv3kX{<%m#|FXY_kG{_9o5B|rW3&UmqW26sIfac}o#&e%1Hi{$ zqw+W-^3BNi^N(EwPa?JP@&x!%?aI$Nv3wcx9rIZE5$LSwyqs^0UR;D%&#`uSsiHH# z?$YDumJZdPGkf*&^H)H-?qVBy1K(Mq4Bb~1b(a(daLzAEIXZj8*$2geY`*kx?kJ_b zE@v|Oe^~3ARFO82UuU~=UN+zz@K(O}B%eh!{L}x6_C*Ep5*u%ucqU#2e48PjaTh!5 zugwwKf2qC|McF57^Rs`{9#%rtidO$<2W5c+MhD9449}aNma`uON$f%d^9qOLc&Fv$Ie}mT#>O5s9a>D%lwa$5k0n{O0euwe{ zUW$+B?kzi2JVRyE4)urnLUlYz+0t)G?93!O^^4c-**?bVyV1Na;r(LPgD&YUyf5J0 z+(TyeYYP=ek^ctLwKlFL{Vt`Ge+PPEm$SnA9PihYUf{jJ`)6(bOAply?i42EVU8`Q($=M6lIZv#z=5IOjT^H}XHn@4GxN=64>?pW}b^#m6~I`2PgI z%lJLc?_qwI@~Z>K#8I}>w<+{w2ARs@D;?wOzWz?Wc<&j$UO@K^IR-h>H$0uR&L&BY zrf@G9sl?DOOcl4w-CHd{OXZO`8ThoTxcm* zQn!4SS5Sv+Xwf2_dN#Bfe+BYX<@)C&hmD0s=oii&==~jiDPLevhLh5FNmTxnVp`)n zHKl+bqd|IEb#kA$ISUz-C%+AMN|pzVW#7uyqdNPECekW_M@VJ9P)<<(Hu4)8Di26~Eb5B7IDwpO5vFgA@3RqcvW|7694a!2%c z_w0Elz%e#4`c*hFcoUf(H}^mVdR2G-QN9_kFCOFDEd8C_R(%^mdu{;_i1(?H4mn0R z=!^mOUHT-J${Bs~2x+QUe%zo9YAdvryP!XS1??ID{2AaX7vVAGE};Fgm+F!AdStyG z*>1ab&-Oar<@>4TeG%^{R3qP#X%+=0CRTmS`k)v|=8KnJ<$nXkfj;%K=JHz3Uun*l zEiGTm%u{@RF;CLAW!_uO&i1QZUoK=@yzhG5r+~hM&P%}!p3^*2PZ?WbtM;|@Ut?_t zWuHTS$^UZl*YG`I-F0vmQ&=A3|;FJyxR^kUb%_A&ebI$xI8 zHz=0!eU>)kBYPZL6gTa3a%P_Tog{Mrb zeX|1IXpV2Bo=AKy@Cn85N1PXHQxCJpIF~i1#zn4B>E??=@O{>5+$36=|0h{nBwtb4 zehzfyDw$g=Wv^7`7Z=cln?{ww6^d2EQy{n20jQ~5{K zZne1|{Q1>&_1=b#JNKPX(I;eOuzWE~~S**ie*v>EYN} z*3OB17&}a|fzJ6kc-5H>uPW18sG~lg&Pme$eCzIlGWXg)8I);k8_Tuj zU&y=q?DNR+WXkaKKkP}5iC_A*WrxYn`11P<9?5>6Qq;ILHY{=|-7SAyAOl}lJ7&g9 zi)gRfue!VNu_(T*Io;;Xg+G^mVL>U5Y#y3jSaR7LY@{x?z0Hee=&yF=jB$v{DL{N znf@1!^4uyKZT_1ncOrPIM|G+$;!zt^R%3>7)UJDdFDS})sxp*6#k1sEFkB{ALr5)mk@O> z84+>wN20S&AeNLd$9Kym6J5;Zh3@jD?|h+jXhFXmWBpm?z(=6o`h1s%Uw(50c+{C|Y;@=ZzRqL*+w1_Z03REbcvK&Mh{ccf z!e_29_?5lzX&Y10%Uk-PCp1>|P4K@~uETft@{gl#uIsNS{^)thKYeUsx{sD@(9fD@ zPeG2VIY{#~M$PImu9cs!jPCB)dPyo{_CzZ~9{r`~3Ncbk(EGZ{dE6 zcd3u2qlX;s-EH$WeTZ?vd{CLCZ^>Wh<~-)xZME(hg(&()^>9{wbHA2cN$ubc72}6P zUyk5zv|`XVRXWSU_d_D_vrXUfyforQ5%Gy-#nV(2=zCEG$Y6yvC5%DLXu>(5P}qbUG-}B1GKwr+bug(_F5z*oALaT`YxKz7hj+}f1Q&mp9pP1UmvAs zYziMn-?__>xrxOQ!0&=~`LWVG%bqz&@7xQ{I;_TtFO&UQY}xMH0M`j7xk&5m+@#_# zy(0%kCO8Wx-@N9LYV|RCEmAwAJd*cjY;VbxYz4JN&&Wx`(V7dPi&%q(Ti{ieb_6!> z65g-I{}B6w=<$7Nf!(V-=#9NLBl^$8=f5dK^LH%S#&>Jlyfi$llJ5sw zfwB2=RA+s$m-LNptp`Q7XlCxOMBkg(pSbxJA2v1pIfU^P)Wh1TA<~PkI&kMuXD5AL z$C$tET3^PXr^p!-Pv7O8*Q=dl^`2Paz4-e*+n=X@6w1eeW~xT#gH4_E%K8q_iR^Rbn(--MSIi3*m+O% zthMxr7SS{tditW{D z=rwvneJUQR?R)1G@*RkGZM|qcU$Q}deLqBe>xOSm%GVp;pzf!6r!9;RzW=vl-*4Ro z@*PPlKWk!W{FrZ{MJhK``dMwQjo<5COnGt6 z9{BMkx}%M?3h5W0Yjq5K#s=Xi%+ONY*^Va5#($E^h#D5v8U^?&A&%o>SuhW4blfn zO9In>*y2Kb9NB5o*})vZ`uxQ{^%uIs%ma)+ z;`t9a4_svAN4C+FQZN@V4u{lV<7`)4WsEWc`oiwhi(wH}Zjk0e>YrSrwBPn2JP@2*g<;tW(yrT8blC)n4c z4|WV|^>&VEHD|y1iktC;YOc7DygNq7uJd(_>_N?^)NOEfM6%@b)5Ygqsn(KkMne0bE4JzjGeaOf=Ry@EU~ zyvKOg{d<9bPJQdJE<4H2@y3Saduqd!mwr}W-BtBTy>}6lNS~{Hx~plgY*41t)#l~! z^NQA>jIjrir-{Ama30CIbX7%$GSj}i_ft7Z-=Fx$QM8rc8uVO6$|-1XB?6CGyDt@8 z^3xv&e$34mvz&X9PodF?;zOHK&XEUx4ADN5+D5&P={)}~H|LS>8S~98WdDP`@^6d! z`N!G(yRwT_pN(PCD%`?PRduEujo19KkFMj8}wd~ z94uomrwxCWuOGyFr+`d=6GIj%$+K>muY=?(6Yb_~0P~pc3=Qu1WNp+S`syuj$}7S8$~zc<=fC*C%V~F5Zz7C+{yY({&Mvrdd%=R_*T&b%8fRl zNAf;>$4kbM$@AdH5z*Vqm6`mPj^b{~fln_g4Sae)DKc_NDW1k>1)UZ6nCr8;UzU3X z)vknJhI}zI^xo;eCwSiFKHycxIU@^>{M(9Mhz|4PCdo}b`rn^%w=NY7|43GQtTe*+1t-1KRactgC0=saC?xt31o zI9cy0|Gl5;gT`HH?l~yPPGinOwia;)N4lvt&AtlsR~LNQ`Uv!@OwoEgc@>MV_hWk1 zF--4izm9)90bXSM^40g^Nl=gay*ATk_WRDDAM5`P`TG~j4cgIP^+Bg-5sxCF`hO<8 z!okVkEw+6cH~&e#gOR_X(A^l&omD;lxG}Pq@#l*07=J_bglPRb@4Hz`sV)ATg)bIe zx>0!Tew%(_^XxA8V?R6xX#8u;JMHk2eyZ+j^OAS=jHC7BodHeS4-1cf{LDsHf^oDa zRNuF3eY*~_zH8xI30e5%mt)&q@xsm}ktFTU_;aP?;bxUfJCBlGz@9wgY+L)7!OpA$ z{5Fs_>eT(?bdr`mZLsq;|3`hi2X7`YmAl6NKTsXL)3W4~O%co+t4HeI57{0IJ@!Dh zF`kSa;yU-fxyxqszSeZM?taYZbUCubS1vmwBrO zFY|WIU`+s>_@K7Qr{2ciK%D-IkwX?}Kxvl&^DFvng9=u%w&Q zyx$qBYxNNbOk0M>CmullLZ>e@p$LBw%w1+z%l zRMw95UY$%ol*KWQH!t;#(ef2{VWdgzQor{lg{6>;ZA9rw8^jmJaa z2lEJ~PLJIb^e3{vw?Abs2Yr!n=9ezCeb{+(tCtAzpR+Q1`A@8PP0(NRYf2{7k5%+< zP*#PLEu0nb7~V%}TT7pzpVYUzxsUz>Mn)K8)bl=`-NZud(0qB-$OYbD-i=(v^F`4# zigMP1cS_>deAD~aUbJamarh{7(x`dGiqYJE%1?5|`u>4xd>Pg3qp1I68x6#N^aJ4a zz?3IW9b?=VDC-4p7yBiWBhf7S8*JMpd%ss2bgyEpR>j96x7osFWyx8pJe57*RnVxI zlH>UQ$N=B|Jca*b_?^n{QGUj!mEv31Bgx0wQnvNAN3iax&6U2zn5;w&S555j&Q`ki zPf1@Dl)1~U<#Lp}R^uq? z>nZ$=Pnx+3o_*fP$kg%-^M4w&WlOj7TOxmQf;QDr)S^K~<%~!vh z@ACwl2DQiNT5M(Mo~rp*J*vG|3 zTS56Ip7V*1_+>LDHb)-Hl@j>{>=*j?m8>1!;hjFmPsb;PZ=G_`wJN)s{X)@RpE=X; zT(HY6?ebMsQJ>nNvVLgk$H!=5z~ZW#^}th${r+JO1|2-9d{Lqi_KcH{2~@+pt+7u~nNPPX(emH&acQNA;^rP9q8-!XbL zRlb`v);-(ABa=pZ*IQn7|jGY>GG}jXQr#IPmXG${7uPqB#b>a8ID_UDPc< zkBk0zi8(#+m427{v?p^8`)soBv}V@Yc{D<6bclGFhL`YDJp5AvIupzMb4Rp8JVa;I zOpD*=`!1++4s}On=1N1USA83!T@O+3Up^17pjGiM&qAx>1GQEV&T7VN37ZyO!1*@z z@AwaYj7_F>z2o=*)}IM^4SqU)%_7 zQ_HJ=MBBUa6$6=LxzA&%{AJ8Fbd&YnC`SKj<`vqkZ-=P=eooo_6IurlU*r0HCRuRu zZNzW*`$NX>L*D1Wbx2cwWTf~7-Ze)lZ$HY=Sk->x5yTxY>0o>fys?;%=8O6kff*M` zzb`A&e!J$Yyv)A#`pofzou&i)R+83ofbe4A)VuXEfBg{9IU? zr*oD?-?rAeJn#!ekn?DYylK914V}T7;dOWzM^2>6q$Ajmd(ufLu;$zOW;*={@RRXc%XS~ zpnG}gHezWdH*3LDTVu=(!tb!6gSCtE|<9->kmyW&3lp&iLx>M!H zZCO6wa$b_PoO}ggztW4~=-b+|D^y>W`sAl_+L6_#vZW5vYvEC~?g}LStle==7Tyh( zuDPV^{Xw%FPb-cAyonBC4PH#}(L5JZvbIv~rM_LJbzThoPUK7SFbTYv`Ytie$_RHa8CjWBJ{Mf|rP>c4 zijB}LzCU8}PAXs42YouL3|)Ks>m^s(ayn@UH+L8^qjC@MN6v=K5zh9z}NaotTMRHIA)3u%8mK zx4hTguUy8B;z1U-(>uL`rUEx zAhoY;xqKqN+yndyq&buJk5f-t%K_34RQCST7OGBbTW-J?5`kB`J6bZS@hAP}5X%wl zNB>amqR%B88}R$S;lG!)c5BB!v~jra7hX?VH$Rml+4>rIcOKDN(zwtWV(mrWIWSxL zr$r9_)bXW5(dF1oi#N>eu_ZS`k7D4ZKh%eYCgk#cya#E!7(=3EiRfV55@(I?1euHz z6FRW9bls&rHlOh3SUh~yehdPz$D!-85MG?MFzdm^8$+~c&;NF{0h;gmg71IQ{(f+V zS!2@JSZVq{i@pVSr|c@)wF-K7glw#prae>3=bQf*l)wJNZ1m|BS0iY!p|U?G+DISh{t6jbMC??4NIbKk zG%#PucQ4z9(jg7;OkOd1+Xg0nRTey>Jk+WB*!QaZj4eZZpsIH`^@<*quXJ?xbx-G6arl+cT$z~%{zc`BsZVkgoV#6*Y>2o0GWnO#(=T?jhL#VAn1{_@KO%>0 z6yoEz9nrw4^Ae1XThyz<3gXxs2%+jh~l{$`)H_0*5fdGU30h{j7$-*>1l0#6R7KJi>W5yfPUJuYAV zYMk*G(rK@u(>}Nbod)ma4^lZn|J`EStGEjFiTcdREb@Xry9b#U{|(=vU9xhe&GRVZ z#>o`Q_>s1$Y}sr|A3%F0PxoIE!zM#eD2SyOwos_ zo_vqmeAr42iV^*?eaC;*Al?|A8rT*Y>@lrn(wvcl@0E%Bhjyp3 z)OSHybCGn5a5mES8|dE*zC-mNX+~b4ue<}f32YFJedUq7Zoq$230^znd>lLyu4F90 zm0pvMxtKELYustqPTE^&H*$1AnZ1P?@oDe8h8_xhSHby%X6&=zd3xx%J@mXj^t>zd z-16z3yy?($N9egb^t?OtoVcVX?~Ks%^3d~!(6e)C5B{jo^VOl}heFRAL(j2vPu|g? z=b54BeCYX=&~x==J$c83o-?86m7(WNq37Dmd-5hj&$B|$t3uDOg`VS|>B&1T^gKKC zyxKh5xM<`<@nh=i@PD(`&-i|@XuEH7bblE6&&xk}QSlJP@+9-+n#|eUhmbG+l(fJ` z?Gj!nwx@=;p5cGdeM}b=S!e8x>(M@q<~6gAlBSMizW5Y*pH^9ny%=)*5Mu;8k9esh z>yAlf>U}`^rDW^V^J<=3vH2a>A2)yat88dLP6~VzAEmt;;l2{e_vK#sK0v%wkni`z zMV;g3%im)R2l}y-clmRF<@q+B{KqO+aZv?$s=2xMMsNQdeYE)A*!G?9x$aX9&SShYreBEKn#QY5v_a2`M|!{BDO2yK@?1|FE92)D zn562?HgDA3&i0B4J+Vk1B~Ml4R^73qG)|wN$ ztYNn8pRnHu*)aVRjz>DY7oGohEOgQ)(K&>)QOJj4kkl8Vvl4pM7yVq`i5IJZPSZyE z;1KW&@Ng7--DUZzyF9*X`FdxCFU!?dmc?8o z-{$=WUrboGUL~)QE%+??l5FW6dgdWpOT)5-f4D(s@OzI9>7GbvY(&q%zJo7sEsJg6 zZF%)=-q%=O{UhW4Yich%3ixxo-jn`&UeE3R^Gu!(cH9rfA7{#=f0vQ(?;ZE^Rd0x< zDSGep>G+(UElp?hd@$qwonC#DA>ZFS?(c@@&Wv8;UNNVcd@)bonV8TNvH3wB$ zqG(R|<3qZ2nBKGgyV{`kXgr*y=R9|D1p1XcRW9w0`+gQ@a@$+dWqZ^f@TJ2}C6C*O z?D#%C8ykwxcRKXPEd4=j!k%NOFX@-vJ+Z@UQvK*Z6kbhtROkLV7ZzXPeP+797SufR zhX@m)<{A7=X3ivkG>uOnOPe$752(!4zCMA@%Lh9h2l(wKt@$(i$5~CJ!KJ3vAMRx=_}d zK>PRI@(ob*j|ipK3Gd;{3ACSGhMxE;hBNq=cR*$R&pFUEon8z22G-@N=0=;A+d zt~k#B-?GjVU5X*w#GZxf?LK{(_l)XAm#Cl4;GUmd#CdfStMbQ-*~29EOJna%V0(C% zu2UbsM(mg9BNk1*1Y=J;k6kg=&6n4*U$D-esnvQ*_YNxdYZLQ^>b&06mny%4O}>74>pF3HI#`VQ@!1+F+NOQm3M|Mztif?S7`5i%6i4FquI-=5eR06zqebe&PEbzdTm z?2HnzSfxFD<3VfnT6f)+E1@T9(|e~~N?OH!(x#CX+fUjA(kl0pb}niC_LFu7X~b%k zDxft?O9gZ~iI=K~(TO^Vbye(95Jxt(e1Yw&BSL-ki;H60H_=bx`3HaxNNzOG@8dZ( znYAqMmB}3AWODgz`bv1OS-)#_YFtUWNxssgVzYQxdX@T)v2_%Ch1w?+ENWqK+FJU-Kl!??G1BV& znYb^F+YPi$@nId&`GyXSxz|nElg)V!*#tTC;s(k;IyA<*!N*U7T>0gHL_ag?aAGCM<#vjk{^hL#}>HPWtcp`m# z2zvQYez)_}-CSBb89OOWyHkwMY`!>;`s>%pr!?K{k!{krNc#Gy4jFH>V?+Di8VkrK z|1T&H{$#c^nP;`(TFc{LUeY`y`|fPgpP6mxlWYPvF--iwf;{0^u&Q3MV5fkuvM1TH zgIKUC%GLgo(uN=HmyJ(kv)(@k?%*%8mjdrL;h)g{&=1TQ_I*skIn9=**syB+diD7; zOR7up@B#hGN6?$mllWi_9W%%$pOeZ~`iF^6QhAqHcujnM;V&0x{iXX_{g^JreMttN zHS)lmp#01UjqK}eQoIUtaJQ}JyU45N9pwCy{3Sdz3Snn2_6S92fIWLnA(yppKx;YER1c6Z+ijWvZ<;@dbt7lUM!r3uH=V z4-fG{Wxqwb{HdB>8ZXOv8*RJ#+9TVFPgk*6$a;nRNygqyn*Am-R))X#{qh(J>#{zQ$d`jDSVx?Z^A zm&REY{L?sFaiKph8H;7{=oQ)#_@*=$tffrF6g67E)K>bd`*QJpYMC<~HE)piI(fAg zH*+aAU6gusF8Fsk2MQhXU1^ON*h&%F9!)V8)Bae@%jcch*G`Jf9PB)M-Tr@LNMC<| z^ckdg^4n_5>9)9q1LQeSeM;NG&&VpaNndd}%{CsTcU(?0yjOp`TU<^(@i>jd-?*F)sV?GjTHYlt$M6Zn9!WV*w7e#x44{OJO*(&pJcCSw)6q~TyN(G*%q!Hx6hN-WS<8B7v6U8n)`@B zSZeRYUJIV|NfY`+_}{SQUQIc3OrP&RE@#};rVsYUc|2~*Qh&RYcQA1|4^Uqam-9&* zm(v1|ddKA~v~v{dE%c3GUOfpzsq*pW<>_ zA_pIr^XF^!ZMXJzHSe}4284Eh%a+TeXk>Rhd{vtGt+T#oALD=z04UxxaO z%UML6dmsnB<8lrQ<$D--JDy#pN9PC3GczjJ|A+pC0Ag97n3J<-1Md zkK|dl!hew#wl`{sJ(0c9&YZ2bw+!m=KFJQaa)4VcfMv`(+2H z?^N!ql&k#G@ruz|2(N`(L7Hrmz^>376Fe(Mn|?BD@TcOw9U-57;a_~)f&G1BJM=>U z_VMYb(UZ^|$ugg0v`>6~$;F>sk;JY@aJC8g-q}gniMa*sN2~AWL!bOhdS0#Py#G9# zXaD}=6nDd%0X}z!;YW@+XB3>;wypgW{yF$JK8;U#EH+tWR+)H$#Ru{s2mZ=n@AQsK z{WurZJwtUT{kj+Hneqj%Nac%DcpuY+{}Uadv8getHIewMGpyQ6kgwzW&=P@fLHRQ% zKm0Cx>s#;+|9~GSnz6iUr<^plGWEpRJE~z1h&`E;p=a;j(HPN`qHgLOA-rCDM@#?n zZ}*P++MjX{P{)y>I_mqVC(UuMP*G7&`ztVekrg&dhUKG0T0XP*Ljy*9?abjk18*6EZJ6! z!Y}mR#eNR_1vlPUhhA+R&}QQIy>}i_=c|Mfq(1Xuq*Z@11^|cN~eGKJ4A^KRArFRQUdb z4^YN`_x%S^(FM=NSN1@?KS5g{V=wTmJ-PbJ4(|Sg-(h>1a*(Tc$g6d_-rrK0p*q+c z-`oFR=eho-cfbFjf_`lOJLGSL>PY$R`iY)xUudkX3)SDI=R(i8IgtFFKz{`C_Z{*b zjQsuT3$g7T0o~bmzyILNy=c9jcjG&xEwZ&$|6%C9cHy=A?fat5(^x#X`wyHOdfJgA z@4?)EFe_BwEw;Y;gRJjZ_(nYBwtL{ka`A$=kl>tHMMicA=j>Ew(zjbaqvtqnbA6jZ zXX3tljvu=*2%Ay*|AXMT{O-WE!+zNtKY~wn=}chY)kGP$^!tzqc8%^~l+9R=of+7Q zue%OfR;DyUEXNY^1qxg`A9y`o&S03g(MEer_5A2CGya&%) zL(h%Z_P|r2=UnJ{ZRq*!(6f78Pu|I)=Y^r?XG70BLeEVzd-6^TJ>MOA?g~Bc3_Ukr z-;;NG=(#=gyxu%dDC=8~Y0e$WcO7+J@*-U?c}{^}HFI|?Tdd%n?|Bq!YqQApJm&A0 zyh>oP5KdJHCk9RpIQ@ZDhj0djaJZY7GGFoz0ahEr85qK;1!piggMh_DI731>ad6%T z&QM@=A)NPzaO%Km0Ote1)TVmy)ULxqIQ8Hh4$cRGHIg2*{RrX2X?x?GVq<(Bw)w=e z)>V=CFTJSqOV8>0r5CAVT-48DU*(sqYv&Xla9waK!RZGq7Q(3t;WUBMADkLs)ghb# zA)ID#4h82B!Gu#!U3GJ~ql$Nzx?1KITU_X3JZS7>c#iFO_)X2B=}vr)jMt3wpchS( zk1-~DPwS;o%#m*VLGQFocloqLHTU{mzl#U zRaQ6Us0~et2fY~Ovj1jiicxM%<+@9}CcbkYjpygQ%KA&|H0fCOLGTUqtc6aK9&w2+ z;XZAp^Nh-wSk_%;iLPv^wrfctlI1)TcW)~#f{&;tPxPKh;`g4MKA-yJ?`S2m;ww6Z4m*7K~Qj9v2M?mY5)N_K`+|Ow(M&f6b zD!JPM*izjYUg5;`JfwnqA}XCEdt`jxY z;NyU^mu$+Z13nUXJ@E0sxvRv$>w&ibZv=iG@M;Th1g^MW7kCPIe+zekv+l2H0zMhI z?)4X)O~AF+(hPhW@BtRy44nPFnik;Gf!A7i3veSJz|+7FvG4@&YVbz^p8;I=XgKb$ z!YJ;^8SUO%d3F53%7{DM8SS=Ks&B?*t4lh=pgOAEC4~fIv^xIlEfIGi`*Xw0H#4f^ z&u^(^d_?0)e+ha1^_D1iH5mSqH%dDG1Mcux!ndM+y(JMxAG^bOett^?IafUy#zC<5 zkFW>Fw=YVO^jW2kILM6qpI#)fgFT0-#i)^APxt(om~GAFn!hX11?fyXWt?9+3OR}d z_ZPKt@6Z8$Nz&dtK>BXd*3Kt}g1Qz37n0^+gDumNa`W^iG1FHt7#^MYJ;fOCS;AHs` z8?sIEUoV~j-^)8oJF>J`em~+`%>HAJwksy^ZfMu{QB+nJ{JMv7^gTt|24CB}@4#Q( zw;3mXaqDLPex*g=RG2$pNt{GJ z@ndg=`(yZ-FE8tQmG6nY>MeI)^=g?X?=QUS-3zRnwjDZZZn3s`PVoU?_W^qlyjteZ zL*eHgUH5qrc$(#Yhgx@dVYc2GKhM(V&9q0c7vfP9{e3ZXN06~ok-_oUs$=5FA@j)8 zNml+clD}5(8pd5q$j2!j%!dcsAN`8u!Fb9V6m^_k*kVKY|Cfm4?BN$@tfrHa5&z!N z;nZd9Y-D94^Ua&oC0+;Tl7zc~@%(H%zIEpD+Ee65 z&&7udos|jv70~)!?yRk}FwuS(yzQj!HPl&?Uut~713Diq=>CpQXkG)ojnG@moq}sl z^5aw2qlbh0C$EZfhoR!uh}%}VvTIasCFQElpnlc8oVu|gw)M-?kI>gwn?Ehy*fw`s zJ~+Tu#dGFP8I}DG{8oGQtoG*Oxxr2Gw&=4zKu*Z3Z$&-}&or-9XO}aFPb>Z_{VLj| z!_?t&KTDJkz=Ht+Yy`|sfC zdr@E3f7>Uzdz<@x8@dy1rIp-CF_7=|HW4>mk)KNm zB;uY~GWL*xSIiY}enH-PfQkNo-MMqjxy&Uh8G<4M}#^}`<=O4_-=7wC3$pj zc8vQ8upJpU!wWI+w07d#fy5Z;4zH#3o1a!qn$}GBl2%JvEom{ER!f@JN?#;R_g=?I z^XYnSL97aU7EC|wZW7YD5a$<6h%Z03WB_7ct=2B-ibOrDcEAKv7=Qg|TJqqB%Q zOCvb9)ZeGLi2J$3tBVzPRXrmc8z>-ioXOWOev?d!599D;z<>Ak4(Y)@V%G9wb*}5V zmGw?np1CR5r-tcl!vRt{3IxD<$i>zfc2a4wxm0salbx*Y4{*Lcn=Us+2B^zzL zzwASifj};9ARpc}`*j5m`W$>SAB69JMP2~g_GIH^^hG@7>oa}#Q@+tTu6k$IkdZ&h zs^FeYyTX~ut!Q3r@b)<6CFk*m)zkKk4x`;2|fE%mi?aSInC4VMDGN8PUo}EI?2~_*Sxva>@}6H zOFEpB<19ixj;;Lmz#Zc_Uo zuPr(0TbX;YkI;^F_a(c$&+u&$eW-7RBk3~XOZ7B@Fa2s2o!>@(YQ5IP`@Tb6 zMBK)fUNl`OUBEXn_+R>HXby-Uf&84t5AvjshUS5t*l3Hq zGstTsPx@$RF4&0=WRW+Myd-(jM?>?$PA^H`iR3ktCw(+DC+zf^$(u@E3whE;R4 z(MA58bRvG7iR3Z&OH3k9`Y5S9=981qJJLsS*1U%JsXc<0|pe{L<0MB^9^t_=@ZN5&QeUg+FwS z{4g&g+Yfs>1Kude27<4+#q zjN^as+&pA2n#U$&9;tmRZt6N?BL`=gi~ddyx$VQIMaMG!n|Wa_BYxn%Z!7D8oh!Ta zzCP?*{`cbB$FP?;8=HGlXI8a#uk(x>`Df3dcw}Qex}X6(#DPO|z?=TMbzppw7!1A} zhdp{FI;21wSEReVIn0}C_eGrozqroOx#vmeTy)yir32At>~%A`E#0X!hBBjhmkgC@3YF1al)F)8Ebp2_Wp)phX{JmoW!}X*!P`PP!MsPP zObcc9q|Cc{*A}X0uTYsb%80IcezhNd7JQO|M}l>Lb)mGg_u=L|Q#S)oWQ*nhZo}60 z`Jyb{UqFsu);s7K1a;`WrE_+=N*=C=lVAnoL z<|jLhZ^0+l+Ql4J{21ON$x4dh$M7D>7X+8u1%AQ2PS5mB&rd6D;lG}Auvb#B$N5HM zW?c$g_xQ0duY3&OsOrHsc$o59v)sIhJs6VdV83q;y#jva+mav1Er7Q?b)*@mXkWBO zHhuhp+qxomxKigg1q*E|t@xqOgLwIZewpElD9*LKJ zOFUj;@hHDuFrUPKZtxiR_ykjD4SX~8ob}9=Lf)N`UPyCp==qvtpaZ^ z3U7Arp21TOeajK|Lz$S}Th9D(33wcg51MG(mA*Pq<%kaw-r_02vbd!E<*SHW)c$h( z<_EdxC&k{2KB7ZAbeV`>NIF(~TGa=aHl5V99`hr3s#u+(Hf7&&_Q>JrFWH=(%X-Ve z(Nw@!f!`t#OO?v&Cj8$`_1Nd9ychf&1`NQ|mi~!1QZN?$XZ6MD_0xaf!?%aUUs2#q z5rgQA=-%AsbXWS}t#uQAzA2UZFRwlstDHIEQRF#NnK_}8cAnVeX1XdP*lWff-B#Ij z=KOhVa{n&nnX*s!jwFi{BG~GxTlc!!aikL)e7T)J;$M;7+U@! z3GjH@ARYr9ptep`Tfn3A=ar^zrK4H)%&Kjk)xLD5d`-fs;s%eUP2nM^E2!f_`;GKj z_?!3HvseeqJN`YVFNMa!77jfM#>nZRbRm?!JCxo`TDaG^H;8-S79RHkj=~ghpW_*S zCq6;&f2r14SH)9{OYY=CC0;ap$IIMV;N%+fv{de2CT>d)w1I1Lp*2TAu?? zocU1SJHLbu_QvI*iGw}h!vU>yt}J%~>zVrWe7(|HKfPS(f}j3@(zKy63rM?5ude9c z?gDpV)p16Inhj%nJzodSJ^_^^?byknJr-#OHc-M^K6RjRsJJ$+U;4y8|zjO3l^qiz~8SMHBg!)F-pgkUFJTQxTsg{m8q) z74VPdJNA|LPl6^XOB0Ptk{`FgcuxJ|f#+x|u*KN(r#ri(rBfbRT3+|CZ`;XU)!o5CoM2d%1Dht0UGUSLN*Dd~$)wxh z8OeGIIdLan?eiM-`Fo;6He0VhzBLxnQ|PzfoTKsWvMP2fa7wbcBQU=8cD zps#`bDHz`uf@Px87TyU;=X@AXS32#dqZ#(h@+@5?nGoF4!{dP6*m;a0Ij8%#vWXfq z*tWpvG7bi9*4lX*r&OofJzni3{dWHRW76>2NNex)p5os{`$5X=%KLiVCkgyV@w_|F zbv&ybjaiQUZNQ&<3*Tw433q~4){+j&$WN3M&(lY@;LjspZNXNVfvqBVumvP*#4on) zF1UbC&n%t~xb2cR`G}!M%C}GCGnamdrO^@Kpdrh-_ZRzpPimYXb~{cz%Gda>va&5y z_HaA?2jw(xGw0j@$IJMy(ta)$2JEZ4w{`|m3obeDVgq8kfwvKY!@_Vh z?Z;AAmzeuiRM!P6@Anydvb)qyU$piC4h&C?w|%?HwyE#-RT^#4Jq&hOhgPqcM@muJB%SieJB z>q0B|KA>>}cWS*b4O|zFtEk^P59^}N*uZ%7Z-)PC7-ib|9h{4V(uGj^?ofJjDBbqy zp>MOHbXO>SUnu=@D4n`^=-Y6e;qtR66WGUQi~xsjk1vlJ?={DaW*8^zd_9 z47)jz?D2W`3ERGSLq3q}^j!3Lc#x^(h!n<&Qi~ z&ppC@v3w=z9r+_)p})cTck)MGM)`lWKk}nB@Exk>tPkHT!PmEaf8;Zw2mKIiCsS7b z$jiXnQsGVhNa}I(mQQlU@-CE#_2?|sGuW>TuVkc)?D>VtOD-bDLTz7N8iD`u3RC~7 zx(9jC|0o+mzBk?ZTMB4FJEFsj;1^u$Jj;aO`rB^wCF%41=pz~L?fl_I?AO3Y%le<0 z-<8&Pn{y{$;+swU&(104%_+qgNAZ=J`u>aeCDoa$V|~m&JA=7TB~DwfTU`7~`Lu~_ zRbHpfU!Yr+zVO4&fX>-C6#VpnAMIZVblnP`gY;9O^c$gc`ZI?(l1ur^i20Qdp^T3) zq46Rqy9&ImLBFbu{A5Adpx!xrFWhXQ>{R@={<_5s))cSx=lChc5%8ydE|TxN=|_^j zix;LqE8#PqX1zNle(0|JG)|lVYlM;o@J-Ct8t*9R!Z?(;g5Na1MSc(F_Y&&XN?PLUt_xTuam|8#SZ@cGuw_2l1Dd3 zK6UM-diY*+JK5H$bde4)hA&Dsr(`zw6TiN&|4A^s)3N5@pdH%PSo7DhK2AmF zl=6Cgn!n8Z7%?p|;2CbLxfi&?W6kb-`|lcS4ur2Zg!w1;&c+(`Npuv>CCd-!xyOGl zlMcq3SekezXsh{5-1<{v&uu%_{F3tj>apgr8u*s$8Cnb89|*qCSR+2E=Y1>|$ zFNz-O7h}!cl+{@C%K~eL!rL%wUl&s*@VC^ieO+qX6;E8Ka(3-Y`!#~KuP$V(cI_(- zuPeq+`{)=O5{l^?D_x{mG^f;rkILMgkw#yM=g(3*#D_~4Yi+)fF-Cdn^CIO@CJqcU zNOw(<4Egsc43<+|iBo+3x9BR->UdKhIAQK@>SUc-d;BDW_n}X9ex;K|rz2O|mklpe zso!OcOY8z)IOwiO5?E+AVs#$6{(0ut8y)m_0e#JyWg=sL$MZ{mQ!!VJ3is~`+9w^Q zj%hs0j-*~Qk5OL^j70{5^{`lIoYi_*aJKVNxuVWq=)Zzrd{q4(hmJ2o$6%}~h0@KJ z485NgN?#dD_lD9hkq&f{V2pt4*U|ZPz!?Wl>7DO{bdD)Y8TwiNgT@BF5nt>@-&Eco z%Zc|zK3wQ1Jr%&&a_JCk(@7iu8ue_(PBiCKQ*R_s9U&XpDHO{u&`#TJzVE?xK36qs zqrFSusk6%DbCj5WZrh`RhdUFS)^t@q1YHuqBV9GZVZG`&?SDVBjLn^htQueHRBF)iIlI&3H|o%8s;fzK?PS4?L@1C)s|<4qHaL77r&|Jjj+)`C~%m z7myZ?l$UT8ln$Hf&$}PQw$M3I_kW3)QPCbBlbeIq*<$%4mXAb-Zqgmt5bjxBiZM0) zZoro&d`96ZmD&ARVB$PF^-KMTu?OKGU{YG|ns(``?9a2oz2oCvJ|?v(-{c$kja=HD zhWrQoHr2|%`0Yqw*o}Fac$*1YLT49#2|8uy7cd$7bk&Ej9f2`}uUGJ`#m5%lKZ70- z?tbw_olCmrw>`9X+(})PCl)!Q&6LsJ z_Y`I1%Vh1I*u8Dbm^CHJv{NQcnemjFSW~8*deW4cM48EynMj#TsElIHgyRhOm_*sh zlzreB;#nuIAcMtJRu`E5*fF5c)wafbyyeHXL9P@d=sy#YdQxR>l z^hJ3_7I;33e946Rb2Dk3`ShRgWfwAd1b-Lu7wG4SdmsLeZ1PWNY|N=I_}!E)`st67 z7Qct%0yM4!cDZcw!q#_glb@`%GJac^Dox#jA)1AM)i%#+U$_t*q^o6@pGTW6I179> zN!jGo^M2Jq8Sy~&RliJ<@oR9NqI!d|sxZu0l`EF_wmu!*-!#j@R7ZWXt@qV)#vd!<&SZ#?iR;rkr)DH+?chkIv%BW<n{RjaEOq&mgZ_WJZ%uwLmZQ&}NW+ER=pN zly1LFWwO;YvZQsC4yVU^HM7=>ut$3;>r3!G%SG77k~_xA{j@KXef^Ov`}rTcrX25E zT5dmM!>0D%fS>FX@95H~%BU>QRmrn`E^XL!bYEj7Qkp_M@dox2ox=L({EFK*#iR0s zQ_|T4>_6=jjtiAhoB7qALHrboKmP#Z@}UQA*mNjuIH_m-Hc}fl5g+b-Acd`;e%2!< z+{^f$N25F_|Vx?r&@f> zo#Nx85W)xh&^Jb)i<6?R?E04q#Je+B;%x5?n@XJ1jGfAPl&4hi>9uMc*uwcxQTiCo z&hKL$@^r?GOB*&dIfd#g;9uX$*CstHJDL56o|`+iQh*MOOU%KVFI`$==$my(@d-ls)+ z_>I8Co%S)gs+fa@E;}4gT9x(cJ2Vyx7tP>X>oWAKqW#|D zF}3*w?e?9aZ0gq@tCOO`h^{$T8^`3*@*9CX6 zG*S=QbKJO6Dseo^QEd-Zf5gZM`BUlc$baMntp|hlZ z1aKRF9OW7~BSLfhl;Fm8dl>%sCNRa|gBZTaC~J)3jY}lA_#iaT6`mr%1|8U!y1+AY z*^JsPRNP##{D}I?z6B@6Sp>)p^TMc`qCd$e>NPH5OQ2JVZX~tPagvXCPO^)B`1MFf zk!R-1jld_p_-*!UsLzJS;H@x^Ig}Tl$q%jhL4&jUC49M_bS~qF*PJ4rL4JwU(vq8; z$)2GZ)rX`LbH(a3;Sb+PBvW)T_7bwuui&1Dj^t|e<>+c5c?>$WINB{0U8mITO)IJV z+0|#MPje2@Zd9qW6eF*VHmC7!TJKW!yvZg$tty{RQ*u7~XGV1fxcVb)eT{b+U_&4i z^1q0toUfX2lh32$Mpus)PI>R9ezs{V<&Py#FvFj$+vBgL-VgFlbrD3IXiBO6nN@r{ z37uQ=K4hkW@4@RP7hR*a(DNonS#zh3|4J{I`=@*oSmUKZoogy+#y@n!+eqY>UvHnjY!Qe2?v_$(d$%V3SS_4Xx|t#>Y|V3!)7#~X?-Dh1<0TlGKbSHam`XAqciL2*Nk zj0+7K7Z_*j85i8XCH}Z@g~s5Hp>ZK^#|8F|YFywf*E?dV8D6w+hG)iw6yri+eSIW5 z!)s_Sy2tSE>;AUt*1lpB{i-+PLVi8t!VGU~K0Ge0uNQy&;{xZYBHJ#whWB0Wh)zUO zk_XPU$uYj*n>&hp(Zb0TpXZz!L!(lDh z>{(r|Z=nOR5F2$ytz=mFUm$J1gOCp2>7Bm)Jn!#gY#L4n{P*8||D@#B$<0S!`1ilS zORey*@ux{ANe2Oc*&`0ZNoSE4^m)!d13%C)8Y88%q&MihxnokXYZ{{>@N<-UoMN&3 zt0eXz_-H^s5C@g0&#bJB%3OWSWAd>wMx0>Aid9~$x5t}8elm}b_Ojh8yO4IBvn0!j z7S3U40Dtim<5SZ2p(%FP;MrMx8?fJsZn!_t%Z(|{(@V~&MAGc>W$$?m{eX_!7n~gC z+ljN9kdsG6BktT|&R$&Rrk8fcGEJqihZdVSUk9AetR792Em<4)P2zwz{Oejhp0$mL8U z^67&HYU?wg`T`!KW7N0t+ynvRgXz$Cs6E2<9;uj7Dhi>nQm64gJpy4d;mm66c zDZNBnqOaO$$!U+fY=C0<2uo}H5DAC-P-F1B`tML5-x=O*>|Nr0kv4We)ZUw5`*vTd zSj{n?Ez&Q^$EB1RN&T_pf|AZNI1Ks_r`{jXP2;}kb_nkqfk$$oalf&!#B(x>z4IyC zobvCkN;0-L9<6w(U7cfH$C-4+Ar5=(oh-ky`J7Bvdq;p-_dA?o&VOmc|7^y7-XCWB zg&&|H=ctU?XJN`~->ud%67+9x`Y;h&V&xRg+g5me_xpWW%6r)X*JOrl%kSZ%QC-~c zh@QgsL`DVI!IWLfvusoM7^h$F0vOG?G!{m!IS&UT^iOOLMr75%IElJHWnsJl7z6l( z_w#{Kzsbx)nQ#wyExK zYRFv|mp*ZFr^#MwYRD~sU#{CM+-eWCa5vrj&eGnrgv0(%C%p__o@vgH?C819ivtgF zQ3D-4oJqy^4tU$;Vfdf;J>-t_i|jLWyr1V3`7z3hPS~felUd+#CQbYb`k!=`VY6R{ zU9iF<4i=jsS)H9)z`F$=`lB^Q+YOvC){uOdv0HQ18BKTbzQf^uC&qCGnO4E`^-<2i z9sIB7{H68ycIhL!C0qUy?JIvRdAIPNr2Yd0BX++-yYD64oMBIS3f+Rt)F)-X4#_9= z!&ls|1@6TcG5D|%_*~BWnG1|_NE?}F-XocOfN|$K%1SRtPkbIe>*P5DOh0+b*Adt- z$oZ_Qp#%74uf6EQyBSs8!zG#uhKqssQvTnt`YaCq9L~r3EPC#Z=f*htfB8Q+2h09X zUO&dsc^fI_9zUbbr&K3;FAJQiFK_yvt)7n_(HN4&#eF+g~0GBh#kg5@Z1Y2M-QNy%6DQ66|2 zt>5Hz-Y5C)mY`lsk2`qoO|SJnPTlJ3HI!M0Zn}~-gBZdt$}FW!jxs%hFQfkj$U?WL zeUhT@Ldpov(``LhQqQM(H;a7L^CzCOHT5nae4;`vdY9j92;9Rkvo5yv&U@;VsjCjJYOdn@~r`}RDtp3&Us@~WG|mIlw#0}c5e zU*_|tS6pnghP>v>l56SCnTjz5XQxzk{+?`WgTo~ARd|WD;_{xn@5my<;OctKudW!3`Z^mOu)@r#kumYV^P}PYPGXs>T}OyTQP6ita$i zembLyox$(*-hDr!96A+wODNV5$q(w9&0-%g$A-BO?*7HA&x{1`|7jW|4G z_CLpOpdX&0PR+M{{lGpg>YHnDldUq>d3rpyH8Ix}wHdeg%aK1m36G_G9r@m){jupx z-p9e6uOqrD?Y#fGty_4^rn}7eaSLs#os&ZKr0~0?D33kgFC8%#U2#Ch>WM6MrdOaR zx;*R;t0%gQo{$_0w~|BM?|T_IT|*u1&{2LH5QyG}RZHH+k+18!+IqF?R{w+26(jgC$Kb!n7k$-oMoJ)VKCO>OwZFESs%Tv8!*sq|> z@syFClJ2O5VK(`7;NgRmkqxyyeR2f(%(b`CC*PaAtv>k<&*HmND7Qm>!rY{x(8IV! zECw=?#)iNqXpI_rFwf{gw`jjjhTlB$(!1RIE;Kc=T`am&DJ#Ba?t8y%1L=q)b0)X0 zsX9e+3(nofrYd7^t8CjY497V|>7p}D?1o}1<)4kGPbfL5iz@O{M4hvkYjF0J*}sfE zoMsM^jy@v({4n)ICX}jmsYq!g^A?rw;4TU2ppnpiUb3sQ=!4jL#bR}&^|{saUVbR? zhm-5}R=ojkh*Q{~b~S%OcdTjzPSwvG$?(z~_*gJH=^Mr-3dPYQdpnbEp%`^~7mdXh z?2o7YHNK$UH1!&taPmW&=f45Yi`Q316&D`!^jC{z?$5-|JWGDugzS!%qCZCnzC9|K zr=^SEqm5gg^rCw>Bj`4*nFVuRXy~UhJGi zw9p*mD()whPWl@1Bfgdl6{+X8C$vW+~nd?8?=($&_Z2`Q*34|bl_d_tZd!iGgr_#g>UjZ>9f}Mgb=hXQh`y*FFpHx%|e->wrfa9rzU9{6D5_wt5j|g-hvu zoz*!)x|KSd?0lu+Wxu@a|3=c{m(zH!^6`LH*oNYbIQ?tMtn`ApAHdvi>g9aUa9Opd za?)EtS=I^eknD!b#hjI%d@96v4)W@IXnT(3+jd||k$(eyBzCKGQR;cd#H{FgD|G#y zXvr_^b4vAde0Na^ecyLY>B4lO66u>>itdp{5xXvwbhWMganPqLRzbyb3K*6CR| z_Ab7Ej5&6={!dWlssD`q8|M)d8U>~pXMg7Vv`^~vGPd{x@C45n_vQDnC_XlRn_T>|=3F}T5c+4n za3}oCORn(tnSi`;u2P;fI*7TB&buRam}jjI>71%Yp0D5;-wJa%oulU@uH>1$j-17y zGxwZCf#-Ujbp};edPTe?y(k{VrjMo{F>&G1WLIe(=k@BmCDA16Jh=%QWupt8=Q-;= zoqweHn#=oWrmJsWa>L`Clk}wFwbVjyHvON6Y=vc#&N7O?53chH zaN`$o%HH1?huO=~pXU1(WK(wQyWY=PK|D)V$MHOt=L?We$?EC+p2Yt{$m+TL-ox)4 zWcEzu|F7)+e@1rqhweL)-D4;JbFw>%`gbI|b>zR5?Ed|+|CQYx$?iSi=k3bwK}T&X zyZiIJ)3QtKo?>-1&PMa-z6^6s##-5Xjeo=6gieX2nb&E2N1t8Fd-;as=V0u_w}fBC z`j*&xX66PRg%#f4|H`+FfgJ_rna1Y2&b#zM-#%kZG4p!!%-pPx=M=u67-eOD#^qna z&SuUK{~}|W?_UxO_=^VpOUx~)_iFNo^Do`Y`wna+H|zVCG*0cB;BI67H#7EaW~@Vf znYrZx3wJ$v3H~*=lnp8SS98k=q&2scy;;W?qkgGAGv)#BHgij7__<|p55131Y>cFD zXRzMj89yobd=|Ydzf*Yr(8;s>PVa#)9O@40QTx9f!CoHzTWaQx1?-!S@)%Z$#yE2- z{M!G!`3>fd&tn7pm@z(_CPSFT=RZ^PWd?Rp{04B!dAS2_tGDX!PO|^v+8EPY;M&N> z^*bGS&ex~*8MSGtA;rvW_sJKncjRaK7G-wiXR6O~KObdw z#%t7p{tWB~`E*!A-YNUxcltKHt^II5>uTch zz!}o`=AGX$WKOp@0686JOA^V}r>b<{^|5yH{Gxk$I zt^JTD9kw5W@#me`4>9>C0^1=wWIN!y*{xaLS-Pkf*E zVLfp*@A0W`V>=LIV#b?qhU$=x_yT1$<_ESz*HQmyJAC#nY=`Gr3)NUvq@H(TJA9n) zwr4v$NZqm>7E@+>w!`-*^H#RQ9k!m!sb^BDwjCBv@^!*pybtSyPTudxcDOB6kMzRjln>huU*uc_%{RdjcJ9ut zQT>GV(0|7o)xFfaBirFSJ6uPZ9oY`u~8XFhkWlVQp6u(PaFYm!{r*~TS;C(EZ^0o1nVsLlWSu6PH%Ga;3vOrEMI-Tsl>V+ z^MjdYon$VtFHvW=^4at!h(r5;V$Oi$wb5(6H{7+}jfZb#e-iQIYGW{#?gF14gRyi& z?bQ=Y$GjyWKmRX7ebJb=j=6V~z6d9Mj3M{Lw~go1d`Ea^ExBLtuz%_4NJeJ`pH|MW zo}w7TSnfF1l`i7`oS_)Q6Kss3_6f&QqTzzl{Pz*#LV7U9Fu%+bjYKP*J1hF%AUmPB zq%@LqR~2LE$KO3c-mGffVEi5NOMGKu@2D@9_Gul&-z}t$+W0&8q!k{hHuf&?$nPh9 zvRaFamH6ZPhyhT1o_Hxi-2oqouM96`vK8uSa&p8FW){akL)kR3(-HcozSi;0H2T>H z9o1f4j+ngM0?)}WHa-fixy6!8i0NBU`5@(pCpNKwVOX?=*9a{2nPPc0@SI7RYu#<* z_KxLQ!fSBj4IiFSc5~2c zoAsmxWcmz=vp;PH|tQXa`=Lo~y?W%7o&xkSUdqrfTKz>f6lv8u$s9 z&$FfxUPqFw<-o&P;2>Pi_#G`hgR$93U+u5E(yrD@!u2eno)+pkfqH%pE)^H4wG+if zJ~46Yz}GEqwPq5mm;6uSb=v<+c#Z#y@cPOR{}HeG?cr6i4%uK#IJKJ2uhDs#tR|lEhl#(S{lWN)1K=sQK>P)<+LBf2vY_uyzS}$MRgL@E3VvmSrvpRr7h11p zEXO~)Dik-c#Pj0@R@u0Lg{4unfj_)|MCv$V&cpEwa~X@m@e8w?faOuAP{gg(RKAb+ zg&U=#Yhof4zmo%ZibZIOIRh(rj$%tF)&g6QacG6n-I94fHbn7ctHw5DZEQ%Ewe{X5 zW0}|X*Y-J0pAGGZ4f)$ETl*)Y14OrQ+(aAgWoW;P@2`Ts(iMt{(EcdJL_BcV)`1`% zLb^8`6QR9Q(!=IF6~?OfgF~mU$BSg)oy>ghlv<5X8C_gA#;nC?%!)yimfUJD7`GTN zuu&G=CjQj?U;7q1Qi^vNV`6t=eXEH-=umo9BkyH1sGT`BJqaF4k$(;R)tD-j+)}Z8 z5%)*)jqHS5p(%XMIr`d@#&%lq#*Brzp)fbUzj$<=?$59HP63Mc`b~y`gjR8e$O?!^xdLr2SX~ z-QzctScGeAEQ0RZnn^6eH8vJO_w~&r7U3Eji=cb>W)h2Vjn|c09&brq6OXc2i9NX{ z79o=Cw6O^6`Gu|#=Q$gTp!dWg7+a)+K0LRHxP-oW>E|Dhq@R0IwusZWz`KC{%a(DI zClPnSp1ss7@R9al_^}3z%l&QeyvD~Cc>c}z4y{iru0ZhxiYo}>3I6}e_ea1>;`O)U z`*zBOdHbF4{T|e@Bff7Ue@A>jlKlVW`?tsUnYZA3vnK`pE`2ZEuKj!1A!h&FYzLi9 z+?VSVqwG0JNav#GHa1X(cTKaConx7Ywk}1^WHV?C`W*UlK6>g(#-O!Yd*{8z0PTxu z&oFi{ri_wKMlWgnb15&on*}#>){5>T4(d`|{Q~MrQ`b^k*8p;@n4xf)F3M=0(McKc zXoWIgM7A}?Dc)Ui@0uT&F=O(hP27|kZ z^yR?Nz9+%i2@F|aIM>1;{WG-&PW46SgPjrT%ea~{>PrJf*H>fA`-Trdmo(yQ8EBseus3)cHJ-Z(kgu)=e;O3}o)Z~3;|(WIeodGR0pJx$t2 zqUUvo#RhW3Mrb`)_2`?FqqyyCbsze#wE}k}@ouCQvli!@!2VEtw|GNih9ex)_aJ`o z75ct`J~-KhgK^fkk}n?X+`PFB3O@&bG7Q`9AU?+roM@cOjfx^IF9{J z%+Ac}zT^p>WO6|zvBe#DPIP1MHLz5FNm_K#-jv_V4(B~^YOitsmG(XB6s@oEtn#9R z&aeA3{03}IKO|3e$LY^|A9{0uchw)L3}yG@ouPl4d$``zo;mj5rq;yqizLJ&+JD#P ztmT~EtpoGs#Rgs_hH)wX!CHswxK5P+b&73-KI@^MiK9n$1VeD9q4v~>ZcdIqLW>Ce z-k4n;XHr4`Pu1SLCCR*hCrmwZ6HgV(r9ZgvW|sR^-nvD>K84;=Mc>KMw0mTEvvYZvjZ*Zof`psDfroT>hP5i&;@7eTMdyzEPDAHe@hc2Cb zDE)rT_WN0W16?NFFy4+0P4v(BVZfjG4tCuroCi8A;IE4;f1R8zR-XlifWLa^mkWP| zztLDDUFjx9i-!{VKJh;B{lM1l zJ#yfPbv5Vd40c<#cSm1@jt0*!e2QOiW5yTwL9%eeci%L;WZ(xbtu5`xulx<1l~t7<3EDn~=Q!Vi z%fWZIfsDm4@wfQ>2LCZ^Dy=CVwib?(0?k+MA$X)vb25*TV1|dS7R&N`DRVn6o@CTVnDs{DdqR zeu`~b^U^l*|930@oCE7PYvR%mhrv6}=a6yY`29X^`>XhVz0X?MvbGOFA7y(g-wA%D z^DMr`1@G+dAWqR4pqMi@hx#jf#qVpkcMCkfmcD8nO47f-XbsXSnZ5Vw)3JOkISue7 zewTk;yn%iwr}bTOt=IkDU`#KJjb#dB#T)ugF>NZVZ&bFOvQD10p4@d_LEqq8jsYLz z2mWU2CB`h4>+(K1!C!0CnS-h)2F&u+yf(q`^K= zFegxZYR64KI`m9Ekio14nteNz4bF@5pC2814wZ#QRq6QY53~24F;3^!i9ez#KL%8H zmpFZ^y^cQK_b~^5;!VRN()}~FjtIZVPHu44c)z%iXZS|CM(g6j&uH?r*K8d2fpnH) ze#BcU6P$H`J(PGBUf0;r5whD@UokprjvXJy!H=IpJ|r7OQ@-1~jCY43BU#>K%i#Cv zu9SM;9Eeb+0DtN{{B_p%ULb}UnrL4_|6Y8jx&j+nw&`^0+=IGggSFS>FXLJBq9*cX zXG=E1-}msWImSrxRe#%s++BrkiSggYzi{l2p`4K^9O4gtm&J|nf^C=>Z*jB_Y0W1B z{Ggf>fz6YKXQt8Cr$ew`%kw3){qlXjeGmPrAEJ%$H|n3h5$?1XM*S{PUNJA(n)-y( zag_N5`TgWiugO#|@Q{jUfFuT)FogzjNjOYnb{3kMw2=yD8vZok#Jhv}4Zg zR$c^oXdyqIf^VTqp8UPZ*SBMMukxb~(cU@#{?75>BX8@~w`2Iwh z;5_2ju#aYg>vuCxk=;Ivd5`qKrO2DnY1AQ|CD=DoXByq*RD>vEB0UgP=C}H&(=%qp3wu%1 z`Xc;_@7}O^(|E7vQ!KBl?6EavKl7I%-WTt^zownj|KzuGxUFlHeO6uRn!0{YURVal z*VJ{j{dON)*Pfxe-d$7IRS9>Sy2jSj_2XT9y|$~Z>kA|N=aKgLUi&OK>uTyA)3|Nj zZ(^rP4g%cnI?Au>HQoz<6&aHGkFjzc$h6MzGBTYTlIbmG zOjzzs4#_lgrPj>)ZnHKPz;uk|Ip*0L#iNqfX87&mL%A!AXU3N@=WACc*>amKZ%R%+ zYu_eu%N+V{+TOdB1xjWcT6*vpo~e`4yBTu6@IW#2z#+t&SP7o#i0 z-;Y^Yc!b}>kc9_Bvd|YwZwaMSpC6K!Y$#m_rF%o^5^2E_j8z(IzXc3;`S>w*f_pD= z0zAREmb}vL^@fhJ38RH#xfgmG-ItKLJ%%r4V-nlV zKTl}USkhyCKac#BO*(6$wISu}c**;h&0egm@tv!F!BH5_rpfXR^Je^;>0YgfNL z#xsw(Ypd*+yDdM4{dmA`d_U$KZNtlRUNwX=y~>~X#8TH{`5ig>8r^h`|f6* z=TPUZ-`_d_PxfP%S3Q2`S@<;Pp)XbK=TEZttU2A~X&vZQTPI`8M)m2typye4ynvX? z2<_#v73@8HGAlgAMBjV?asVww&%$m^_Ux*E4Na%+fTjiLwj-KuNWL?g?)DC8`fJWh z5-t8&nx4HAG(EJ2ruh&}HMZ8$bjx;VdN4HYasQE~2SU^KFinZ8nM_<_ve4tr(wvF* zrdyeGbVdXG9n0V|&gr+=oLQEVT>5@t=1RmWG$ysi+^SgmHRAt5wnBVC!s%P-#nZ)d z247=+%9kxa=1aP|SUwRt!mIrm>esW%2Kl#JyKH($ho4IulFeD@ah5*PILu(NR z9<`~tr0z+Na5jWnC`KE4imv1V-C){0Qa+AMvHTnOdzSWH6@8wUT{VNf%}#H&GS$>~ zMpf%4NzVDxneI-C7*Wb(dagBnG4=HLXEh#AJ@TDVuer}pxY@4;mYCom4ylZM>1=h~ zCH4vUk#}W>dejfWtJof5YRnyHN#ZAkH{)xiZFFU2UrTSs-$${{`nTy9JPHiYEAQLn zCBRkC)=cp}?O;P<+xK{1`I~fhR_oCB$I{T2`ZZrxd!oe%+fGm)XB?XP8tLoE4ChPn zeEr8_10zT;C!H2g_4RnhC&L`OrL@MIm(%*=X;sbn>iRf?cgjPXeg7J^I^W5k5XsXv z`J+<)9Q{qv1h{y&QLuY>J2SMG^V^F|j#e5<-Dc14D8(>{PqIZb3BB{A6Y$fkm_T;A$dtUH+qUK3ixPR*5@OCP0SxV?lF6KST9I( zp0GXd1AD^q0%uL6w&jJWMss5`wpiYK&b}|{Th^Wu6xqL_stR)y3=6kg#TO;t*>N!aNE9%hPQ+^=EbZEE2`_J>y zQM4Oj{Js1yvvURxRi5BPA)Wh7_)bqDc zxeiqKA8v31U)_Sh*Mb&BP?_(t|-D!JA>*?yz71+DXLvUz#na>zd(xZDEA zX{(PZUnU%2LcXetQhwj)Q-kC!=*t`D`ty`Gz!*8=baxLm;@icv}cp^cG^2;nD$ofM0;7nui=O;^68m*ne0G60&(@e}0O&V|Mk6Bx&DH|t$ zk}az-LS@C%{`|c(>^G`Ey}kO;AJX5Kpg&aZW4m&062F7(GcLC|%Q=U=^ES2NuOIYy z^JM?X_K|N0K6LZavqN(eC%4RF{>Z%S)bhUYRU>*y@~D1KwXmqYdSDOyoL8zGGN`c( z+lX>nPdTM}Drw1AQ0}ABCCIeS+R|A-;9>B)lSqFgRjghhy^-?Q^Kaz258G(n_l#c0 z599RDs3~(k&#NhOlP#k&mulk(K0@7b;0W%9Z;{=UWvm27Y?;9`vZQxs+dc}Hg1ZHu zzf#GZ4JJ8D)i0cq-9s>JNf4?ycd5mI2%V> znsdnyKF#Uc+{kbY6W#wZF@UB<^ z=^SF)S~V|f%&N{)t9MgwT9*Adr0)uS6O7S!Qub%y_T~^hbS`Kb{gVOL>&QPX4ZV0L zn=L|{bq;tUf0CueO_Z57hdX?bpK1ILCqDsC{e%3Z;JZHTZQ?f@#3#0Y;=SoLG9e$C zk-6a4$cBGDFmW8_+q`ryxD?Ne=F^#zX$;p~TXhEWY{r^jXx$??H(7asU8b=`a;x?z z$2jJP zF3>|`SQ6M9;`)hT&NHHsE+>7&w;Iz|q8dYPehg z$07^I5f+ZT_$LRA(Jw}S(*LmDY{2#=<~-2??})FY6MWs`>xV$M=si{Xx+Mn>P^aeq zKfKlI7T!IeG{4dUxFBnt+vJBmpj^M zQ+54uJ2)Lj9WUMG<5Y4Xm;}!+@A2Vb{?q@5bGiFGjAvx_MdV9(*4+WRi#&+IgYHqq zw)r&et_bf>sjhsM*qAjQFd+im)#EIrxdPqbXC*z8uAF zh@W&O&|CF69E1CuHs%;xzLaW+*l|1}*{okd}E9moQ!t$v* zdUN21elunyH0FOzb-`;R?X%8-j^63NlP+^J@`GRR{fctU#ApV(O#EMWNU{1rNQdkX ztraI(0M>9hweuX`YfnJ9yksIq`AaCTIjQv70^ki|4kQ!l?Z^Z5yCxnlr+s-tIwg|# zW#sMXmanUCvRjacbxMbHi+owZnX(#p@EM!6-Ijcpw*uH}^#lAd$iIOMeT6zzx7t{0 z>ks&Jg6NkMZ&7!OdzX-tpbevs_)hYo_OvFwJ-xCoI7Hu+75{b^v|nlYJ&5&?j??>+e*t86^M-rz89rLHou7au3?HSF8J7utRs8U=Ps!t!9?+drMb-`FiXQMc+z&B_osfru5n9eQ4cp} z8NX%L@)vT$d7ow3#Q|^WnQDwptTf;b*~ENj{MG?)A^W>1&9AkI%~%!imgWWWkF`K= z#Y~8n-4FS5=I!xWFb<)2O>Xgo6eq-)s(HJ9KOUFzFM}e-9O(q?qHi9{l+EV<=S!yR!tP*eDAGGoBru{O} zKzao_Tx01W+FxSrlpWFjyT>W6k3FH=(J{5Ozbr)i&)Bvuv9xaq(f$(f@lI)<2+_V3 z+80B#SD(Uk-wV4jERR9_z306>n!jEglJ`H8mb`y#FJIno`reSde@uHS zhq1wSM&7%@VIc2oa-8uUqPhAMrg>-0_|XZ?HSY^({<*iHx#}B^<`;sOFdfxSK=ax* z&KZX0Ti~nd=y=(5zRlb28$`Y_%<4jQ-|JoXvoaIZ8S?>+65%ed&13S4Bgm zgT8*8e(JRr>$FqkVqp8AbiUG-YWK-n*f>Qy7ltKN=gj zQ~hvk9CcbgbaY!1dyDp_Q%7xk-x;PocPHDsm-c#TFRwPR<+05huZtEqmn5+5bI4=XUylpRWM1o% z^k*6{$;Q__kaf$ZhMsO};%s(gQgf8I+mCOC`fk!RGW6$&rL$hyERy30>9nKGEb}RX!+1+Qy2JW*oOCa#NvocyNmhZH(<`$5%9$(i5 z@m5a0SiX+)yEQ((uZ=N8XO=Mj>C6)35|x15<%(rA8f%@WR~z!(p3aHzWzyI+J1>L1 zzAkzCW~)njySyir=C=_Tb;p(FsQX9`t$vcvMR6A+QjBHDi^fKsKe7;5rPr7vCkjliQZP_Ui)7s0f`JO6BFKxY@x z58`TlxPLsreoCikeD)o*IhX$(wb#BA?Hy^`J7Jjiz7=Zkr7s`+mhEMCqP=(9_6`}Q zy=9^H)}7vN+6&G;fo~F;r*xFAH8>PLU2roB+&bVc3O@xg1zOiotp3n?%1o{2-QU=U zFNL!}n80(U+#$d1AjV1ZBcG1y;(j2r*W1_=q4fjVTUwVfI)J%r7$(0S!Nk5cTaVyL zgz93x%UF&)@oi9-zSEc~J41U^v<9ZJQa+3E_wSw~Yo^p9%nH{(9M z3x7Nhuf7nhM;t(TWXFsp-M}EdqxFad_zHy&t+VvOHzpQ`_T}dp-?PT(iAYYk6ddNf zn8bLC>j|_M&BKSl*Z>TQ%Z;V4HR}Tr;xNHqYd!eGUojZ_Bf5<5vFGp{>+^X7e0}+A z$Yvp1!Pg2I*pozmxW7COeZT>JHEeWZdX5r4#+R0R@;6Qi^=T=6x|QcE=u?(HH8^%J zE-^i|<+NUurQC7ylR8Dy_akfS5`Hw+e!${Ky7_}OWp3bEIGkwe@%QNphdZKSIz&Uo z0Jgsk8lDhp|0^LHHd`128cH6VKA(mr4$8*(2)Ah~i?SJ$eXFs*I!wHu=+el#NFXa` zh1$Btww0!@uYc3$7gH8l%GHz$aPkMrY5g#OX-7Dj6v9c0`V?~@dueC*`od8A%R)H$ z4-03|{?73Aq+$3v^-uEk!#W#xC;57kpy6Hy_dX33BOd5()fLciH;W(9P`WQ%CZORirkRG?j%%IfxYR@2Rl%n=)wbHz`gYK^Y^X+TD4Z1=RriI|103c|Cj2m) z1D*FcYqx>yuz#nu8p7jE7LS^%9AxpRHQ?~MPbzaG-&{hOy)CV^2juTH^_^^LZ)@^J)a4UOZ3-cPq7s=lH+n=BTYx3LJd-)-I zPv;s3_MX~RY(N-iH_{L3yesL)hHq${-nIc<<}g1B`m1u1NBIh$rd%M8;dOeIkvz)2 zd6+V?hb50EFdq%qBizcra-XTkm&XHK#}V!n$7AHe;DC8|rdXcdfWMLXW1H4$xw|sP z8IVDY)sF0;7V)*U^CPs`{5E8GcghDaUuXLzT7TL0OEUZm;7y0n{&298@GlwCe8|7p!P+Zv*^pUHM9}l|NHhK+T?1=h&D;eY^F>tZG`tWd!|Hi zt_Av;^EB6bm)39XfAPd7_5**q>g$Ucnp59D4!KhN4?K5&N@;ibCO=NnpO**cYHSg& z=kNu} z*PMF-I!$~`jK~X2UN_cJM!cbYi;{&Rdl*}zeoTHKAKDk#h2K#5Z?IplAw#SbuxU&S z`=P1NtW6j{G%_O|67Pg%LON+VIF-&?cSdYr3%CsUxFO@mH_8v;%U6$giRB@|uJ($ z?c-;^KJ5@woVwOqfnD$L9edqq6Tc69^UNN^^|Ic<8qOWF_(rlJzMM|oV^o%P%WQ|w z_pGIjm0cqKUV%R~I0G*Rf3IXb@O@w_yqWKIP0a5fXR{CDyu+QwFC5~`p4sHg-TQDe zzG|LUse@x*So_bv0%_;V*_mU)x1%e=|J(3W53 zrE;wMr15Wohsl)9q|g<8-ClF4+nd_A%$rtP=Cx$Hy|yfP$}ID;eB0Pdnc_09xre;M zGB1|zM$dM8#3J+)UO#y$)j*7v_BdR|`R5JnL6C1T(1o&N8aVH73VJ-pdPXh3 z&b0biJgdEK&DrabkyCXJVr$Z-*_YWWdvuN9%VsNjZkyuElzjL}=qo;xEQv>7Z}sJf z`OO`#h2&^UNRGaEmM=#t@8r<|^jUKa;o$;sBOl6|5N|6sa~-_B3%u=QhyiD8sLOye zelM>nyFbtJn?@-6F!_Qp-v&(JmVFiMD`(CHzD~nOtNGI`ezhm<1lpB+O$X*lz}i6l zt>B&g8vTN63i;R7v?ZC-n6T+Ixz|pQ4J46q$)4mrkoAjP*1j0Ge*q0vBU`S{ z#zfx*d_te1CVmtd4fMgj;Krrh@(n((WO>$FpJ4f*Xps}IoTjtW2YKa6cxA5T6_uyY z*o4<}W($~9bWWS)0p@D0&0!wMZOa2! zSRObS9@rA%fz9AG(4~JrGsFWq@xW>34qEl^H}rWp9#{>omx62Yfc6U;TGE#)b6L@{ z%&%zqbG{cXucYm{v{|2l_Io-5%x#C|m#Nfy8TIOnRPoD88VkU$XexLfp}y_WelFjA zhjO2V_RZU&ecsGZhHRIEzB zOV^rx9NqvPGY67grE$mLocx90S~&0GS2+JHFsr_JrdXa0-m~ES!@#R| z!M9U+zd9t>lGX9xes^#vAAw?W!}-CSW>@k#PqcpoawOT3JjMAR$$uK$7PH`ocAdWK z{Fq+W0c7LHkQeQlK2!V%-r~H|-9L+=uL}>E{?o5C{nA;8kAz@T+wxCrxy|oaFwe_4 zYrUIWs1KYweUiZi9&@)=?M% zKZ}9K+L;(5M&F2k{=$4ryz?i1#XJ4i`#4V0P7FHe%)!jja=HEB7)_qEOKlE6EwB&(xyhJlLTQarA)0qzb zIkKD=#`}O*g}0>q9F*Ui_pWoX?!Zmp4>ISto`WxCafnw|z$*oCaz1p{Tu|p@pI1|6 zIb}L1(_#53Sj$v-?REdiFy&=qW+^ZK!2hL;_F;wFl}^%}|9IOjXY?2w_)FmJpTSv_ zeSEbzb7(7>?lyNLy&arIxvNWikhX`jmYu-au5S}((Vf8AU)kR&+=p>y_TA#g6Q40A z!av%7d5X@xNX#urPG?tT!=XFMcPHUf2R_Rc%aeEGj8kkQtwYwO(B<%7J$VgjU-#*Z zh$eVVW1QB$nR}K`-a`Ax9SRA)WBkM();Dh2KPyP{?Tlh^vi_Jaevyr)J$tu@cyA?i zNy7tA&>#83q(iR{<%{p6XMRY&%lQeKS6}(@cIR;`TQ~75T_F7#q5TN$xw&GwX?Ob6 z#~76=mglhM8mBL^Kh)<@eMNIVpW-_7Z5Qy$)WxnP6$@!fm9l*PZ;5eEg_Oy*V8EHfI>-J(DrI%Ko%6(pp!4KHJZBf6V zpZverA_<4OqSR|(1lHgG0sN-36?{&RVOI5h`b}wE_G1I)Lu_3K@!oYVt8OtmWH)o>_&GK5E*&Bpcb4T#=@8(pt{8^i z@)LiUa^bdy(>L-HXKKoAPtP17{;={ejy8wWGly8%WJgIai-(M^!FJKSJ(XmB#XL#r z;7rxvjMd;g*x>Bd7Rstzus5T@J~!Imr2SPrEw)bi)KWG*j`Vn&ZYQ0#>4~H#+4N-6 z8JnI;dYVm7C!MwFS)^y%bO-62P0t}c*QV!@7OZ*udx`zM!v0=qe+%|k=e;n`Hs6@N z&^B$x6r0w(usKaEFY|Hn6?>pa&o^^(<>6-^%)=kJO&-3&!MyP`dF`RRbWPsGP~N1P zyvd=wOidnV1Prz}ttM}JC@))+H!GAkyC#qGatG_o)#S|y<;|_hn`iSx58)|a^L$Co z^A$DESJpfiLeHwxb$oki7V;>+(v5o%FN{u+tjqqveyVD0J;$D>hMmzm4mpcCoy@}@ z+U#oXkU}>&{<*6fpPf|aVE$C>CAH(9@qq5mto71)D2S$oF+&0NeA!BSYqv?C9mZupFz)|C5!v4cWky*;_hF z^8oasKj-x450rOx*F(vaJ5}+<_s6Czz?fBtVn?|B3~@` zT6~=l!q;)6)eqs($(N!AmopZYmQ%K&$obw=ME5hz9a{1qH>)qyIc5*WKJ0_(d_NxB zGnQFcO0ss;PFnnA=2SfkyjWoYb92^|$U9_rpI#&RM)~gt-)=rriKqOyZ@oL-(BOJc z^KD~q$VOQ7(B_9|dk*yqm(PM9;a9kQh&_KAYkx>u_DiJ|xbmgy@6hKT9qYH(zj@{a&;5B;D7AC!XodN!bLAO-Z`Ad#+-Nr_Z~KzCYwf35VJZe zDvRhg5MtIvH)=rGjqdI4Tqk63*B4e%kv!jD-P@#z`2YJn&nBPw+^$n^r%s(Zb?Q`| zD(u+s+#dhGq5E_2$ujr^cq{!-RpoqggvY@w=OGEz8by)J$b4>t0Hbeyxq zGr+YEE*czUU7IRw_VF7(F1~2YBfb!ywT5|AZWY*a@M^KSzg9eq4ktS`L}FieyMI6B z=`2CLoc@q!Wovi=8h zhQFf4()Yz<@aT6WD_aV~p4J!2b0K+R_WCh9JH*;!NyYFL>-E*D8~%!2vL2r5tH$zI zR%5xZQSa3?l#S+eK{za{Y0X>bE3I9ohI}=nfv=_jQ~H=o9_kI=iMZ`0o@x$xO83&~ z4Q25ZwhqqA??H~dUA6}L!FZFM@oNjgel1RwpSdc(xr%PM`n zn>O48{&&$PLm$f0T5s_p?#gT6=^Jdz%!Ld28XY8yu9_DP_%ZjhcB75bBkF6JJ;F7o zH7N7A=!`sDtGNPOkDVJfXI|pgHJDyc+-GMQ`))8lDcxT3*5`2PEOWtAZFw){sGrnd zvT>Y2Uo@tBXtL;oOoyh9yO*lh%HOCHJHqi#g!q3{_%jDs*ex{&Xnbj$Hjd33;b}8B zP|j@{r)$tpXybhDAK%UxjnJ;Ig?h}#NE_3=qLlMdGcNQySNjmZrR&6IjhMOM?V?9s z^t#Po%I^ennDCb*r#1i2Zy3Avxq(3okVKV#N? z!Q8;u9yEB}?%UbRX*^>>D~R+bH| zUaw@(`^*`DrImTai9W(3!tXTo%BF~p@Evfi1-`yJ{WqI7F4g!jZ>DNoo;ttiPD}Ad zeU9Xf_j8RceI?~<{<)Rka%##}8zT?2>^VApQQUMsK@X_S*Z@Kbrq!ul-8q{5*bO8|QSTN3rXl>WE(2I&P;ddUW@seb*R>Yu=dY;EgO^OP`ytF zBVzC2d>OQr?k0PXe08+W2frWMPU%tElp|&6RpuSza_K9QJH$=4o!#_dX)^Za&Zue2 zmg>8NN4TC84?#ER%=^1xxw1FJ%0<7!*+#!%=VlDc_MKw<>Wz;UodpW>*Yi-XvE4-} zOMEYx504uAU!&cw4PEY4KRq%2IX{pq@Wq3gE41$c9#PrTB?Bh7_?sc~w*++=yJpb8 ztZ`V+XpMZT{SKb(tgi*dPnSOicQO+8v zuk9}85^&V-6yvg)->O?S!FyLvHe;vWwx7`sl^u5jnc2qt{musZD35Gb#%@EO$X+Sl zjIp1hGM;}#@-}$CN%eJ5-*0{v)Ti~o+EM>%TwOyW&DhPMtA_rl)RB_k9&^}u%-PN! z#dbfJDb-}(A3>(5+&0Qx=$2}Kdj|KY5*9zx?pn|9@s))>fjn5G^D52aVJpwR8+nv= zr-SX5vC~4F!a7&7?If%-<_3O?DifP-ZS(KoWzwnbr^bDhIQZDm@*!5Xu}=hbzZ%?B z=MZIg&}Q+^KZC2ruV}^`g6tgfcZB?ae3;y(JxOqF%c4QRIVi#aGgO~_4TZfJ{pgr%g^a6gB$f|t`}}S=#CnncZT@Az5&0R>iE$X z;TPQP&)PjJo*g#x-*-cQRMGM~=8U2I%hA)wV`1YEzuXd*!^GEI_t}>0ls*^32D3_h z6V8X?&AN?PWq#F^pQ}zFz4+o6mc=`M@GtyO=Z{Fp7n*m(7r#0^;0y7@UCQ53=AWYD zH}MfwKiBKl?>Zg-gYqP+r4t)E;umja7gzhxsjm7D^efia-Lp0`mVQ2|*YKBaj%G_0oiT`7JDxd$Z>`axxtGz* zC8SRkclcLA2jOpltJXeVSRZF{n#=UP?ir3{9`NnVG%uD}L)#X;tZkeN@FQU!^bSMY zbasb-enYv!?K@$be-d8c^FRYW-vCGPRnc9^I%C*d(jGJCTSRyDgXr*Jn4k7EtA8|S zY7S7`kHfgH5oZ;+i;(hWy^VYCkR7k*-*Wy*U(lTt8WYG#TW=tKX5R@juN$6Xyoz^9 zjDPW7AM14Sp5~jzd0XcuOuf+TpTc@c18)UyQE1NTLx-!M(PKXDoPTI@RdPh*)SO*V z+rdM7yxNlzOnopAmdBiH_Vv_8#et{NS8ZgN&Mo{7UffRGG*75aKdGGJNqeTJ?(VBe6o_)+0I!+Q6I_3q)@NN3@mCa?P9yJ24KC&qxO zUk*0#s`gjapXwjwE32%qPg(mk>ny=HLYVrD^;k3V<@nb^nEDIbO0)cJw8maSzueN# znTbc(k1f(qT4%E_Y88U^M)L3{^{F48(_GunJvEHk1>u-2l=k?KKr{6V^1V5yei_YG z&3VRAY^9moDrNFXelx}9ILm7e0G+`eNHlB zyZ;v2B3fO=SM<4(Z@rHP!njX{aUVC|ppR#Rhx+&|@U6@C1r74!QtA+H=8Xl}JVTtY zHNj)(a>xz6ZLvGVNpBw1<;-7&eI!|~`&8=bZwS-=EAVF8u00^dZ4BX@b2NJZ@|9AX zP7m>J<7?V9I^-`1Nt=G!W{vC2r1HeW^wBWA&9`3G8^gFagmD*` zZ%~%>(iY14A!RYXj(_7V$o1%kPau50)k+%L}ZSTlANG1pdNa(F<(a!3ECL`Lbz8 zyk36anmW@v=tG&o?=(xnVDozuby>y`IDRDC)I(=d8TknZe)R zN6zq~UeY=H*jpXjy)M$~U22`j?`NmO3z->STmM$SH8bc%GEr|^vV(8R>6tUnvHNd` zOye8PTw#?-tMks$a<3ODr@h@NmAQrANvAbG!;5?8dAqOP>z@st-IN#4Cp^2bG9tXw z<@weQ%5}jj#=PE@-ReikyGr%vQx5MGdp$XD$WnGT=JkNH>K5*a{1w*r_!+>#e}121 z=iU>EWiPY3`Q1x>QFn&dOMNkSjTeVbw^C2s1^=E)O&L@9M%*hf4YLmk{t@txhxkXJ zUmX08E(!3C(T=%)0{1yZ@N=hnvpr~#?e?0;+v=_H?(MF(q1VgO2GQ_T{I?1J4ET$t z;2+IgW{Iw=sJ9jT`=~SeC-4{UYD0GQUVlC~2>+z;Z&E)E@;l{p6W0Tsqu{@UHYP>; z;*BBgue5f+H&Oa0ml2(&dOFLlzI*okfOqh9^ICJg-ZB?>E^hcneV543x6}u>iGOn7 zzw9!@Kk?k9)^vXFn})sy|11ap_@Ce(@s8SB`0!po5B}nxI{s03HV)2l=$T&(F0^Hp z$^w72M{P)#ue8KN;-8h|Z-swW&<6qi;Tzguc*yPb`g5XVw zL(^v$L4WXHO`W1;Jmmj)1OM0YFMnvSe>3&J41fA80{-HQQZ>MTh_YJ$1pWo`i~nzd z{!QeKWe2^L%r&iyfe7>;p3;>0hKL-!Y6ng2!i2xDL$v>ye3 z(Oxp>SOywB{knR|$MCJ@uSg0J+TJ6LM%j_#e`g!XSy(d>-p2l7tFF)nm?o-g^DQp-| z`RTr)N@U4!B>_AFJUyTAvf)aSa8%*P3HJ_Hq%SS;_W1W+fbZD+UhlePQ@!rKQf2xQ z^c(EzW?dcXNhcQUubo)_7&`kEtbMpwDUYv6U$=MNlIhHA_{*U8NY9*YTMynfOZE-k zuP>D<>-f!HgTL;B1ur!^fY0CNs$G84k2_ELmir`Q;7LE-y{2N%9;`%wCxEAW2-EH; z;iSTk6Yd(Utm^6YuAMW*o7!EfOq*S*oalX|b^;&wRozp)YiCbm?qE#~uSoyuf-dsy zanRAaa(jF?yT_m2McaD#BX26dwwiLT@{{gWej;;~-%VUMaoxlvup`HFSNV4KDnCY= zC}|?3NwF7#9)yib`)hmr4HvzS`TEl8;FLAq;H&}a#vci|g-&KOCiI>~3R~*0ppDK3 zrrb67P0g!D@@qZa*BkxC-rFB#4ZnTUWNSBnck{Q8zx(;?-#FQNh_7hMV)Vf_>8M`f~Qw)Vc9X&=|Ul#&P;K1^sO=pmQ8rMxdqW-3q-Ez|+v&hSqgD zw?gxDFSMRJSP?H=-!aV-FHC8J)?E*q{#SorKQzUYtwO$4E_i*N_e8sBw+mhD;yGTV zG}9A(&*{a7`B`u%T|wKg@Xt9&7#g2Lc{A@8o!?oB7q4L4TtUBI;m5oyp!F4gq(u7u zb=B{NwAOy6(|;+t>mGmbqU*iE53YmW$Y9#7eIC&}Mte06q@Yh*K`_z&qcwEmW}9|f zv^#Fme)mb=@EWiLG_k~c;x*z7uR#xs_S?|m`jykX>rzv_87oQ^HwF#T<=Tl=2WsN4 z>sQS1uG{WfNMLJ^(D&=<`xO2B z!Uo=ntUe8toCw9^~XPG1h3G~$~? z4&I*&kJB&HQ~c2n$?QRBbI@1$8vD`QLEp9x!Yc=%)j{OdK|ev7A?6C%E4pb{-CnVb z^+qrD3Uj`Kb+_#<_3ixSRmm*d;kSD^cThlE+H7YQ5yzbr^)%wW`fsJ@cSLESkr}_D ztN1I+{k#=_{proC)=#{$I7&uwkK%2=)-#cc+}~m6d$|PjN8z z1!%ONyjnY}Ono2Zt2L$8D+-VDwKD-7qx9+L2(N#0@MfU;Zwul3S;uHSBLC_+WzI4b zIgebxcMyF<=W|$RR_wfNASZpV^{!+lyT?bH#{LBV^%op-Z#(HTz-;R)#(Fm0yz@Wr!Gg4ACjY|(&xHv*Smi9 zN&4W!`^iI{oLB+=~f+ z)!+Vph~F96!;l|V`4F@|f1DQsfb#}ulhrB~vg0zxfjeTy1eV)M%HA=e=YFu#+vqR&G z@nq!}RV^>jt>RhqEA*$x(Jd9}R599~02Vp61w07T{-naaTPoKbLl1d;Q$;$J+AO)M zHeN^jq(`mV-|gKr|2(5>NvDyXB)I$>Z(7}L^c#&`_Td?irJD4dbU%L1{k#v_J=IH< z1DaUn+nN71`)5n{qJPX@TT$ox0>0&(Pp8iLX$*dk{XLy6i#dDze2;7DkS?XN^OUKv z29F<=J|$gBXSSwvx!5?6>&5j(*RY+(j;cP{WIHlCpEl^(?qSBuuVL>BGm>hdO)He+U`Ix(MFTyB#)R*>EHM>nc|NfFFTp?-|6VM?Cv5 zev~jeJ-*8Wek^~;|IAmIFNsSL7bm=K^~MT%8+zk_pU58aqy0%QMtqw1Bw_3km2`H% zPnD?$xC6Y2-;wgBic=o&n?1$|@HXHr{AT@9Y4ZmBw99Yc9l$3P`R%SZzgtU({O0ZG zSj7Ql+>L_YuEgXrxk5nnKE?i58o@EOGY|H{8d09mSFNv-5^3 zQEWRo;!4B~h4AHs?;$)AhL;e&oAA0Yyo~VYt}j(`qg(woE7n$``Gog*;y=B(R9PFQ z*}^(S>$a7o{VZ|A!24L!sooX9)DLTv)@||f&`5Dzr2+rbcaRhIL6PJwvVLs2*8-Aue-yOn+`{J-#z64e+g-p zmACrc)_}j#+UkqWqQMG&Z-LgLUkP0Dgm3Y-`UP+)Md=&p9kncPC;4tB?hD&Wl>+@% z8l?TxN|n{XhUh=_Pl0|=*>n5B>%;UT{a0AM&ZJq8r?0LD20fysW>0-IKS!IOXK68e zisUo>2W`cZtK0#96EyvNtyH;h9{K}yiN5{i0e^RCz%LdC{0;C+fi{m&|Gkgme|#7I z#Dlae3Xafx2t3w<|1j;_NPE_;9;v7w#9!hAwaf4oc&bj*m%+9xBCTs3n-9BLU zVf}ma1@?|N^JdUMwIjC!-RWxMcOZN4YW8aH8i}$Ou&^3OJ|kPB@G?jssN|WNn(xljEX%hP+$Vl#C zT{iq>&MbbpBbQ{|3ND%J*)xuMZJ8wZTAd6#gu73{^`M1)>;DJWW9v@hT5Nhbt~Z{7 z>yJtM=isV!R|oojl=FdU@a|x(qdoQ>@O8nnmv0we-E9yn@A3C@-uocuzoXXfXAZiX zSf6cTKHB8(&un^GU)dJ_*{_Ld&cHuKXH^bi$FIX;uK-KE0xbOsFy|CliaOeWbu_>o z^qrgT;p}6GLl%0N?cn*T+butwaD0;}Ua=af3$`}LD?qC;c8v%Y#V zPIPOG+cFx&iB>6anR`ln8~k_9J<)Mz;s>zxaK1dkoJ%^DF@G29S?DGmayN0BgC{UX zwmbAKI*!%_(s7cl!5I|oIo^`n>+4)S=hcnA(CAkwokrt2L)qV*V2|fWE4oSl$&x+^ z|7~gE%oAnGSJOh@iBex5=VdHsjk(YGDe?)2EazyNsW--Nd<~Aj_KMi}A@qj@T$L!C zN2gq1&g|&@h20AS+#7N3V=q(onFw_*$m{n~-Otp#N^1;s%|^Vh4)Ojucnh~2@?`-y zJq<3xowH7rxxjv`FmgiYlre^vk5ZetRotbF#u? zi8O?2n4oPslQ|To&6z&RakU3$GD2Ety||M2 zl~MRMjOR=^cE5l}@R=p8Y$UO2G;^!`C^{96gyDH%*a^ep7sbcI@H@h=8;1WX45z{{ z_woeg^#tW#5{3(5Jp0+5R)27IAsfQ-VH&$P$g{Fu#<@Y5v)nFwKV>>IS#Y50IunngVGa4byNAo%g!~p4dg2 z_mW2A?sLR1C+!l_&dv|}Usw7(cZxwX#S8WsVDBXT9Ma7p-50_#ucpjQSSIc5Tu7QO z(sYqVc_befkftY0vz|2bNn?@5BF*kF%{&emBeyeL7!Dnti0%N1DMf%}mmCg=wHy=M2&qA5GGHEKD! zll|tgUU#qGOZ&f=wvJ!K{9aH0E86!>+{b|8Z%!hdmSruONqjw$OB{F`1par~9~Mn0`SVO|w) zy;LtaV7oD6P3=&7q`#f7Hw3|B3HYQ)W9%uS5%f@dY+&*&ksrA3Y|drzEqA%UDb&~G z3pSB7;*Af{pO?6_mGs}De&K8G%nj%9Sy9XQqD%MJpWS&$HR@ba)wqacwWh_ElE=3| z=Xu#nc`JJI|;< z3>2E*4KE!9@3gbSKS*0er#vw2e?1QT;ftk1=}h8U^X9S2PII2v@Hcj3bfgEJhVoXC zSNCSLQQrMwc{hdS=}xeJ2+MOQ54mD+tx!1_EBL;79o1?MCxLQKJb^EDotK!M!j4`th zm*bpcP>%7PPv`a+U(4s`#m47;GO%yAm5TmD^ldD^%U@>X(Ng5)$v$2PK908w8o#?H zUvw+G%g6pvu~{pq&*cjc;rE4#;|q_Irc|r@&Nkx5xd1aCE)#y(c*PS}k)A#4YTDh! zK01HUDMlZ+m3MKLgnpnsI#atg?2j>IoI{(f%!sdjH05pU-(2n3z6<+lLmBf`*i!MS5Lby1f3S#@<}HdN7h3=b=x_V)I}U+<+KCG%!mrP_^z`{>66^%R(AzeJjY zr=(d)Sa(OXlIEkNxtBC5{{v5npGSOj<>N#2XO{ldc$G|S%i`;hlU(8aq>KF-`@q-W z$4`N~!e8gN&U)$`H~$*h zF%7udeKYAl9Hz&g)4)~&yD5ap=SJz40lV>(bn}6&2w|#6>7<+gRS1);5==fm?+9VY zoX&)cj0D~W+~5UW7XM89zK8u4;Pw={MMQgy{DxmU6Y#3x#k0b>NMngSe{J%JxA=nx zW#2dHc#lHs@`vD|rO(1MIpja})oD<#zvP^(znik^@DbqP@KX2|!jdWV_*H}tHG~%s z)}2sapzm)8af#61;&<`-fvwnMa$b#f)A5mfuk`|a<-ofxfA@YpWA*Z_`)>_Bnz3dR zPB@koIkO`~c zbLkv+f|L3NUCQvH`26P@M^@4Al}yxGU*@H=DJR9)s>?Z>zA*cfWpodx=yyYN7uxq^ z3iy_7JJvzCi?ADp&3+l-jxek}aGi&W!2?czp<1?XKbEFU^-r1m%M<0uc(3{wylde6 z*Wg>19UmZ^0rwAuxYyJD1i0F$bV`2{VYP83=~V7<+ISF}*5${#Hg`#FlY<`4`Y_`J4Sk&Rg-fiNCpo z)sIo<*2+?~16+IDwb-)PqPvId7RKcw;&hGzUFE_0y*p80D`?~DDcWDy;m;LM!b4Xw z<|X%4mgL9O8pgCQom=Z`?V@%|=GfLEn!=r-Cr<3L%Zu<=NqbiL zQS|S$XFEma7M+K{uLZiaL6--@yrLQQTT^BSab3h|eyh_{ZFSwX?eeYsJndB-b(*R? z-DxYHyMcCy@3ek?W^O>MubdLc-3xw|IJMTC|-+EfIIr{ zpN0EQ@wdwy%^8iO$OzL1Z$s{l!`mTm;UDu7{kJ!?AwpXXe`U6LN%zxUw6M*K6hG~i zUk#6yc6#>cKfWS={jY|0u%0*mlQSCHA^V(diNA6+?A6W9d3X^1O2SVW-pZcw+JVXm z$Er3VQxlv+6@ST|S#O8i(2g|isKd2aQEy*6@UO#zD;s$7y@a1){)*+$TmSCF_}d%G zl+E$K2sdSRve&eyops4%-tB4cDGavv76;qkN}POmZEIQdD#=wJBqJ z8dv0tlP^lXxKkL6w-pED=>C6HW(Q?Ez!9XaVyF*wuG>Gtbb0Lu5DUL`b&@q|3GML z_E2c^3fjP3N43vTmTV49nZSmjeT6+9c?-GfGSVQgD#?&K`gJo&es}zuDa3t97X2+uY67XTox3G?eqPupIUK$+Ua?HDNjU z6dGGdk@Dq3%X;HNm8ZH?=gncdNiWOKS+KA!=8xtU(yMHh@i+95T@-(CpAui}9F?XV ze|i40oJ9g}$q7!e8QpLxbd{W4!dLWI#FzQa*ey4TzseSN38UqDWN^Mq`0 zIpaeu*t5VM2x06i8QMuF{7ML`->daFurGwLZq@4sw0Z!zse?A%^9=6~gz&o?;I{(5 zmiDf2PU;wv=h`EV_m?X3wgm5X*YmCHb;DIG_C5 z6TbPBIwW&tGdY)dyWcbCsvkh+7U{Qxe0TGee6bs3OdD&wF64}r4ff1eizWsAURL{C zey3OK_ci8@!x;2Sjj|V$7f;^mrw*SO{}8lIbI%y^*U&PaVSa=r$dXDnvY9i8oBe;$ zo&`2d`gXF)=nDCMJ@_WGl*O9uJ<#fXgw@99(D#40IT&B{w05bb`uWlZ@4d(;)zN%P z9bcx7&jVLIIy1`HX}*LzoHfp54>>b|Y#+^47lY@cPjbf$@}XW%A+`Bfs<_#=oe{4T z;yRCXnnTaw8_le(wq)jcwtJ=QoHg!r7)-buIa^#BL>6!34t4rSe7LyQM|zFBX!)OO z>GDP|#`*u4we@H$^JT`xLS*&a6c<|BP=ubvXY%hX2Kw?G9Eg&UHt) zn=k4d7=!0`MTm|GqBjJh{$xrxv2_fpt1#-a>mHfCn`9{g^gG z^BViP#|NOTXk6EMwHDh%x)OB0gZSZ7;@?kr74a$h=XTN*NmDO>Iq)3iKSuf5OV;lX zG?aY_d9_AwA@2xzwU;cPh$d?-G`tG`pI<}kU&2@1M`-AAz|iA+q?3G@XhRVG;{0Wh z6+M)vxvJ0E>tE6utg}y7e~PDG!PapO>Feuc-7_Y9WD9st$WvM;8#%-|XO*iv0w|{v z0bk@vMdw7cKi%QL>(G3T&dpduMn=8u6H#+6Bzy~Qmt?U+x+{TOMST4kJN6}ajM-b) zdzx=G?<}LNl*{{-l!f0*Wf|oqktsSuA{i{W?gg6*yncV1beLFisH(FnDu?|(GiL<$ zOj7B4ODM=*?OBC~eUGlFo^oFIwjVI^?ZVZ6`GUMm(T(2ROZn_$=@O@UIHa_!kXDAMBLP ztKbFkjbuhd_Y80zD4H)Ja?}UtE#PSL-fyg*cW&}}*96-Ke-8P(oWTAe8KJ$uE2vBN zH@Va!*nGm;XN+g@{|Bai>>a?~@xV0esc+&x1pc}sjJ&C|c^lw%Lm!PV+EiPXW9@rM zaZL1N&%nql(RUf;YMx4%_AIGA4{hrCwYQ+jx%ZqK`+%yE5wQ#q6#6^mic?Y?_Znq}hOwXSvZ%L*^vVA9p6zU8OyLU${d%Bfa!O&W>DuC0@`DBB$kIyF z!h(lzYEF#GW{qAWeuh5U|FiPz_$?W~*qoP&l7{}OG(!*V0d4~?8+jAUd`fqQV6RwQ zi{&;}p?&8BH<0t{n{#FJ&toIZi5HgErchs>X%G6a_`9%{dtQd{5e@XA#&coxpgGT` z^>zgw*#{48V14xnbQXW9Eb&+K6#59fn(cyjJGSIrce}qK1Fzy!m>v!2(^0}^2Az9d zc#8V&he!SzTBWU0P4nvQVVOExmL-3;aAYn}83CRJKb9}BZYV&LVY8=^r7YRxv^TY! z^h&p!uxu{Z|7C2v4;~aB8vdi-sbU}*u2kR8mYfma-F-`R z+*O<5Gx2mAzdM|OcFa9qa>}JfPDBQZW07kM%t!N1YjcO%#Xpf*#jy-&?fxsOwliST zrTd3CL&5zu1BE2^jOHlq)%$;$Dw*cHZPjGw%ys(_Uw(09D z!hV@RJsqT-U1l$Zy6#f{;#YAe_=8JTbPz8{W`Gyz=x6HJohgld^N)mIm>V0PANCD* z>@k^OuVX%0L7nCd0&hlWzd&PYIroH_zM_9_R{zj9;=LuA?eSb@dpms|;SUj4Y+sTY z0yfmHa|5T+oodXTc@DPgBhJ!a%w|IVPi{%fj{ypfxfxzkUEWoqqQFH>Vj?-bR`m7KH5 zM>%s?s|I&FF{f(Ivhe9r``H6a*~`tGP}{_r(zsQq6s?Ho&cZJSyU0X*3|-D?E3LhJ zxcZUnr+ShNGg31=@*b0H&{y%uLi2ut3vD&uxQsDDZ~WY%#L2&HXESq< zGsBawW(q%b&iQ(AbhbG0b12Vp2Jp*0!d~YdKjBdpVdYO+M|}AgU$}UoZ! z?%T_TtCg-1ubH$7x5xWBbd2JgV7n1-DY~_VpMAoe>dB7VdTa=W^i!Vc-PGw z@T_OIaQ6HN=TDE&M*QirYrR(8Z@}4k$0HBrPRuI~-4ow}R{Y>~XUQbsPL?`v8Lpg0 z{#NSTeP0gvM^pU97Rt(%6p_e^W9BYu0~h=1?f@h8f!<<6DO{^|Xs%dPiPOYtKN%=B?Lp-;}OQZ^w)T%-yj{FusyoU06bKq;8=biJW%d5Tl z&Hmf)xj&EcB9`U7mi(>ship(u_#u`lcnNsIyJ4@dK1;z5nd}jN7U|S~!nJEO@SDoe z@2{imRu5gCGR~*W)X)(3h!?#0$VjDh4K$#S6PrdVv%Mq!1;j^3r+Tl?idRNF3;&om zfS>w3GJ39;Sh1zT{mNc!<=VX}kOl zr+9C2pz+T2mDyJ?hwNTY`!yamdVfjzbIIT0sEzBr2zjHKA@3r}(b_5r|6EL(XohhL z4?TZ5?Y?G>m%If&%A89c`UX0;m_8ozEab z#U=C3CC`u-g`O>DEJ6d?b=~E|UXQoOKim#&T+wEW*Fu}(v`OvLIIBUM2e>aO;N|r% z(WPZ{O+Y*7qBZ$W(pZ`EOt~6sx-UmG5p6`5TZj*6vf&kJlII?efF5gKksb~-%U)Ke z$HqUVN6Vns4b5EASf1z&pF$bkKV)-1iQ0B8c*MAm$@W|?nr#KQ5z`mqP0Q`}p6v@| zGkqlaB{?Vlduj>wB6qI82)XDnU*tBJawXs6xh>v9G4_$6qyONb>6>VFs@Fn)svqtq zPW4~gK|fpTy%un@DL3L4yiL?6-i)|gylS`VEHF0Dr7yvcdi#%Z_Z58@%@j=Cl82Gp z6t9~+Eu+Xm?ilX6Sccb03d5!6F3pwDi{}x9Mj6X=- zQJUj=iL3*QZUExCeeb9~gRtfGvlrE#*3b}(mT83(j|SxxWh25pa98Yj@$@hYNs z3?5M1=iu|8_M?u2k5_3O-B^jyF3~({ZS?XJws=;?t8_yL=PTgj3{+Z1NlV+}xsCh{ zcrSbz8^t>d;Klf$eB_y#uf#(d_Zsga92Q_)njEy^3B% zckQ=QM>I16u2aBEJT-tX-5$S0J;Fyai!Py#HTdfxW1yw_SaMW*4%eL<^hG2`TZ`+l z`JH3>L^Ad0eB==ANf&vO`84{bFjBD{;eebg^mwg>5wGu7_5B|I*f4Xp=T(}D8@!b9 zFP;uAvX2aV-Q>+r7=hmFJPW+(C+soetw3H1he$tg@NsFse1?szgYU#2u`G8Wv2GGR zhWEfJ2CflsO%<4*3+uhd7sCJGDLjn6lJ_dyNm7aRpKWlktabDcb5qW%Wcr~G|k6LWlJ>`&rgQ7CuJuQIjuP z%p3G`e>l;(AhfIAeE0i)^zZ#{_kVuxn-70+;w}F@^T4_*CSRVp_oOnaxbNFvd*)rvYoA=)))yK0 z>77p<{QVEde)`?YlqZvKcy!%_C!YIR+dD3cKU4eM^LPE%3r|NraKnZLGdExQ#^0S7 z`1J?ZO}%!{U#I8zf9N~@t-C+>uRpmef7LgB-T%-(ee1v{KGpNPv+q1UocXWA@mGz+ z-gxNn)BYX*{?q4g`Sh#bvvlA7zNzOtcl(K%^X{3p{qt`uZF}L-x4-i}w?3Z!yN^Hj zUnjo*uA$+#ed68^ct7oZv2C7x*PWA6Z(Z|=#lN}WmluBX8$bBb%&k9MJFYtmEY3Te z&DurpxD8<|h_Dyj=5i-tKlVL$&D6WkTSI>b`(Acldrk#x1iVE~9^N9aUd&o6X-Pg< z8e#V}F&H6<4?YM={+zYG~S*v7O6Q>AgiAzdmIK%!; zq*a+s@I{(3wU&#rKD1f8$d0GD1n?N;s{Cb~_36M5>#*tw(+J)@EvW0;)OB%Ye=SOR z(QKcmGfm2Sko2-KYCNcnp8^+--*_Qd)7e?>%I7THGS=0cGpe%Aug+mjr1iLL%n|r( zj(gp$oFCj^+Cq5_Y1^=mOv7d{jXMZ(+$S-Odvg|Y*Tf?3l9&oycM~iIJ{9;9?v}Wk zIMo}24ogXM4RON%4$+9UcLMk_*6ms7^)}tdO&x0IwEaOH(|Wbme~fk4V}8_qj4}8a zx)wMz#K(zG5T7JIM!ft-8snRYZzjHl_!RNF=e03D4Qv8wT1hjJG-hq8{=+^R5#2-l zh4=fxTR6`Frt>}8&+aHoHf-}{-{9?9mdaM=Cw>(@uJ=RlpK^hf`yswItYiDK_;!&# z=J76E=H1Lk+8^M~FwSEtFa3@!EvGeXO15FGQMr%3-N|A%_(k-%&H(Foz1*8ASL^}+Xk=_G7GrYzYNBJ_3CGj9m9hF?fuSk1CiJ_nA8GWG#}>s?UU9kk~y zT-Z0Agl)HT!LPJe7Q6!yqx_ZNAI&Tcao73i0QaP+Z=vx`Nx9fFpizMTx^|VnPx!l~ zN(>rmj3j7_;A%@9E*pCdnu=zJXq)J!Huf6&maskU2Di}84UVzQrgpU_?dZFxCcd%U zO~#&}GSc8`-U73NJptJj1Xme7_z`21!WX7s%Ag-Php+H}DT}=Uek&Zj@2Gt0!&M%( zZ19QcZQ?9@i`HV=xp*?Rg2`67q@$UJ?$E_&5DsEwq|Cf|w+MeU?a(;70O}63-3(PqM zowv)}!Fnyk(FI4h6lGryzpOjZ4+C6M?)vsV;g(l;X$=B2$K9Z>#Oq%bZk*SX&z(iS zUdpZW2n^h*vHi#|qh?$L_m$9B@gS6w8h%@U~Dd}>13+9m)}nKjs{B##?*k@B3xc>;-H5h#rEeeA1Zu z#hm04Jo%;1c~gZI+j2=%wQJJ4|#Rp5(%(;3NBd51r1 zvTUoDa85AG{CHZ0^wxr?XYgNxbjl9+* z?HzQU@w&lEY1U(7*b~iLQgfZX{##GV2E3&~7vPD1m)Y_v6U+Y{n0Jx;A^e5z=7u-6q~Z(8K%O zjS|)qbJplMHoo8J5R75P)qm?9t$N$PLt7f#et>Xe+aDp^*!FLQZU3vV?W<_(yZPP6 z_j>Mts(-KKxBB-GfJ)yTiQ9 zVY}|KpBzhKzdj>sdE(h#`b|74o?IT{EFKk4E+hOl&J&17I|wfc+wi7_He3|8L3m3a zeX5^1$?QWeuAD30D==p>2DzsL9Wz%!x18Bgyq!IE)>-Itk~P|6Z)5Jg5S*L1N2*Kn zD|_eg+J&WAKN!Oopn5*%3~g(2ElzuA)A4Dq`y)6yrensW=9Q8)T2UFY%bWR_I`F4q zT<16+VKvW51hRNCzKuP!Pd=Vqw6EKxt%O~|9fZ3Gr^5EPh3(h)oK1fXBb>ym>-jDt z9PEQ~76Uu{0qS^&HF&CDci~@CIVxJ9uSQ+jo0e1%Ix{=iH&BZTZ{$ z=l>?k`Q~e&1N-Wu|95oQuW?$Z!{}9p4)wE9oYgdRcoZD#FqgW{2JTqk3mz?Y!8^*H z&=9m%+-L9n!Ptc*`oQUA&vmoE#mE7#HtF*o^E+>a<`dr5M8Zq-@ATGDu4K4bzhzjz zk^WKIWbW&91DgzIAgXuSPmk#ix(xUJ(RZxxN_K+0ciBG}%W%(|ZFRBc*b{HgM6GQD zQ!LK6;oq^O@^RJ8I^v@Z_|FR4bQ5t}v((%5OSA7NT@#(e-QJEJkw3zmN2&WwOU`Tm z&Y_)>g-nPSwlT)+DYE4+Wo@VGt1gRub~b@=}Y9+^|{=mn1?v|&6=p}twn*JeMd`30RD=We!aX^IUWXuJt0 z;i~@Cc$fvQ^)?9S*8p$igXWLU=Y|>F=uu7YJtv-$Hmf;hPEf5?)Ps0pT3s9>RJTPxF%eg}MoAy!R4b zLf9p&b3BrF3kY`+z9W=(O5Z_PbMnWKaT@dP5Po-z^Y=5}5AuB<-y+|S^X(_@V|+ir zpJc;d@s(^aashp0&h^LwA5>wb0>#a`SDB-66`O|7$Ot zIPq`dLyhfp|5|LLYyF?Bj*b^H+$(I4R`AX6-$kCgGNYAv89dm7(_VHb^eSMlO5;<| zRt6ufYvCFBDQ_ixH|Hf*Or;M4!0Atv~fO@>}e$$*%@~ z>p0_}xeI+ShLKNnlb^`n{(f>%Uw}TVmH-3 zhuW#MQEQVYxWCnA$&XTAd4md9$kJ6hm z$g6(uf#&tT|0I0Zfemgd^l@2#r1{-Ne%*iR@^yec51)1#`hhELhQ*rYZzNqCy`WP( zf()%a4)3PnlV0+D>i4oa1ohQ@nKbXeLua?J8414`$VTBRo&>+z5774=@RhA)Mu@l3 zn@Pi(;68ZrxW?g1@Xu-Z`xQwvI;hPC-9L^`)Pxx}es|e2_ypr&xgjW#OyqhO{ z5#i;8HSaDXd?DfMpoivNjmy^));QD{{0xkJAAf84`vZS3^0$${*f8@j-v=0n8~7gO z`+2@2z(313&-YHgbNKEiPHUA-S!4*d63JwuP%DBn>FSHs)Gfc(Z*hO7a9=^Vi|~Vl zUB1FM2kdKlKacRq{!n=f13e@sAF|+_l}kJB`JMV?yWf)=@-LuYZ0hUfH|wQi_ro_j z=TL8Fy=}3Kbdzo7%z)ygV;sU}ud`J;3nkpUg?kRaDavlAT-kr3+>wh8utDca+6qC~ zF3jg#m9=Y-F|T-q8RHvt?)4wVuX)COaipqqS54Rwn`UkBG>6A>=TpzsHLc@xCgXP} zPR!J}5bac_?%&Q}x>$CGfvz4mJ00XzaW0c7G0IS7Rvg!BT|<3iIoBV{23V^BNb- zQ93^p%(1tHb1dh)%v>Lw_tJVN#Ni|05IXxJ?Ri`y1gN!iC>Ez)O4-Er1@1S04%fD#6hsWVhiSEbLHg+Vv)s?3P+{*5jmy$2gCqK2v|N zewis+vt~ud0_JGVx=3qQ;8$196P!B4Zwk)@o??7S=BeI){cV)9I;F}HQ$O}t#*^MI zv?dLhayU@H>RkX86Sh~h0!e|nbt%&PguH!>;ZAY)0s=_x`s`7TZ69ghu;J;?h1suEHj3Q3fbX+>-^BMa{<=tW5#LMsdy3yB{+tZ*BDAqs@Iez}?-$$wV`N9eS<&5D zY!ErkLC`Z_s+ch&K6Bw|!&j`2uwQCA#Py802OVa9GCiXMa5B0Gx7`B3$zbB1g z&+$#t58_M7CH+>Je}}BpS-K#631QEbGn^RcjzQwfRHvfC34O&Mp3EOZR@(Z2c@Y530 zhVPg*+~z;ZSNX408}dO}8lUerZP1!d`xk1%uwO83xXrZTLDPoY{0GSYbl3*XHMujj(zdnpd=LwF=n&tv$Z>m2~ekcS!qBNZu8Z5svmd3&_n$ zwP>kS`9AQ8wC8r)+T~>Ws?%Oan%toA$%^y4X%t;ky4#}lo|7M`!jH$Jz%1twdr(XL zW|#Erds>-)VXPnWCjxUgdn}j@ECTE=bSJ*{MhQm=zbXtz3C9R`h2a=s-AR5{7>*N8 z5bg}a3BtOc{LC<%B%C7L5r$KQn+Tr~hMNdC6Fxl*Hxq6l+#ZHo2&W0Rh2b>e34|wy z;R%FW37-~*TM17jJc)3N6|{RIFs-}ZfZfu`Y^-W-QQTLN!McZLVwSs|*i#PfyT@S-34_v2Shh4h(&xuKMc&dCyJZ-ra zZ*j&AKR6E?pANhH)R^r(J!V@2)z)&aM?Dqxw~SARMVv)kgfnG|(^}pl&bFRfXP2K| zM|lO?dTgB;BiT|k<_%R_onfyvzut?L`D5=~XNSRW7I;siJ?Br%uV4?7eVVYH>Ad*! z^q1QDHrn8LE2^>l9b@Nl=2mZD$MVBtjIZVx??~(I@t8ULygSbM=Xlil9_?IM(HRJc zgns?>n0P$qfTuG=A88Nb>9JN|;5rt`;;-O5eFpJoh@U0rGzY0qHE(L3QXavhz_k`I zYhU!D+nj0*3ig2268{q`_2$lvW*%t62zMJr&;<$6Cb2&2XR2uAOP5Lq#Ko{P%Ft740sH<@D>~%^WOkG4m=J#7~hpT|0i@A z{l->l-T~D-wDUsdIn7=8S889Vn>okIlxjK7oGcmT{%MWljLroW82`D7<~X~b@rWJ# zKai)=eb(4k=S0>xTOyjvE(_+e{2=9V#}nhRne=Jw4l(M}oUJp|iR%iUQyk#F5$a=Z zlRo7*S5}j5AOqf{{iw3e^q-SrjiU&lPkoWa{S(bG8pL_XBQX2~1r8n^sLcB89n z1HdGwG``!M%~j!uO}ZM(TCLh)w`SiMLylDCGSevtmxWKnibdMm1 zqt3U-qSpQ~Y$dyTXgl+e7cprUGA;vOL#36>j*vD&T6D`@FO_Riu1mSjlVidm>QbJw ze@tzq@1x95@XK1yDs$$FGl6k;$TNQZ)}mR^VHz|$e`5JP%va2>A^jp{_>y%nVdmz= zwOzEsvEEaSmv@Z0vov2VuEonk!F*Nb&VRzO@*37sTjT8U#-o`sw!~aT?=ot>if5i= zz7p;A{>^X|+BHYrCz-FXIr8QU=QXROIfM8!@^4^2n6+>>d{g(+{sH5lH#}2iIft1i zeoUGt&D>#AhL!m?;oxlxz-Yq(l_;{Esr(|mU&b%+(CQGT`o%+0U>^u!4)z$q-cOi&ahTi1Bm2kVq+y@QlqI?- zO#+zkR{5f(U`b%;7zQT#3zhJ<+v-2`A4h3Uk%fu7W?l1tHy5N|aV|KFzV>$Jw6`-KO!J(~ zmA+j*?6(4w+?nWH=_8N)31NII@yIgL2JsV!j}dMO|R!#=sr^8oMP3% zM^W=ste<^E=HFeq*1Eu-Byd*U1f6HMhyWAbUW4{?++ki#_Fl=E3}{ z`yeo`7+9>VIObuOIR<#FjBg)!>YP^!xaQ*&XrkZHoXm`~_Sx zI1<96z$cJiZ^23SMnibaRUHApN&W_MH>kHoa9|127N$O}K zPl`GuUz1@SDd2`DflIEYLUu$CG^T=DYJe_I=g`ezMqaDv<&_i@j2Mne@mgWpw2C_@(Ehp9QweNR~akOT^#v zt8=gcBnzo(ig%`5*52LNn|k|)eJhJzoFDeJmt%Y*bG*NnjaOT{d0# zN=Ut6@2*|Hzt_v=c+ZtJZ@M49Ul;x@7koQcKKiQ=2bF1Y&yXqG+!wG&cewIw zI=IsY`QY~yihedT$Qb?SqrIFrmOd?ew0!yHYuk;T&(3VCTF#x->D|~WR3s}`B1bxPo?DW7&|DIE~n+BxbR4g58+zjU_HKaNwV z>O7vIYXiP@TqVnrPP97Fx|TL9thri`Ko{O9^#`@S5wGbTK%;Y`7nb2W-cfT%-;I8V zo`Kb(wVr}DRGmD<1QN$7e6JgjX2t5;+RiN znW{^5wmOH~8Ds6#GYOdNQniWnvtzNg$*jSiwYV~oHZ@1APTFnm+?)tq?vzc(8K~Lr zt*n3UszxI8y|pOn(ueY2w<6YtiRdWv%v_$WPGqg%&_`M$8ofR=rf+6VM0`^5_Y#lKUJLOP6_1}_`j&MS$75YoW`ANI@%Zv}Sj<0+o0NARGP2jB z<5+u7@eB`m__;AJ5R|v(=W;Oi%9$_Yjtkj)jkn-G8<>GsZi@oWs|m4xm>5m}mrBifMzxEDv_m1wVmS4EWx%8P&!sn^- z9>zNM!OSLPf_QdOh4tKk?ww{mxXsR8%6hRhC_RdabG~($uoYe(-~_AYV6xI%U%#= zed^#V8g+k!Oc<=n2MYO!ZSrwHjgF%At3{k+;S0-HF>Bp09=qwTDC=6s`T^teM`Nnj z$vooQ@SFHfKIE^5@9I1#o>W-xX175P#y572d7ka^jwW>CJvq_9oITZkA-^Z9?JDn` z;A`&acDAyowa3sv`lD!I@phP@0k+Iu;zR?*L2GDGjAyv(Pc%qnHpLy)i+qh{9QFFb@m0qd&;3Gz;96N`nl9uU)PrzcYXDBJ@eOR(MfwU zddoA=tD$=($DC!(%)8%*-alp?ApRD;Wv?jv-(kIE6L$`AnlDToaM^<+z-I#2Tp@S_ z__xgZ>ihqjy0?#$tE%$7PrY?lS66qRBpuQ;4Vjt|;O78u4dE@o9|PVB{9NGjsR+LncoldWcn)}5 z2u}m&-knSv@Fl=AA-oOvPT(2fZwB5T!ZX0-4{is39`I}kZwEdKJPUj&@Qx6k1-=n@ z2k^H5?+W1^z&oAqr{0=-&G2Jqu9mtJI$I8T2y)ml@Od+x?c6^3Y%{VqV!9(VY-bj5 z`D|wcj{}eBJR7)twsU|dfJbzm1N>y*-N2K;BRY2jm(O-C@D%Wf&U1mwXL}Ox7T^(` zPXaEV?L6SEz#}@(10Dn313V2pqH_=M|L0f7GbaOY10K=&WZ*vs-U~bfJfd?i@P7t= z3h;K|5uHx~{uAJRz;#z@MCU%>4d5NXPNgiO^Qpi)o##`hvIe^sziKaW z2gWW7_DoK+zj|!&ZRRBQ*Jb~k+h4L3WPeH5Di-!(<0rqmF~`_bE2iuz z5zhNohddkqxlSEkvC+n_u=}P&c&VZ(!GvJ-TjXg30-T~a$BQxMx z;Km-A0dEIx?2#Gp3~*zQ%z(E6Ps2y_F`kBx+MFNwG3>Z>4qFcUO?geSXGl_9`w9cn5 zwz1)Kk2vzo8eiZ#{FnTXVG}0MEwY7-tQX8Z$LN4QWWUywilvcFptVT5^ay&P8(kv$ z+t#JTjNvcASM0#+gYK9=Fh1sgg0oQ?Bjvx!gkvO|QG4<7g(C;eezg4WvUiNmpj`G& zqJSMnn_4@4NV;{#SZC28*d<=l32Y#vH?1{GlCJb^wLfXyjeSu)FJaw;jlX6|%)(D@ zRnLpD2V*&L^epzgu@B-KJFyv}eTIZ{x0iKJ+=~z|eUv^}*5{3{=8Vv0lC2>98rTi8 zSB8)q*iYce_Z`_!vK@5(Q+h~Fxo>?iM5 zE*wuZinE{4!~NLVs&F_jZ#_L3$F7py70Ye(w3ja0+Sao^YpDm9S=bQ7a`n^-;IkK@ z{9Xp6J#we})!siS9E+~q@^IKEe%H4A(ePfyy&NA=T2|7c90tC@So z?-kl4vSDSDYR=dO3{UOnYPySY(eVXN2+(=$X=CzsVlC@y&rfV$Os+=dn)X z-T`R4{Q0rq?i&7k$ZEy)N?yd_DPqLYkv}rNn@;+!cd>HM!sF;0o~i#a_LZeCpF|Hy zSIVCg2WHB^m7hSrr8~a^j`XJdJMfypiGwpc#E~BTCOFce^7AA^9Bf8^PKYC&`c-hG zPY1wBg*ZuYx(B)9O>W@aHM}_ueF6ZX>fW%9O>gvgCkumyDbyqw1IPSh$G$n32>yBWy7_H zI2mwyLmcVp_25WH%bv@IIPKt^65>c_e*hfmYuR=kAx;*Yz7R+H`@P^uf6LD63UNBX zIW@$QE?JAhhxq>cGr5x~)ai*5XDya-RzUl~)#uUM zJLn7YN&4IPS$YFMOEK`p$=9;360HAOPyAl~mexYX>#}b{cWK>*PtzXr-xlh5?s8#G z#XeZ*N6}v1w2y^-h7)`&w>9}#PAr>Ey=foIiDh#roA$AsSk_J1w2vhy`&~YkNXP5$ zQzliDe`Vx%`d5A!lYiwsjf;>+ix!|`koEGtYkyg5Vfng@k0L+jx96($w;TQcR3lM& zkE=albFQBlClp9Vc7gnY+QVIR67l{^w;TWJf&p?*Q!e{JJ`D7-8|OUPqVvJ&-og25 z&f|Ai>yp78@QCaRwV^XQi$1M(?yJkEt9F$4AWJ)~CABf)E?7E_|9+ojaHc)91NsNX z>#`YU0n0SOWG}Ej&a^ebLR&$(@@8Wz%uTWnq4OEv0I#(Y&_i@k9*rdX=hB6&dy&Ui zZ$SU;K=*ATW;fJvTK^Nf#5v};HK+b4Z73gan}a{hsU|G;zU>;mfEYeo^m`1ymh?O8 z)Qn_uvbGEP$C(7mv>p^6XurINI*Ab81Dsg?xx}*1Wvy$Ie{`;NYJ&Y1;%qaKj*7F# z9kb9=v_&7Vb(?$xlo{UuIx1K%2j#pwd3(`S*7tq(d?)2Mu$?{T-P@f&2gz5`Q^F=h z_sBoh3a_Xv3BN?Jgf;55*u=Ftqwvw1z(-)?BT#&s*8aq?Np}&mT;CtjD2g?3cwcL` zi8Iji1E1%pp;3~uKFY{b4~@xrIXj3i2>b>!^B7MUzkz9I%5R`{x zdX-oTbZr2i1N`H_rAw2*H80e@eEwgCx1>K)z*|E2T;Rz62cBcnhwh-O}{954Bhi$+!A^c?EiszCJ%m8l>;l04oKN;!0cHr3%ehP5y zGfUTHfp>)PKH!Syl78y|-WkGA1+I85>9tPaT_OB5;HNtW=XTjYH2ilue(^U!f60(& z9%-&o(~NjlWZO^9CDNMv91Rr`msCW$R-)Wo#PXUKs4=N5r`*#{A!CQcfUW&ia z{+-52@K)fWm*OrI|DbUaJPlm*QoMz1J&lv#ZNQfRSDc0HJB^dz8Q}7zD852AoyJM< zcHr`*D6T?woW@D;EO7Z!6i*@BP2(hZ2XOgP6h|R@P2(hZCve3KEOK6(%YVBoH!-*C zw~SM>oYQz|>~sz+8Yi`hf9x=OiN?0+;X8(na}wXfi#Vqi**HaV`jZ3C*f^CpvT;rh zY@AYP<5aP6#seEiz6}ciOeUmdO$arI?Ah z!x}d%n?;%Si&Ul{PtymrE!#vk#X`=GFIZYR(Kb;z`;p{0!>-uiF3bctzh;{Vhc-+*e=M9` zC)y^o(^6C$!zbD%$O!6qvRAaHZETY!m|}{IZPEl&91?r%$dHY*iCGG5lj|D0c%PQ> zY1^cy$la*$qxj+k{ep~1IwKzb1JuEL*dMuONs`!eY>|G8H9P0Vuw$;7ip5s$)>h64 zB&{17l<(mGM#YBndyZn(TZvbfK990D1o>KgV*09F*0WQ6+JvOy1{|W1RWWasCd@h2a z=gk>E{gyu^iff+_UM@GrdvBr-FHQCk0~o83*M+rs%$k@qYkG&6cK*k$8_b#>Tk657 zwK;X-?7vAz$H9*~TF<|LT)rV(&p#nM;?Q$l3|wp66;av zp&N`ox10&yL;M`r4hN8}F>p=>2l^SD7&x;+9N7^yaN^+ff|Cew;^52 z=QMCyL!1_HP6}~kgDA$l6`a$-NryPC;LHngWRGkGCk>7RPFskR2B#;)k!`X8oHlUg zgOdqy+Q2zE#F3rCo&xcPFZm0=X%BHS;Pi$#vRM?f*A7lUIN1=V9h_4_9N905*~@}6 z08U4UlLeQT_H{-uxA6Vs8OdWd`cJVZ%6;<)v9Zcy!n(`bgsivnRb0~Y=^@v2 zuBuk8Z^{Sr#J0D2%b62VS#;KEIkF+|GWYZ3-72DoYiqq&O>wxaF>1&nd=s%U`|K6; zXo;AS!ftkc?T}SKq%K6LzKIZ?FcC=5 zz1Udp2(nqviFt~j)|r`~(Kc(vdWw0Uva0p-u`g8D%He~S{HCtz#qw2T@P7XY_}U{R z*RLO)L-|ebMc%pKomht=|ATkZn$+yOP8@!t_tITMzv;cqy-wzx{*AE@Xs15vIqG9q zKJL8)fBdfZ5-s#z%A2S6QeC~*1Uw_Z#F=KF;CLj+a2)iCgqG`3^ufo4_75h>RX?dXuR!kWyw)cC zK&+?1A;&#*XAY^~$eI{)M|=6`8POiU@2it)BdV)<+M8D{2+dJ5Pk6TOs)*)_`0KOi zZ9Dg$=P&V=cuaHj1pdO-GW_MjU$v0G*!SW58~nC8;4jJ&rVRelo)BdT$_#(i;4f&d zm?y3E#apqOIq$X={}JyL@RtSLvN!+U{H4A8-_2j}lK2aLN+Of7yOwm;;5qSI5u34C zJx?((_*tgTLu5I-z*&_gP5jjlf1P(Ce-W3KANn=^`g6ujyd@qxk-tXaIYW;(;4ku- zx$qdW6&~}ICr$GZ{(|Q=A{zo8)0t-RnDQ=vig!0W=D=fiGmlLe-;ZKN7@3!14lk7PfUebHgUwGNNoEz?v#6V{*ARKLBcetTHIt*L&tsXnsS&?eSY zzoV&sM_B)t#2!S??`*2y8P@;lua5V=j*qO(VGJ1q$s^GaA4Ss`?w_2borJ~*T5Aj= zo(RTp|KyML9Ln`9jiGb`{+MtK_fNjmRDXI5DQBF?HHGc<3S;;KGlr_Gu`^>x`9xFO z8pEjVU<~(9)|%SZ7)E^y#&G}Sx0>o}45RwN81A1OZ>p~`jOqttxPS8TrurJgsD3bp z`zN`NZi+SE2RhWjV)Z>p~`jOqttxPP+JR9|Bl)epvS|Kw;>eT`vMKN!RPlildq z&oG82Mg;ptF(N5z>?esbdrM2m?~q3iG{uFimp(>E+$udIJEB-M@!c&Y7uy2;i#-vy z#@xr&yg2#bPXaqsd$NLS?Iu6a?b0^JqKC|7ZBWiT^#cm*W4^{J)F;T9dW#e-Hn+@?ZWz#p_4yokDwx z(~sI~<9F1Se0u1)Sz05dEXUf<`}Fa=Q+dWFa)j?ak3Nud{E2@0Mm~1M@9&vYtw+z^ zN-pFNXSqrpyg~W)ljpD^&ons^h{=g*b zwBG2>qUQbQ81g^bfByOc?%RocYmBkQ7@PB?S_d%B1B@*;jX6(xV`aCm`&ZX7Uih9| z+4LRb$mY@tFILEVvEoHutUBhgK#ubJw*MU2(D5Q`Bj&{NGX81J0b)I}xtAxq zYOH~x^#XZ=%y0V#hl4ePY?G%B|Ep|Tvlh~tC|C~_XhU-IU22OQjw!}-C3IJez3$;^ z#ZFiIG3V#L?#YsT#af1vJQvW%aF zGYQ??XTn&_AK2)2!E+h#7A)OF4%mIH%MX%Idz-5`Xq^cR>JU3LRgbeTVO{aC&Sa@> z8+DUmUE-RtQG>cVU#RmqdS(l}%$~7%uI8N;)=g5kKe^4-SxNk_;7|rErg3z1&YLr; zymzdo@tpKIYu}rPC#_nueTuDH8@rc$N)OuhrJj=;!PmM6p5Elz)ySm~$3hPRi=)9Zirm33<>$XA-< zS9RjxNwy`ZYv@P0o$K{2`+h$0)+{O3=u> zIloxP-_+Xkjia%U>X zXA=KmJcqy8Wu1oXid9FEEn0t7cVzgF{Mn>6neySqYr2<*92Hi%KaPEEe&;szTddJK zt*y+>4R!gps1uyqR_+hhWab7PK$jq&cAW zHRqDlkArK*&y?-<6$?NvRn~R)PcEDOjxe>4pc?SLCOfPG;Z60?M@_gBQ zFJlujca81*6gJ>C?7k&T0+B4iABf}Sd44+i> zJ~xA`v7FmHi{swx{Wn9@(1~ny5&+gMV_G4M&w6<9E$MbO8U4QS<^nwK6aHo z?h^B#{4ihb5nNwqEmH=RhS}6ZB8IFbeqhly>{qZldJm77xvuv(C%KLLcaSSprqW5U!{q!zpahB(-#e9}>riZp$dFL+LZRNcqdr@{`oc1z>YW?f9XN^}I zlEqs4YhGq&%uCrumR)Tux1iTQCXVSo8__8yo2jV}qPzNVHhnmoKAcS-G?%-^r)^a| z`%3YMXrI>_U>iI_-yH74agnzc_Y5j;1GyoV7kEyd{T}2xG9EczJ+BkL8$OgJu{{6t z9Qws5k6F+2p`Vlovho1_2Flf@k+Uyg!v%G<4wB5&I_f^gsvW*Fu~+PQ z%6^bNCEH6np%oq-geSER+5+Bu_*Ai3(m4)1DqBmrBUGmqo|4_r55CSH%kC0>q;rIy z1m6nrg(tg1HiK+0qjxCZMxRpS)%qXvtufVm%LdJA{cdD9?~iPG7P({I4;h|tUI^rP z_>Pj}IxEv$Ze)2_E?NHV8RbTvhvolASQg{CG1`_)H#T7IfRX9{P328vGcDH-7`cv* z>4frW*?xdL41vsSu0Ji`50H~#n|JSw`qMK00KSfG-q?)tX*qv@Tn*d2%`?iUW&Hv2 zHf;0$>x}Ygd4B+3_%`noGs>rB{sHniZ1etTM)|bdKY%Y}n}@IMg!hkl@BNIaS?iaP zCAnYt%B`xrcU@M(vleV{UoR%S^f-RP727AZH=lL6L)W^;zkNIRj}UX$RcQB=`|cd< z=z%XX=RW$tr1ckD>xrwkPdZQFyS;$(6PEJY?DEh4OV+P{cNcQ}Eac>%t9#(&?8YT)s#2r zo$Xq&2PTu_$hE76>aQ1RCqLk-znMJ`OfEuqSezADKtIpmIqGLC{cC3rKUpG&G3{oH z!86Y>edZ2M-l4glEl$6C5dAf{oHNRtvrN<`SiesAgZq%fz+(1?{ zqxfTvbX8wRf1r~XE9vB9nfn+o;;vkWF)Xq^&zFQXhPRyCyl4sbk$nDb5@+?zCLbwR+X`?@0iqG zoO*{i;7u9eww1)J*0PmkbNUj%<~ zry_mV-JjoMd^>CO!y#VC;tYslJn`9|!}-`j##L*=1m|G~iNhI~;BzCNos4(>NxwbE znc9`&GtSpqPx}2ws`dUX{c`xtn4dMsxYxj;-tlV2OBOg+TX~Y_Jn6T&oZ+Q@7TgYS zI`dEZUDYR*hi58Rd^G;(!+NYpyXf@+=IV#Zqbj}q?!$>=1@=f=9LlX~y|iY?zvE_d zEu*X7hkU;g*?&{vpnrYspuaA6(0_mNp#NSMTZnTzYpsL+wcw<<(>BZbo*Tfs4!jo5 z;pqP26z6neoawpc$O1RZ-LvN$uGW=T;rLI#+YtZXGH{M-@+&MIbie50OZ#We^OUd$ zOD=aOo#t6Jcg}lge@&U^^_A;4r{}v)Qh5<-jhmB>TPPm%AF-hwd|bY8L;Y%S)3*-S zuMvLFa6P?kL;d!i#qRuW>h$et+}=Ikt>4k=Jv_e1t?$cvUo8!~e*rx(g){2RghDIe+a zq1+I1Wz2tcdX7(<@fD;ujjjua-E^hj-SDukJ_7E?Am;{jn8*~ z22L8ec1MMCOqH|UZ}NSoo>5^eYUjA$;HBH-z@?y7z zIrA)K-DUbs`8c?(w4W(CZUuP$qtxSfy1WoM?6?lRnC82{_cx2g;#m00=vzy1zPl7y zmhYX`kiU}O7QZd)YnjWA(c)(}vco-!AO*bG$>U((gXYZ@u3` zw55Ae6TGL^FR#*0-^0*q7UMmiv0gIdFXLIuskiE*L;mVDL;k>?A%Agw$RFIm?@(?V z-CAUhmiQE~ubH##12!~|bL1geN*8dBuPOVt^C3r@A0rkqPaYthFYKaD zk>7E%O+o!b&;ntbh3jT;;v-3rK)@?e4tUP#HYx|;^>MzwrH1gt%+S%OxQ)(rJelOoYHu%aOEGrmOgFv;>CsT#l?NZH(l#X zx2!DfBOZ$1jOQigeZ)`k8~(kt!Wl~aW^6C3?jt^n-`FCn#`pR2^c%jsyvDf*ek+fG z{=bX=bNR1%r2kj&znlN&{4)Pn^M4Nib0e8#&Vl z;60s#`xbEVsdrjk=tRc)YQoxnWOa@BN^9uI`elQz^!f4SdmHPQ%8yUZXJi98 zR9XMir%}pEDepLWi~85|yMP^?WA3w#mJc-VAmgCtD!y0qUE03WzhnMR-gC&4k3PM0 zxZWD-+$`nMKFu>;;#h1c@j05mWj;mOP(wa;K;s{=;q!Vw&eab>D`STd1Ci%_i22Ll zpYbn(E^%Ngy9oH>z~jJI0Ec%Bd#_$uIO;B6s%6>y#3lbmS- zo(bWX16RzSWKITndkB9Q@Q(r4ShoWwzQXiJn2 z`dWoVJYTIJAiin+{Cmk$zM0%Eo0-R)A!p7gzUyYbbtX1$<1csE1G0!QvxqUvuQk8( zx$pb2+7A!Ymf0uE=l1xDH&Yu|^Sq+H*~?p-y)p8eca;t{E(WG{FQDCgZnKwguv_h6 zZzVYRf9lM0$qD9s)%aS>nJdNVIpp1<&1P94S!3mP`FZXy7&t*rZ1&{?T#4PUJ6PgV zaw5o^t#enaD2wFBs@!JizH9Dk?n8i{_Uhc`xr&#<|7Ffy5hE7LjUP72jkQKD1abr4 z5NE1Rlp8^LAUCLQo3~uE00$TG>|z=QK6 z0sLa%itSqoTxUp>-&pu7fqx(PCBSutMEQ*czXbR*z%K=^GbGAyEcm6s_XEESxXzF$ zzp>z#0snj8tAOhaiSio@z6!Yf(3b<(84~3;7W{JHygPG=v-`l6-&pW>0hdqZ3g9|J zqWs2!Ujh6}z*hs;84~3;7JN1Ehk;)STxUp>BV6z+fqxFT&W~J0nc}?!zY4g{kG$LY zf#HdF=l0LtZpOehxz}P*4mNUCEUT0~EAhaQE^MgNi*6%PzTdSfUuG}#`nvY2xi2MV zG0#djSNuCZs+c^^EUCVd33-^8@bN+YQEQF3u6DI zTGVzK`Cmc)Q`hX{j$drf0O~&WSoLD^CUI_*wr{!+ox^vL|FV(N@N8=t|3E2__cl6K zXCm2WHaR%-p1P|_dPO;glwabu#b>w+2GBc$Pc&{D;A{ZTRF1|rXNY_V#N9jp?w>0= z0R0%NC}v7J`5*nRN}DHLcIW&({xaq^vDUh;w>QD_MT^_9X$M1_R`j`j)=qyWeY(oC zyqJq#vau2A+Y>rV1C0;yof_xg|QU@bhdgrgH&$()Y{gvRXUru?>iFc;o;#+9R zdO&wJZ1e71@`V3M+BIkYz*Ala;pqKz7T?_C;0SMz|55N1uOA05P8*U_!C8FW?GUte zJ2>WCAULKCaC8>m-1iW+^L}s?ub*scNB;2O4v3%~#lxEOf=%t{EWWuHB5X(gdBy9u zG_|9%_`zKfK|3qKG3N-I+R<5jbALqG&O5+Synec=9i7Dw?vx1Hc{4cXd|^{NI*V`a znF!lC6CB0sXPVm4S^VJciJ%<^9CPllsU4lgH}_G5?aTv5@%s3ur|7J+_`w|&K|9i2 z<~(9kJDuQ|dn>|rQs5{jJ2`cx+R;508gu#UUZ}yZYX3qteoAsUKiak!98!q?k@+Pm0E3NaQ*M$e>cB%my!N=^Iv=V zb>@Zotz0LGcUHda8(neVSM$GMC87kgdy-iFSN^|6jst{uC=8D{)DS7t?$UBpd)|ty1Qs;mf7v!Anq>+JhedUG`O$6%$mIkIXQCbTK z)&ndFOn04WJti7%>LzFZuW`0k)IopYpj`T&;|JnwL zd$8!Ru7@Y2n|hcR(r?PC^*?Dl(Y~(1`MvX{r=;7C@oWnlqg#D|=l+3jJ)gGfUDdtf z7lTK9F*YvuOHwYs)Ut8xs_f^c?W*d7t~LHu?5Z2;ea5bO?+JF5{If~s-KsaTtE$*l z<0slx5P8b3I_1Z|*{;$%sK4;-?`2mZV^ZH%+ZF7pDj(`bc9q&Oc2zmBt0cc&>L&xYvqr?O8pe{0qHYy8%Dr>f`*>o!mJ zm28j%xs+n`#l*}Pu(2xGSkZZ`+Ks_)=SSFAvIF-VwhOFva$8;bMPts>hl#~u4S9W| zvw%!;<>wyrXWCddz=!0ZH#QbA2D3z8*;t~B+P$AP$W3(A$a82YKE8@NdjAjU9pFjU z3rDrjVxfmE=96@*$*;itlU}lNPeb3bCmV}>Uo+=~BYR7}ci|{UU<|xCc(Sn~`$~Aq zy%6OJjDwQ^M>bZXsV&)CQQp7=I7x71V@39r+EGr1D2HGYoD?{+u~JR#$li+b38uhl z0Y^4gWM8Qr3$}pM3XW{7)~0r3Z$)_qTfs?#WB8^CM>!m#oP%j_+Q5;G)z*X~ zdn?L6*al7p9NAcreWm^=w?mYRFau6III^+Yo7$1R73C#t2PX@TY^=z>Qaj4|5alS$ zg3|$xY^;u^c4Ti6*I~xB1DsB9Qs8tp;Y2x(Iw?2nEGMwB#9QXS)*;wf(R>lF$;N^{ z=PS-dHiqW6=DF5Sd;Sg^tAH-8fQS8}xh;ENd6mEVi{r;kezLo+@DvYe>@DVNvmXBN zva_ai*@vg>t&;gWW%F9{O<;5+TKb-_jShJGVg$` zC7GjlkuH#370E=|RFYwK?g}sQw|9B?0?tY>-&L0Di8PlyJI(4Kf7^h_4uL8JF|p5?}dYysH; zvH@c5MrmK*Oq)F4tZ^pJp32w%hx-Oy&YZ&g*z?$iC&n#f z&jT~LD$JZCZW+8D;nB8uA&6bZo(HD?id~ki+J@cuWAu}Jf^qsI8!~2ZL{Fou!!?~~ zAOGT3H_l#+=3g-1FLTk@TCI_-75T8n@nKb` zeOTmcAx2?c?2d16FC8}5x1hBFEk?gg*- zC&Y7>ZBOx>hr<3p!*{$UzfjqWac7kA2|2@oPbjii;Ax4S#l9mGh^i z5m$U6JILla;)~LfUFdb>B<(2X{-)DMz4w1_l(XE>8(McmBi3%@;<$cEa$IKss{PQL zv#Rf9-FWqqq&wop#(|A1F7tZ$@jc`zUFji@`tfO=my#_S@=K>_hw>U_oMUZgz1YSl z;cn%f6K-qmD%PIU>(@+eq@Jy9tWWJ%LigJy&X}72w=w_4|MZpk1lf!a`Zn=k1ABB1 z3O}1^YlOKyJUNTW(wz(NR0B4>H}flWb~7`ysmLEETr%9dPE-PO7OL?TzTJvzD-(Z-R3Y?X)ztqkR(H zch(xVqgeWRwA0$uj`mD+=UF;zM|+=X%6lx{-_V7#tKjI~GtP0FK0g4?$vlg5%2V&I zy%gPjmIdd!KzgE8Fxe z?YHP2w2rVH#f5fIernURwD+RB&^kjL?R}ocvpCm0HKvmDx)ZG{eAWlR>2h8n7a8v! zj%gR=8cXecb}=W6j7N5TPkIkO!u7z7AK~}ZZC`HIZKY7R6_A6~-%qz?{sG;Fj5hj> zIgoco&}}2=wh?sONTAy&&)WB)+eZAGZ=dfjycPMm{>jG8w=QhbZSjqgE9Wx*@|^uD z+9OT6jk93rwnu(0yXn_;+hXZ92i=B#zUB4>Q|)UX;})I~>9%jscFg)PYjVy*ne{m5 zn{w=V)JEP=zY!N^ zn$A&w6K-aP&Pj1D_ynB;O+GlWa7yQVa7yQl_#b8r$r)kvO^owZHhd+WBblgmhGcz` za_JlCnQoO+rgetVIc5+1M&!pv?9!ktO&RgBM$hy)_nE!VY;Nms&^fFR;1}tN1mCv! zBGf%*&EaCR;)_;4vS!^O-0%8X7hJRMkj|N2cVt<27@cF*9m3VR1Kg%{$F$BFnbtW* z-%S56=0?~zl>Nk9K^};|#BT%lun&pdeDG)3B*kG@>+NQKGxp64UekIj;x+F6a^u)B zvWvuPwm*zDw2D+jtwxqi4CHS{CBG^OJLKhmf+Q$!kNTZ%|eQ<7U3THMrfo?+&;+K$q(>j|Nr74^_;7GR_JqQl@*vvi7 z{j->koWLquwL5lWM}53r@7}ANY_)J>A>U(u8voI8h8h;6obq*f+{G)g80Vj$L2z*GR-e2nB0)Y={)Z_jiblWseFE~-m zK;T0fHD?jpn{ZA6CyE~kd`P3-t+c~gz^P~TffL0N1U{ruPx&`Hns819CyFZwd`P3_ zUQBX5Oto_wI8ls&{77Al#pSfq)r508I2x-i%2zb$Hrdp&)!zk7`b}$a6Tg`cVy%}J zEB^9A#s3e^$ZKtrEARA|m53FvwLaW|EvfHnWBBH3ee)V@GW<}QuaE!naQ#cfvd1gc z`sjvgedMF8dA>g6<;U?&QRm&rP{k-nC$ScZDV|^@u-lI;b|srW)U(LdzP{qF2lsJi zxtntY+T-U=JH=otCR+Rbx$=;|v`Ad>&^hi0Zyj`(mGH?IhWroRG2gvyEja+~G1l^m zL%^TL`lh=y##)(}PxQulhl0F$I$6M6Q?R!SYD+%pnf-|y9p^TpnBH4vCy(`o=P?v_ z67hw2Lh&dOUwjKbiFiRah0YH&^Fwofg(<%H0(?;=mI2;)R})_#2Mu3b2&_5AL*uKl z)wnkEOEa$+9ucp=CvU_f;*YpJ#+nFzfG_$=tXB*02Ym70pr08F z_dH|1(t;0cc%TLkF#e0(U|(7HflB{q+*@jc?&FMm3cj$(JCd&vF9RUY2cTMQ2n+tjOeqIX*q@_^cUjJAFo#Nwn(0}x27i~yKmB_*OzE;Z`p#FzX*L>rw6m9(c(D9?Uh49z8Te6!oh^Afc ztW?{1tKz@Uvd-$kZcvUg_75IRE-1TQr5B*%3x0BAwf@u&d_C@{*O@E38!B7s>Du#? zot3?QN96^RKV%DeLptoetRY_T4}dG2EamM@6cwQJ$u}T#*$Qxll z{RwiVjBwUN`BKo6od2p#c9r%bQ|{IM6}{d0&3-aocDcXuNRrt11UXj|_MS$9ytF;U zU49gv>SG*Yv#a$ly{!1ZLPK|55pTzx^@cAdhb|vTjoPDmv@STIaN>Vn+Z+N{Pvyf}WA$*ZK zBSD;4dC0^vIJJZRxx}uNbI?8K&RJ06yk_B`zkxda)6z&u5u6h%5yVX8mX6QuSQ#U)6UyV`~2_H#*^S|E{xRGPOe7Wbzz_X4(cwa%?oVu zhVv}Nsc&R%5hLPXz%#@HWyZhL+3Ua4KIp5>4Yb+8y)et2gHybd1^*qC3t#-w4*vPn zS6|EYF+=&=o9eewe_2y`n)0_%UUnD@$DI>Brxm=nHsQ5^_m-x1Qj{-kDo;{=UQ>C3 z@;5h?$0=XZR34)|*Hms%-ete&kC1;^djolAC;#{QR`~^Aa-m%8!B^?d>9k((JD5vP z?UjF0b9bAecf0$7FZ$@cH8!W!o-kvQslDLe&6u2OJz>V8jr!Xdhd%oW|5@4y=Kr?( zDa7FG-CJq1r7+!Auls}<>lE#4jKx1E)3)*)C26~dcJD5*KTNwCYqdQuY+G~wB-&LU zW3(I5HtM6{8QPm$VDFXZ%%R=cv^P?0@n+G6?pzdKj1(8Trx*EOdeJ|<_@ZAf%=4^* zJLfd(MgLT2_9XAo=K>FDafGdlJ?9Y~W|m<}BKa#!E6#{TZSD!t!2!z}@Tj*Y^4gtiApS=PKvZrsE+0 z;ECbl8Sc47{+C|x&n+_kAuY~<{%?ZbqQ#&)%@=1w_vksI#Rbq<{X47ng1?FWy%TzC z9L}WvHpXH(bT@sbtwrVOcGSlCjEBZRii`B-3jL`+q`kjo;cl*g+10(>N<~74+ z{PK(b*XC@f&#qPLtD*Uq_in2{!TY`)oF4jhMQyKn*JZRhn|Hm^g^zf@w^7~)EiW$z zeDqe@nay~=i#AmMEn)pt;EPsE-Jt%ZDyMJf(a+Q9n`m_z&zMD9d-hiAZw9{7L2gig zmiULZW{12o5By7b-o>=Jf;tz`*1HShk-dI5IwvbTYSVX)d;z^B+e3HAcR{0z`2T0< zxiq%QeK#FHmO@7n7k|{~Le4!HJEa)xL){Pl7VwMML22}3qFk+i=ZAqkr1L`#dalLM zI%3S1U8H?B3tRHcUuiuN*i1>vK#j4hS7SW5?syO{qKV!}c z?@n@tuZ2$RkKnu9f!)kH0NVlEaceAhsi!=;(2ejJx3N0RFTNTY#+|?p9>We^D_VW_ zJ4a&BKsHE$XUi^GWtF`G{cIs#vMYq0VU2kM07y0Fs=^iHSGo>8rTEp(QfOQpa z^9s2!FICv&4(4=jjU4aXX+D^{1b*0cq|4fN#M}i|81pVdC)6StzXA{?u(b}o3THJ zu``CSGfn|NTUz7ymDl(u-BPX3{dlWeV7{e_EpBgNjo;%T11fxvukr7s&b5@;@w@AP zO5N-EeM5pe!iksb@A<%ReO{GzXlpKQc2ob)sPjp1=eTRoVQc(Z_8R}jz1%VW#J2hx z=B+(@gX!C8)W4|_wDsN{)%vy9AnS_z{B<9w*57kpwSLMyTk5^H4A*@=gL*5;szYWINU!4aJUxfS`&3Pa>BQ})>(yFnpb$9ve zc$XVX^o2eZ3%j@{9vbF(=iDy86FOMT+qlj}=Ld{`S3a0^W$0cS1|OR8EYVbVY!2{Q z%x93#A9o~=eI~~}wD3b)h5Mp&mm9n;#xZIyy5l^ewa%W2-ir&gk%#7G+AQI#g4Uv$ zXeYYe0iIJ}-15PljDyfI1>KUOAGA|`NzqO8GjxL{iqCkRKHVSAjsB0pi$!>@jI6MO z^L(w%5%%i}}ognbF@`&lY?l!^Tv7L;Q z@)j)P-SY03Ut#Q4LjM@^Z&_u`A9aTPFWo^v=rx($kyhl4cp*gMC!fyU&%(y@D zTgTJR5#z-94UOYA=BMUeS3a1Zi<{7Lwbhcb`R5TT@4*?sb{LVs!vr_%;r=VpSdJXX$(d$mpiuYAskOcdYZQMtncDB@i z(|z=BbT0IEct-L3%WUS{e9=a+7_x1)p!b8=JCjQZSg;=kJa>O8@9a+DvmlOtOG@-$ ze~!7Zwyt>60&+q37MeThl|PHK1Ui2aqg?s5u;CsQ4z`)WQI0Le<_kw{#K1{~IHnz& zyY1DE$|;P?^zx2$xFz7)ys^L z?uH5apUxf7TrzRa7XhE%n>yeR16OSG3gFZGQ3w1oaK$rU419VI>VPl$Du#I_@acW0 z1O6Sr6}Nl|@Ms^YgXeZSFQ+cey=M5gGj|~MVdyJ8tTU@O!8Z@h)FYMOPmd&}N6OXT zsz(t8&AdgK$b$C%gBC5b9LF^)cg=YE?WkxfR7r?JywIr?G;HrXTm-gqIofAR@0 zW$iRJTC+`dWyq`2AzAczq(hWrBY_-0L5C0zIKyj*6!NIprQM0(`2 zFQ7+kRUmM57DlIOA)RQFTN zr7|$dOk|OfU-F^e=~9RPLuK?IIzerYR?sUJ^WEO%?{q@>s%M7w*l2}$&Rnn1_npjj zqeG+<(Ia`Dzmn%JbCEO5(HnUeqetM06ZD7~_urvM&>_mrOMbckpX!h;#LirdEvWlS z*<-`*XKhQqk?JO$3FG%0<`xKa$OC2!PShczp$>V#KT(GO&pnWu)*++6Lx&uip+kbZ zNl(-vhi2%I;BHdkBy8kAYqf+!J4T0aC(7@kL%x~$|5k_m$M2y-KEyej|Evy);)J9_ zxQnMrha8%rLncBUa%hGQnFw{rp&2@4BGe&=X6TTKP=_3vp+hD@9dgJ&QHM-~I^@s{ z9WoK>kVF27I%Fc$A&2}Eb;v}hLk{^T>X3<0ha8%rLncBUa%hGQnFw{rp&2@4BGe&= zX6O*|`8kK0bjZXBI^;R{rYaqRuPv5aVSGYK)@(gmf3V)xc^2kUX zS8=Ls}tKk$W+!T?_B=mk{DKz#u%Dw}hoQ}* zGiZ~31KOPbzX@%o=mJezp^a$OOq=JQ5B!e5FMTe6K955m-3_NbY3_ha>l}n)G_=>* z4V}B$_q_Inz^`iOzjNe%bo_^3IDYg^I3bOH6`!TfA80LR6|e#FojqQaTpT6s$ z#96*7Ya-bsj`lTQnl$&lk+&hHyV2h8u7e4a`#ELqej8!kq4S7i{^_(KU#;$YKmbI*bJOSClizL|Rh6iXG} z6Oh-Lha>(`aAn6g-}$Ee$yR>sUhy9+h zcQv$Xr*Ba|MI)UV%QB8hdkbqS?y0H~Z%X`rn>C`?i%sZnVtuZbuXz(b_Z{eWH|7$* zS=frKxEh;qs6VA|a_=iYb2eYD2l<&d)_+re=5y&sTaG)c^7l72(Clm7smIDF>7OOw<2ja*~V)>8X2)sKc1OG&N>g zgDFl=u~!B7I#H_DA4Na3)=oCD+-Y)CNQcT7BOPkhs&m$siS-*FV-1YH$zATPh<)7b z!K@Gcq*`}GI_X+)wEtmZkl2HX=aH#}G5p)X+?U@lMfok?3+}2<@;gmT`32ui9Q*3S ztifo1D{-xf+z|8ehQ`)vus5djxGnUjt#Y~d zy9AIOoKdefW<%Fm(ABOr(e>FucQ!Pg1x>r5lW3;9iQ?mTxs$Zr>fGfjM~32)Xy-w- zBbtz>!TT}g#Qb@peT;gd`y6}+~0#oDo2zw~*vTW$Oc{c7Vqz8SuUV&&AwW%*!k z_h^nX-pzLL^2%<_k5`l<(<&o#d6z}>FUgpQ7d{F7ZtWQ`IfPq_A=P%POSiaWLJ4pI`ShFol3vsYi#{9#M`iFw zU3;?18)@^b25tOpYx3B)pxa~DU;miswpjBCy2Xms`da2kYpL6_?Crk%E_x^YL~}HU zm?OQmyVAQf_UQ(4X{!x=MMHFUZ+8_Q;8}{rOz_-nWy}*lC#(mLh({CFmLrlQ>eGDs ztMSb6`-Sh3@1e{ypzk@*vjun?@FaCwLLOnm>3+37O3 zkWIV&uY7%Dy>_nRisD{N@iBLEfjs*3O?9*RG2gDT-Yc-zQRFu{njS`G#MRGm?^Lvq zu6m6A_SBT0bqrZhIg(`^W90{2?eQoVujp-Xxo2MS#C^2wsO>!W&eOL1)XD>`d{f$Y zHFro=gZI;3sNN~Xx>ULAwU?)LQ;$VE4(-_L8@iKc*wz)^KyA$5NPi4n%IomoRO{F? zutK$Qp^^4F^**i9`(Qts_u*YsSMTD` zj2p3~#|%pp>)Yro+u~d<`k1>|mi#?_<23cvhn)D3-ZS_(9S>Z@#^w3Y83F>pz2Jc;?J)WWY zO^%bJnH;g-Ro-=+{*{nN`D)$F4``@4axdd3deHw_F|A2yGtODMI5EHp?wpBP?_Gkd zJ3o4!#_ea%B6HcBSAYJ6-#vOh&oled^xx24|KaTf@1?rJZGI=#?}n%4XOG_Jx4nz} z#A;9Z3tC)!&hSDC{uclA&{m(z_|*blc$Pk`M$TBy^TzIr@qRtn4?5TMBJUdmelqqT zdAu4Y1J_w5tpVb|b!R298;xGzI=_V7l}P}XZJ7jq3UKAU*#kTYybpK^cpq?`Q~F!r zDd499C(mZ%RNy+B#Qr&P@6VGTPy0FR8m9r*d8DrcZw0RVFVnzJ2d*28hh?I<;%G&G(f$<55VEFC(Y=o{ zje+RjN12g5JWsSgl`@Tm=zl6@UFd1`Wg&DrEk{3@3kzAZNX}{god(Ss;aTG`z6IlM zVDl~9SDSvT&ddD&WGZ>=S#kEv2x|PL7(pRt$f+Y6Dz-CZkG2;GT$H7`D5%}ouRZibI^`|XFYzkBr$m3uq?{R zhm2emuHqVF*jEMX3;tt!^ep*tcs{X)JPZ9fk|JKv#5S#0yPWy3I5WWW_+Hz<=IFJG z_rX`yy7%{bF7=8d{v>=FlC^56+KabJMpS{vW7K-qpef_yYA~)+ZYB zgUDV_@%;ere-g3=I|LlQ@o~r&M_xAcEttN0MiWQ1k3+?bVj1H#a*O4->(%D2SL znDZ~piGs^|0^9$Z`Y-9X))sO4t?#Ih$wD<|+MrMIVzvJMC$V8|?0!egyfi;Lz7Zg8F*@mKtpp$PMnACg`DPAfV)-9nf3VhvcLmSkvpJ6M`>p&}ER5F6e?i;NvL0DW+h6DR zpEU8w2l+n^pA3jkirA#!i@#py-E!nyJ&xV_R-Sdxd8mF2d-uiML#*fSspEfmS7HHi znB>*@q4->VB(}Q6zR0$0@}q=pJVyIkyNWOM+z;`;%VHhF^He8Utkxd~Hc0;l>0k5n zcLQ(k>qY$68M$9xef$`H&74O4mYvSoA&@JreFn5t5*59O&>0M7TuE_iZ zHg>?T_xioU%VC#NF5igkP|2vBx4y;f4KX(x{|deG^f?b*KE40=vE_N`uOa_!PX~3G zAMp2({}b?%p-w@T5R0QWId6}?GV@8QS0t=gBmEw!)njY-=5#?!}-emZ7ZgQLhJ z_9d;{cI?1=h{@gI|8OsIErgMqO|oWIQswv~=12}Tl>twso$aYuZBsm1RfeoFa{E5TKty-oZo z#_yx?dK6kcYT-94?(lzkfPOO8_`QfpQd`$F;FXN}<5CvCem}k^_FZk_(hB(Gievtd z89V7qgH{Z~}B6Ij;a-FZjL(BNLf8StTlS5`m#1%LH7xEBwduxbhS%E8|{i)oDy z`8n~pEuOjGf6J59Eu!lvKT9$NpH*N-KY;yx4Sovi71iyh?8A(|d|~VfG)mA-yr_D8 zrXIFNX~e@9*ZW7{eK?c__z4@51>y^Aq59vg5xwvC|A=>Le$Q0cpG6uo>|ODK>{6|% z^*hOL`62W>&F}w~!ulWJ` zBpc<=DA(Aw(9iE22xM|JrW5nuV&-;k-yF+&zTfCQm%18T*;CCv*)tfUiBd2xmGh-W zn-_$>PWGCfG0QwZ*tcCwzh}--uIXS`p$j4h{U&^N=+#M2o2Gi+Duf`5R%^4Cs) z{}JdbT&!YzD&Rgj&rd_^^Oc#$P`Tc=?;4)8)EyRC~tMtSD;$7yo^aJ+) z--w@n&NFVO{VQodmY08Vm;Zv=qD*~|?7N$KZzLC_r}Vs?qA|~)enRp{b$_Y8({3tH zzDC;CenrF^lKHPA8x9x0;2+L~Jkdm-gVby0kH3|^nn5S}-}^XqXO2t%jB(NXJV1T% zi~4G0BmAMWC-;j^wA&7Cn)Sg|hEBvpARCa;PwRbFBL7y>uS64_MroH^??yjdVrWD> zi;gUZ@GQ+o z-QgFncUnNdLuI$)71A$2SIQ#2vTks zPZ8Y6M1oXrHHZjq2|}Z8lF1Vpy@(_pA_wuUVH7e_g;G+c#o?uKzFCOypMwSvk;2(t^*lJ4mqw1 zNK@ZEF$r(*uD(-xOurl9eBAOH>4)qxGSRoyyr(E%&%f3;`XBiVhGx>_FZ|zfwTU_9 zpFP{vDW6aM>g?z69k>Ui$JCqYSLj>hKdFy5x^aJNFCYiVjRE)iLIl zPZP%Pi6m~IAJhL6rkFJKvFcaCmcHfqc2v=|`OxXiM<|YGu95q~^6(eBDyJN`sZ(Q> z(a6K?2bkQrAq*BGv_rTK?cN#|7xR^vtd zX~tO2cr?QI2>w^dN}4fat#nknY@K4th><4-OzU&#_&RA11 zUXp?6Rh>yj;@hKLG$(k+row8>7GRp>AM%8|VP0XX?86Y$es&=|w$0&6vV zGynOeU)>#jaOSIq8$bAuZk{B0o^bQ%>|x-dIv-7Xt2u~gT(~~KJ?z5ip9Y-sV(g7I z85@wn-o)lH9v)VzB0XVEHhtA1Wb~5qV@Kwb*RdZhCC$gwQAULE(ssmc)$y+}<`39& zq55EaOTV?uE!RfwH@fA@&M`;cu!?WzQC}LzdOq63#KQ8aCwFybGSHK3EA~yx2F_Xc z7O;w;ng|Y^KccxV^|cd@)p{ZS_9UNdw%=~4KlALC>b=pTo>bq+mA$x%X>E{yaiT>W z1oi&amwQ`kzqRQ3GA`+t#vt-764Y;yzDxR`_B0?yy+S*l*fqkp3O$s}rpBk{r|i<2 zk96Eno(g@MkJ21%i20Z7;MTm?zxvn1y#6(Tjg=10mcAwV?>B9Rad0%$L3;rg;~&M; zn19w7A0D|iN{{Jpqm;p#SeZ4`N(ot=>yzu*yh}c{=w{bRU8aBi+g4!u0P`8&-vCDh znLL28v;Mia^>Jb!OY)IyB$HLpCx7CbWJ0SkGFbwQbkC6q|DlE_MsLU-_w!H z_3PD-ss8+OL2kw$^yD&j8|3n?>KVB(j;_}{GID7+O8;v{W@C|!WFnmt&r9L?U3h+} zD`a>MZ-wX8l)d^t@Jw8R;rVgk49~Ht`N_Se!1MK+dA8#Vt2DnRJ2G{bDfuw+_%3{F zp8LD%gYDxx?DCyZe)vAe$G7_VNiN@QF5eNC@15wwRo}aFSDkAN*_ZL#*2Wpq?MO=P zeT12Jt0ciFMdlZ^h3GB(M?S z*SIYZdvjeNHG=V=-TRIM>_A|#?9lMi5bi^eXQ*9$yj`H~klE=a{&iJ&2KfZTXPAFx z$?j;5RPj_{;7+{HiOJBqR}biQ#ze&2J?^B_6Gj8HrTG=k2$*#?~pza3j#h1IZP&hO=d>^7-Vtnqxj;~ z<+^*I3)}G&buIoM*E=z6N%wpRf4s{jl&AU70oZQMmFRhYH%4n9-&BX}r>mr(MYt9( zb$Dj%2G0&(6RE!l^zILg^ntUt))60D4rQea#}~z$@{WIuyzQwXF@e#KSXVN9*k*kI z`JbkK-r(8i8}O)IVDrrRZR_+88O{{%nVs2gR`_0@|c+=+`-n8${2=$mI|4_B)*|f)B$So8c+M-7BjK9eR!!!NsW`2zxzo0eKuhr*rY?{F>J#tFTecqL~QG4o{c45OyhRN zjLCn~*h#i?m24vIM&rjuaH<|O?-Haud`kQ^Y%2d@?DsTv031GiJwAFpeqDq4XJw8y zkXcxsgN>Ynt)y-$vc-X1EAuxa3)`VHJ(Dx?%ah3PXY<#qo~9?JV-GpQ5qo&tQ_{0k zX*%_V9ehAGM){a8U18|5?A}4js!mVMPru_D;`wf2&D*i#{&oVJ4PH#x-~JUc{#G4w zxD#8su4W(OV<=`$<7df0KB6asmERzPKsOl_I=(Ig`da=~i9N~Mr5rNI<(&RPGGJU4 z4P@CT059}GYa*LvaPt-!^txqz#K%888~&9CzwE!}|6!N^J}&>`cXs(_EU}7yR(_TG zAJzE)x6U=LpnW$yCfkxo6|uR-Hf7xR{diY7$OqUeGSFumD-|w z<+;OU&r-#M8E22BosXrRFV@&QohlxMTqLh*^i2MK6?mwNqRtS~-1i~m6>fuzvNUh- z;gOp<=@(2Kt?Y|p*G3+_sq-xPTS?j^_^U~uMHwHfF1z`8(6QOi(;UNE+PMBNr*%*H znx5}N{~HZ;ICgYvzVOdf|JZH$mGXs|2d=2Eq`#@;k_+*}rWzkS(jgyZbcy)EhEn|B zedSTmC||j0XjkWJid^& zdw&4Em#-k-T4Tu7UcLM4oVIp|uP^C=3_q65f=Bgps%yzz{qbz-K=qe$>)M$=;p`gK zH99bax}Hc~PoysPQ(b3M#bc3^>KWZII7~e!spo84`H!bKbt*h6NA-LOWk??sFCB&! zol*Kuvs=$8d^B*Y{=Wx)*^vzYa##K9ISSl&s(WOnGXEmLCE`S*A?ixF z*pKIogG6f_f08!B1`5Ncsr%GTW%={-Qwz(j$<}=9F!m88H5P6ut^S5OPg8Cf9)5p9 zmsx|6pDAD9o9aFS>|$V-|A)F?#P?-wm+i6RT%E5N0pXbI@?p6?^5?w&bfRF4&5vij2!2s7g|&z~U<} zHS_Z1r=R3Mdz^ECpJK{QQEtw}_F)TkjwEHP-1L@m>rA=CKoi$NxofJD*OBqy^i6ZIV<^kBGv}c11JTPJ&?7%=|E<8u)GU~8rvK_7tqthymt?g5Qq;>O-u;e0o9O-X&{e|~&>)lHW!Xs(EP!G=JrrMwS) zn(9t{TOes-k{ZIqq{(lW?#qrDdq#hglij0iqxb3QMcQp8U_G}^dQHDXANR((-@E0Q zI;U*GQ)Vx0hl3Yb;l|f)n1p=P?}Yc?GN-Tll^#reug#px7qC7tIJB;-G8Ve{p+9P6 z-r(EF68%9mkb{oQ7CLV7(~)?~@Pn*F#CulMp7>XMWywE7osHN4(a3oX^=97H@aH@y zq^H<*=_l32|8%rg(%Y=XN?)WW3Fd}u*?H`F!iA}gu~(S0<0MnfzcKz@(bJmqzA1-u zcO#@#0XqO)YL6`}U%`KBjGTytQ`^=YsNMy$FEF!#$+$3zm#ZONGWXN4Tf#1lK?gOy zUf{w)M|})<{o6~rdL48g2)?tCqo>byEUg!e5`%8lrTS^Jf0YGkMTq>PF+OT)mZ;Mz^4U;pFNA#NBZbFWFkJ^{npm zCDd1gw|**F%YJIVKmvM+fn?9w!t&2t`=&WD=0Ymlp_}bv4zy;%NA^Y5B)Cf-m!+69 zMISYftpDJ)tIj)Ehl+_m*2d#o=C@^EH76;1uQ>P+<^I9&W!6j|m`L6*2 zp`9NtS`sO2vK^2Picj$;K9Lu^>uRl+za?J%^Skngwf9QxBFr50A;?Z+B8?q1j(h7% zhp*Z2^D=y`eA@A~V#C0dkz9z?$V%?ROTjel8D43jQE%QHp-0CVI_**(noAmE(MILIQ>gnaVshVTZ4}~$68oEd71N_y-j7- zH=^=a)y^)VOv&g;%Jb(5fJ0^Vg-_vc;O_t449-JcoNBw8XL$*n=hFtm@Tc~Ne}ve(qEL`Wi&%mz&KI_7#fH%*;R{?LHf&X}%`waXGz~AP=Hv?~; zf&XH>`waXB;7vO4%Yc8}g&zpKc?SMN;LS7eYk@bfu9Y0e-}Oi zymJPtoEV1+RRAus6WN0 zFtNAl8?X(9qYnxg+amuGd>DDc$?5d(Tgo_y zH1A!s$I`4{Q=aCLH8(E%sx`k_;lMVD7ty@RwHwfkFYK(bisnPtS>_yG@vzeqj=id7 z?M!~0@;&e7Q~VrrA{F_$A=h^kU-AjCLz{78*G+7@@kgOc@foBU`35uO&Dw>Zy-hhe zXqHUi{Um7YNm@eUTA#`xU0Isyba7lz{u{- zUV%NthZ{C%QzeGp>MRQN$I@5LSE{{@W=>b*bbK~+L32iP$}O~2^{I--=-0BTayztN z6m$Fx(LR=U`3_G*zx3L`qRY2*gB#DgV*7s&oYt2V$0GY8y5i6!zpxK`C3N?EcR->s zzJ32mt)sZH6!jepbS`N>8cWHZOt}-gQBnJs{`^_G24B)){YU2f zkfZw$AJzCzFn==o*rIvkrG&4*yJNFVEFV5qpUeXGY_T>9UncfBeIxQX)yxA(*NK64 z{os+*lb&bPt33Hqfvoaqo{0Fv82(~x3a;Cz67$vAU!`mQJdZy)vx<28=;McJ+&WYL z)2mqNd`UX(%!j0k1DJ$Zh=gG&U(?crV4;Z({$P!*>m3FL3#e@+`jhcKOCH zHGB&u=jR*QYVJjHi(xC;^bOu+j}6Z$@jSxVWYO>NJQH3{b9tV{v+9{TO--*CuKsai zy#g`?;6|44?Yr?mqY9p*6Ak|}%4PAN%9mK7pfqjopKjN_#TgOsNuRb;-J zJ%id~%$PrOBxgg@hBIyDV>URtbBr4Urtf#0?94N;p0>0J1Xu$66>cXzX_G-P!&)3!PwHQ0`Tk(~& zOB&-Z>IS12-kHE?4*4$NUIwPM8_chO83W9%Mn0@Zf@=x%tO0g(H`qzQY91)(mdSrv zD}%bhTm_8$`WY^a?CQMFLY<4SU#DXjWXHyFzm)5zT$8!3uwjXo_FttSN8li z^6S39y+7sN-*WF?y7vfp1$V6Qf$P^UUOo5fhF7*!^Sm+iPiM<1Ud-6=G`5SnlTA?n zq;}@Ti4Hi?(R+NEM>VFUoh^NtdVe{_9+Icju1r6HUug#v%VqX^(guxR6qilXdIe|Y zbhMRU8Y)~POe_-Rnf059#TmL!hB|}v5tG2FJ|EvsaRVjh)r)5wOk0&7o3eY?btt|R zKb5r*#nbLc`CE&*!akb$AH`j%9}!Wwj!rbpWHS%P5uTs4e2H)^Y3m~PQCtvoL;8I%D9))1Ss6Xa7-$B%Nh`JI~k&|2{# z&ZIE<6em3%B%QuA#lKBtTdBiZ;`av?*)PGfa0~B1-UXw+91A9UX#4?2L}orq=^Mx5 zTe|zK)K`blaovONU4E0^H`l#*0*~-&uCECmo)G=96l=BCQueu&8&s}%gqAwS1PAHe zwK>u`;nrO^jhw(0NIU)5M9tgNXKBvb_!Zn=8Rxb${9pyq&A3V_&{D)X_ z)LfIw82Jay+ybTmFq}YosTdCp5Yeno2*%esSa}95`Qm`<ar{{IEkm*KvhTZTO^W(r9ogv5or9dZxbPZB4u_I{xF-{Icu(F>k~}1% zxOBC(yenx{;1bOm!$=nFvnZe|(EWhxEzI--rC~xcTK{%ZF22Q=CG7zWwS1hrXa}7Bp?t8QDp@q%os>#-aFn z-hK{a*MLd6KI5U#a&`=Qpk;UTVIuFEKR=+kt5bc|h;HA{;a%g!z4)$q+d-d%IzPrn zzrf|#9Qw_qBX?&E#edKUpZo}8Wz`jJt4}00&B(sZm7UV~CnNtUX)S7h z#f)gx)9#I4q(nx>)SczI7C~HF)s95xoPFe$S<}7eU@}I zH?2Cw}Un$xM`xyb2I>SDtZVvn+^;$Ysz|GHk(WA26Wj~;Vkl1_8eSCYQ7n|2U& zA3!G)=-jgF<&*Rqu?ehWHUwjO9#+C0G=%J#tZOqiRXOdc;xO>t4PA z$Bc~=FVU8ncR`+-PtuwEXMiu7wR;WWU9<|%GT~AC$T1Eh_A-!ou}){zJO$21aNZ)E z`i^~JwuAXXyYLL(6d!Zr=5I5M?GeBK%eN1(y-z$r%)Moo7`Iebl6EoWd3t&U?=PT- zvyK9H)>&hCoixQ>|CW5Kc)pKk(SJYhR<^bLCTUtn$dSItq)p@dyz*+&pAaD7{z-&Oy69;<_XgR)Hgvs(u1U}jB3 zYhLoNwU10`sn!lzocWKj}8yVx5;ovpWOR= z)W?dw^zCvV<&(RYXIo`CUJsjW0@9jQ*C%oKXt^E%C=Go`uwM8$_w$l1#k1cINWo9XR zTXA66Hn&X=hkWZm8ryGZ>GH_CQ%#s%q`gTu$*KDT_vN$S6+ zo0uNs$0o5AmgCd<@%H=P7QDap;l2DD@E-ji@W!B5^K|hfXS3z`?^eeGY~R;yp!SE> zVFPRPZCbN8cIg4+r#Z41{&pksTf5_qWX864CSdPj0FWUxz zGXI9_+v<0;uYNy3#^0rWZx3(L2`|sK*6-u+?fDlfGZoqP`n|uKjtGapen0iu!A-d> zcJPF6sNYxL{O0=oHaW6*xw&sxLLIhzhjud5Cr2;Ow#xAwpBz2OhezPsZx?dW zZMO?|`RY=(ML7KWywRu6m-_6&(chrY8~^^z`n;|DUFqYmRrT6$+x6^xAAkQXj!`~3 z=7^3TZ95&u`{?j+e4Ac%M7Oln`-0z1uYx|k^73q}-23|YHNF78%(mj#&d0AGhvtV` zGzVnjm)pv5&WmQQQ0rDY^Mv`EEpwLm=)H8-bbqb^TwmgY?{}{Bi+$ew?{&ij;{IB> z7I7`%T$4l_Ygxj@8S6avXI`=~)>b?TIcgq;(NaTgfPWA$ub_FFwsvR!M)SAYL#VWw zZrV}6dgpw8&i63itNA|tQ3uyz(zbVLd5z~rVhA*cCmff%I5Zb*5ksSO2j*=X!a2Lp z+{k`6=2rSL52_ej)<+8ZpWPwUn`oR1F71al{|11Ufvo50JgO#mc_iq-v;m|26vEpS zCw>9AE1_3q>tDtR@afzf;rq~~jk!bO4D7ZBldVWaS z8>B5FZ2)QgMI&hgxZle>jrM*B#}O`nTKn_Pt@|DPW!USiIZE*tX1}5M)7jXHhgZH9 z@Fv{6c;v*wNH)Vu;BIInUM0?T*;wjVb7sg&YbmEdzwk*;ItypO!~7$F@8WYBdxfjv z%c9)c+^nJ})BD}>K48AF&Mi-|CZb_2Y2S0x{y@1N4by!zjOa##Vi){0)c9x^0}bc= zl=Xl19ed@AmYLAt;l9X+`|xhK8PR?X_s7uY@pmG)C%|6<+@SRLbh04mCcU!1z}2_3&L?Pt$l$ zKu7nvd161zzKoWYZDvokXj=u3U$mjlBI8{d?*3%|NyQ|B8~9eb+%2in(cQRX=0G;bFB0eRQlMs*xLi?PRJ zllXPgLP_@jwX!#q?_P|%_I7x&GpeH=yoafycYo}}*ojuz|4`O041Sk=2JEjl^SL^Y zHtnuwDDJ39{eWF+p0l8Q+#Mb9M1?pYk)EK-YK8x zVBcer{z0+y>_vQ~{0`?&i|_M*k0K9bX4;~@f5tb-Ekc^~QtJR#dt3P?R}X(gEYjYz zyBP6P-r1#+)i02hMccR$SxNs@rtk%RV3+<(yIGAKO&nCymNl(}>@P5b-(?NXZ9BEZ zzx|7~q9kzWJL_~>Z__%RLyuM6_WrnkIx<8#*Qgx#JUgw!hqQ-4bdSTQHFlWz71E#8 zzc&mlv=K*D8AV&^PQTUzv{rc*JP7trz%_M)Q#@54;7)U4)Hj^>QK<6+bVE8!V58CL z-MN3CE11}!Xx4|b$O7EX+S)L!11=44t_mQPK(eKH2>%%frGSYKUl%8qf%WfO0%>en zihrrGpR77QGp{;SeOj^SObnQnc&4m>mW0zg6a(>W(b*q0OlMH638j%;27KVx`9r&- z3#yAAD#LnfUEPyTKc(1P^qjTp=|$pVqk+Uo&MO$s+TZZrtl2go&x+aGow1*e=j>;R z1z5o>btMTcA#el|)A5DaGn6~FUi)C_Q=_JA>#efN+KzAZ2fY<1EL-uC@TKjNY+aBt z!|*5GWb=aQ$wlSS`?I`9L@Th^zRE_$Bc=JrRE9L$8W6uusDPCCc$hMc(cYBa0Yv7#NXuTU8tPu`+ zC{#HN9T)@u()&iE*KOqsNLw|C{s}xD4WB#;UCDe&=L2p;HzF@P@%gf2&|267y4ibb z;zD$m^!D(xGw-s+N%XFcXT{zmRilh&8Cm@jP- zY0Z>5fGfon=NiZ*dm6|>19SwDr|PR3S^_7eS$}8maRT|poW6NH_{ROx(G_AmR?7xi z$>zM^wnNYOA7gQ7R_AU^*MG$}=L;l0Esyr))L+k?#gZIJavj=`_-oWw!hCz{Vx?*R5d{{`urlO2S9>|+od;;|-9UiA4#=rV1Pea?&t zlAJ^B`Y@w?w%ChFJqBAGc5U%f7h`8xTcF)W)dxhu*Au)tU%Kr|#|AU9YS8%y>T^9= zoeljjOBa!q%9G67!6n|r*T~1ZI%zwFBzanRRtza;O??f=Sa2vNwd*hk$E(1|XGU($ z7)iWBi*QR8HCH+GVCSQKVosc{#s9V?n?P)4{_IS|83#Fj(ICFz5FJ) ztK!JarH}tem{VoCJ0K3Wij5{s?!~yV`IdEm^>KQhGmaooI`}!&zrKjN9A3I_3VE}#J)=q&AwT45)?k+5+YfqBK0&H@fzt71!{EG+ z^gETFShe0tw&t6_aTebL;2pp-XDu}ZUD!#$&J!$f%G(p%<4N01Y1vdU4Qx*rb`}~j2!^9(Jg8F^aSYx0z9#ym$%ran5%nGkEj z{NqwQ2eLDRhA#3Rtnc{Q#J%a<5K||riN*1)CQPNG}%s4Sco)7as zhufv|fswrlqNnJ(@r@!G&hR0R;$c2U-_Q5q90&Yb^!+HlD}G1kxB0(k_`Zzqhw)wU zJ5z~k^?yH)@3-+?W$X`(+SKo{v!1;0-y3Fj!#RaKW64uXo?XeK^CQM~gSi-(W?+8E zclkQAx|KVb@9G2V`K~zc$Se5ow39mS6S-%(;ykx<|8dZ1L;s=;g?Qeb>wmb6PYn(8 z_oq*j%}hCME107$v7KIg@n0`Q-n8NI=*1?UtEuBrzcv5SEJ@Esqjy!LeSs~nq5kkw zqO#lQS*aP^CjNsuQGE>LeZ!&POF3=t9q`?Kgk6d=R+ViEHegqm(4PY*ztz8w_m}9s z%4u}%WF+qN`AS@b~549fy6CeK`p|w%X;V;)7%VV`=Q8 z?etH_r5TSP1N>X<0jxyQ$Iup8AGSFQiGNBWvo%#UoZ*(WAFjIAzN-qlM4#GoO=3n~ z=jz;}dVm(ih02a9_Lg|QsNghrrM}eISNM=msXE~7%F1Bws*78Bj%I*OEr2%u-Ij$W z@Ob3}FX}S+g|`ZNlrGs!6<&A@f%kpM(Up&4fF|*+Cp6JE8mdJHbSuwgq^myg!Aza0 zPLjZ9NLPKZ=c_^gC96u!%TMB&{-J_jPzphxR>*BzF~)VoWB3Q7HG}dg_jTDzW_1jlIW-OzZvQDB-bCXC};7Q1?44-6CYo) zpltr*)zMZy5ZQ|UeY0JiCw3z5M2dgP$v1VR#x4I7fX_Za8fhCNa(#V7C% z0{@xnCy+-Vfo%BR9$ruu-;qe$`xf}B6ZrYaOmbIyeB-B#73k-Br0oE<6go~V(DtL$ znW24B=9Th5`na#?3j#k#7eA*>vQI02`$Q);^?GQDf|D{igNT3Cf%kv@)zvu`S*pLP z=A6Vkoc3YnCu#(16VG`W-zoPNzR7o${;MxhJ;?v!9LD01D;${Xfzki0^es+$AT}$1 zv3xV~U!(lANBP1bE1Q?hh$*b->_U|#dSqi%r-R|k{Og9f_pvr#6EWa!?zWuh*9{FObiM{zK2}^vBPN z*CFIT6+Ja}2fSVzP=D4FyknuiC*}Kb|Cl^KR}8l+2c3r``AAmxqmx(jenEvgr@ape zIQ`kF+%>M!80&1FHNH}eN`Nwg*)3z1*V;C9?s2sT9D=_PbL^^YYBOoF-5JRytvOK6*&469WIl}NC~Gd3#XKzE ztNEu9|BEeYo>VcSN@ITsXR3qGO;fwkH}yHXe`I*p^YGI3*tH{nEm_!wC6WnzieK62 z5NQu7P5NlH^wwUe2gzGTR)Jc(lzp(r#(TzM=pDHg!p8BsH z`c&A5xlGaU9Gyo=N%>Lt`(GY#@`500 z+73Maod3E?29os^lb!m)8Cn`dh7SW5hX&P!V8olH`p7bdq&_w=c0*R?EXjYR-Y!Qu zzc#?T=0_N-ey!~Pb<4g5oB_Vi=N^Rr3HUskV|?^F@Fwj-zpd!e54-7+_V%oE6rrl@{2gzS;BUYMmpJ=!2(mn&}yNwPz=goTc^m#q&8i}^@$<$2@8`@WG zC1saXhg$Dg&G+N@22;i-TD>cK*;AYyOCFVRJ!QzYs*J^~gVs@w@I=AmmB&~n`c48p z1y(p)!SOm{e)SWB;H{SXq1?xkUw(Eobb5Opj-h^J_lC-j5!3w?V-NA=^+PJViF}_P zES+@xc#pn7U%RAo>nQK{l&3jg>2@F92hbip`eh46{|8O{hXg#e)VchVmx15NTBq=N zupX}+z`hNv<|I}E)14-p?*o$9Kl1(`aIDi+RA*{Kt#u2_BUNW^8)6=Ga~t{zb8xB~ z(JlH%fqN#jd-Z)Bd5?4JdjL3PZ`D>?XuHx`_J|n0(!X#|<~!}Apmm|a=<1#{Xk!cb z-;LH=k0ssTK6Z9>R60q%K!1Ht+J&ang7QZBlhpUGk^MQYyq4ip&WAUzp5>SNX}^s; zr$M{)Vfy)9omYX+)4MF|sE<74e7l-&XSrp)ME$Bfjc>iObykC(2jsBXw$s-Ce1E93 zXPU7){8?GjVon?WkaXDx;gEfnjT=Z=5o>z>FYdQ%Nmm=4$K9j-w>)cKwMSoGJ}5Gp z1&y^f5PN!Sve}v~+M@8~xBg{IC!-DZYLn*FTgGx(>&- zB$2QB^Kk42&Lg7@7}&}Avf3Un`29-(WRm)@R1pP=%I8x% zkzaTqx*4>XS3$N_amQD2d_!lvCE8{&CPJr89~(;2&x1?pp5M18{-JlCt!%Yyw*141 zuG~F1@ndy3WANH`yP!B7+3%tB5q&KDx)`=Sjy|HpLuub?N0XqdHSNraWO<&LV+?*Y z``zzm{u&s6{7wS71~S#0-^Tb78&U&}L*Q4k569sde)}SK|GVM{zVAy*#Ap+w?LZp5 zFb0Q?EO8;&lm6HO#rqsBd0-131$SdRa*H|VhF*WKW8X%TF2AOV{IlIO_C+>`p7Hb% zGu$-Ao+xcJX;a*^6Wz3H?n8GdgMRLo8va*mC9chffK31^ANVpCp7Uajoeac>m$fe0 zp>`8Ls#p_061#LtiSf~z8fY1DsN+AOHqo^H%Yz--ADTqJCo9cC%D+_`+aEpDv*e@q zeR$VhX_C*Ly#Ee86^}MH{1lg-LtQ>khyEJqzYY2^R-5UcAbSt}$GGrwy3wEOM*nP= z{w53AyFAE$8w3wc&>=n+!Bb-Qu1?XaSf@>2P(SGUh0r426g#4RMf9)3#{ToS4lk>D zR-Vt?_ZN5e{*KS%-{*O+%byoZqWW7zz8zeCn6qn;Oy-cbotuVlW9qq; zw20F1EhGaEHbZ*Qg=LP{z@|z2*FBCtd2lJxK6lete>HGTr2WH9gIQDd0Mb5k)9`Jg zqNguu@4IQ#vq{rBz&bZ=f8_q4>`uE~xLfv~e=Ehg##4vrP=joP?8I7Zxy8B>^DUe0 zr$^rszO8ieF^6dAYbWg`H_d~~k@mcscD)NXiL|HPwC_=#)_fF~7NK0(BgL!92N;MR zMBMt7EmJ?%hdR^zjTO(Dad%(Rv?i{4S6|l%ob*6vBB{QAz`JaK?19b$|33X}fcn-s z{+_;E0$s*Vpzk`Ta(iH;`%2SVnDF!@P47A0J-ZQBpAD{yz;*3z%&oNZA9S9jdtf779 z&;i;FcmmL6;w?q5=G?tAftuWTRmC3li`%6X^(bF))na065{})GPv?!b(31x7!@nvcI`@t0+63ay%h` zRUq~*s`PcFzet+aLUw_dII@uZKFP3upD{aWu-HWw&KruXZ%ypm`w9~j=azT zV1{X}UEio@;XaI5V2vI1TmhfjkMi9uJC1LzHYWN1!>oy)s(LBx0S$X;{(|&oXggax z#ZyJnR*XWHzw9Pkt;shdTk@7p=X)RWsJ{OEa98IU3FaU1hvV2F&2@%ouN&MtZ1l~w z%Lh;$9_htXabBJ$hwNbb=Txf5dB@Qgq0@=Skj<4`=9VWj|%t&0N(_ z(&ngI{M7iC`UrkzWKm!aywVF@v(Yoz8rd1yo3YY6&fSo0tL6Lv`J$3Z2K_VfN?CZz z$hO~D9*@4r*PD}DP@Zq2^YGlC^Apv#D{e3c-T0KIA5h(D9YC}x*6hIxgPl27*5iTm z+6z8?LuMuO62xDPNeP#8W>_tF$6!}e)Gx8a#al1lM1H5AQJ;(tS`33fX0sNQqmNEQ zTSouPTUfr3en(?pt=ULklGTmi(fNjoIa_vsbJhxLh?SSuaaI;G$Vx6RH8}F%%=FFj zNOATGc_w)B@XH~K9FT?PlE%1l(0sIf`54;rI*JdAUBkc`B`SZEaw;w1(TwOP$| zzz4ki7#=+P;+L1~%LK^_o%|;LTH()v?~mYb4*cEMjX&85+0mu~eUjm8%U<>XbjN8! zo^6rrWjh=5(3Qu&bYNe&`f{Z;AMM&tV&$T;E$d=Vdy{RsQr~GS$YjmWSbvkRN4$5m z3jWm&cGWr(`K3Gh*YF@@D_yGL-Pq8$V|%<9_A1h~#=4!k&n@56DxA|e?IU%HFn6e@93rN!CnxZ+2knKw{78TFEcsDu*&(aT_ z{U%u#enFe>P#?kBoybY>n{^$TcRzRFQO^14>(cDklYpxy3Fz$&z3tGMtsq-ljTIeMHbp(XO%QT;?q_7L|;vp{Xin7lx~D-Lz1WGfJ-b`dIT( z@=o&A13GWwzTVm2iTg5khju1=qZkm$P4bYh7ff;AN;^9W8nqs`H}pw9(iLNas4tD7 zZumG zTHU(3jJon{p4xMo{#xx>?b_d_hv+OO%4Kb!vK%>F+f6QmprZ%h=OUZ8UArZF<>|0z zw`zfD14eV*x0gblOQ=u3-ICr&7Y86q`3@WMtf!J^9r(XXdmitOm!Z|@tJ?G8*p~ME z>|M?{M}47mL4JW^WzT-f>8I4!>Aeh(6Wx5*JkZto7vAMltBpReS@z5 znK`)bx=sxK*K|EiUh(hEm;4P{uJh66>3Tn(u7BGeuVazD=SM4^Uq1i0<(c)#zvqz- zDBpKIv*a%P18?u3${bDE+lph3Y!LOPF@T5T+i0)x@vFTF8rOVVo)dlidU>{$)^mOQ zs?6En+jf3O`S{(816_pM&g`Wt#c?N!O;LS7eeSz1r z#vbYm>KIpO>=8)Yh1<|+&lYQ~9D8qk@^S1@TOfUBJfL}+Gnn_>&Gl1x zpUZqwmHY$uzt_!s*IO&O;``KFqqytJa>?hD9rylk%(y{)V`(P+g6u@t*B3KqXZm8b z75P9a?@W~qyp`3uhO?JRe&?h2ID0Uv;`9Ub3B=tQf8$_-U;lu!3-|WtCo`XE^YueSPXUE_A31imxiAXDZ!6|i{)K1`!bf`m8sN>c?cN$wPP&WtY^pepXTc1W+|e&9t$&1A4f|2g z+G~M-UpUaz;i>ey{Oc85N^4SDlJNoKsiDQL&U$E)pUy^1oeyp5LG`Km-(IFp;RSvb z>j>?P8?1`ttNPmoT=Ivo>jl9d;Ofz2U;`=rn~Qd1Xc%GiNbj1*D^NFYxOI?qeGiqv zTAYbp{ED&ZYG8&Vhs)HS@E3n%an2X->(Koh5~?%OnG*|%F3#$DUp}+iVPXbyJi|@D zwR{Ej?xbI9`sPb{mwwxn@ki+hcukvO{a1XqNZ#nfB4|0r;B#W!M2Bb?L-`j|emKh> zKzL9ci~<*H$tK^CtbhKEcCv$8PlN8@UlHIs3EKU<4CcKLxPA(*NYXB7--_zT0@uyZ zl}IV(%4xF?FA|-p(lcs*N%}G1j&k|9OguoZ>QM3^4{daw(Iw=d_<^XEzLob=Rd>Lc zy|&!7$17!IzWz=Jzw{rUp@DwA@+Wug!-~x-KlF_A-Q-VRTmI9*#Oy&cHo(k3w9q!j zLq`Dlc(QyB7>zYWYk$70Jo}ut32DgALHM_3m6|tSFdNDfOV7?0x$+u(Wmc1ECJ|pq+7jJM+nuDZ3}X)XdSP z8MoSPX0EeVFz#F(Ya7u+Zg6n)L>4`y57dFi0y-Nx8fP5{T-D}W4l^b-Yd%R}g4jLj z=c{~6p||RPR*B#E0qk+G6%%Z1$6ED2w58F=<9zaYZTAY^H3xOqzLcM|bryR?eTi_^ zQJ2COiQQPf+AW(gfr-s;#HZH0l$TB&_SRTHdgI4`8SgKkN7Bn{C`0z;D(E_&bd7mb zFVee3z)azLILCQ{z@%-~h&%pWhGyOb*-4HXTaG`?>ECLQnPgtmL0ne8jWOX<8@^{P z=DMA0_6FI(3Dp1Z?qkdh?mH>t@~zOJv1uAQgzIi#GWk&FO7wl;r#oAFP~ppXwz+g3 zIJ#*5Q{esYKrzkoKf)bz%OUvHI81b*gFN3>UaS8c(9Xk&x%I>gxc>=gG4K3C!TdkU z%p0TQR!5e8iGQoc>95Q=`Ro@;NXONGP2-z68`=C{OL=09qk<|kPrIcZYF<5{a*=T) z#$2}YrrO@u8Rfm`4`S#;jC`6`(LXGLeE%vA?`p%sOnO6L##@N_Ajcd)nsibGLN6if`fOoB@tmh13#eaopL+D#?e1m8! zGMAo>_USEaDMoM8&?)}zgpObN^!5VYHBa)%K3$!fHxlkQg*%SDi8*cfvPGLZV<%r! zSahUaCf4u5#;Ib*y>DP}(kJX&;iQWT1Kv*jwfpYmu+o zSt7fje7MG=JcseE2D)QY{02vs^dX8dku9{+Q_HNeMyuo47kE99^#~(x@JZg0SX=QpE}GkEMC8`EEVb`syL>)`Rp#bDp2-Kdml}Yg`&5E{$qq zqVKu5gIDu1;oMDS`bYEMS=pQ`sl&mPuQoq`@}?ns%`?ak8n>&{pV8;8kS)@D=exk- z|5UD{ZdSW(PjfwvYCvItrwv_cxZuxOJnLm@4?q!dGhy{lIR} z=NaDj;M-S>F*N_tn8n^$%xT7)_*%(VYxJIeALZ(|<_!G$9Y?=E7>B&!L2HDHy?$qy z=C>W${t);%u58EnWUK#qsvgElw#4f`1FzotfaD_`A49%Du8uG5_FeNV&3td-J3d;4 zIg@fP{ASYzI{1${Y5&_Tk7Br`^ShHr_Ie<4UF*|%&Bu)8yT;>zBzlfKIp?Iv87HQ1 zSA3Lo{C@ZiSl~jQRSDV!vI-+R^;e1)l5Y{ghxF$9)aJcDDFELZes`Ue84z`NvL`WnoXiseIn| zEBHR|KYafM-*4^qU3g{FbwBSt){A}k&IW!yx$sFPXF$^3p$Ggsb7uP2fSc@UncTea%^M9zREu?`HDh^KHhJ zB+dQ?Ts?fa2G;Fs&8P14?;(rwb{-e32>;Eb*>2iSqzO)Xps|qJ(+?FFk1iwN=v?SJ z>)o!-U946!mX%+rdeq#0hPLhb6>8&Q^r&rbXZ~~@b?nC(@!^~Y&J(wSb22!*_;9rc z59dT5PT6SLW@3kn@-4HWc^iUhY=Vt`pd*vO`^H4*kD0N40NY2s=6lPx$}-2QeHYU- zo??7kh3_RE3yLXr`4w%u`DpX(phufC|L%-~MBgxIldXC8Jm>s(4_^GsZUwAgl#I>F zLPuJ2aaZW9ZmmC9}!cmck45OxcxLV zuL;DLuYbDZ&GmtfXV(Y8f$vcGLjN!VM^&OVAGAglg7Kru#PF~VJ`?{z`?+V-%l>%t zf(^i4v6VXP>&n}D&E+B4s|fAAMf>-m{f=KxCMJk~QBb_QLUR8dOq1&2)Z?baz^2GD&oxQ9h3SY|pqmz;BbpE4!9OJDmG@7#$62r@y zOJ9#Ks(yVSWq5P z!4M+-QuvSIL&z6dw@7$W#RHLXG!5O*`*}NO2WkGH|B=Oh&uJ_X%pdg9?Bc;cKu?mb zd7WQ1U>)-Yjk4h*3W1L2Svz~a9Ev@U&3>M>%IR8T`5G@tc!|;11tO>Dzr}m1|L#Zr zVEpNIN;k3)F7gMUgL+sYT?|^MvCg=FNj1{Bti&vIk(hdWX8j-GNxTFtyQIB(4~rM{ zC5X>kZQH%zub%NqgT@q-yXmR=w2P^4$>z797qjoOkim_vzEJ;5!?N$m)*x+Uhbrd(q*GRQW}bMarB#U;`5w`8gWNwwiISm3YC-BYCz=b75*%=ACmURuVTGux1vYKsN%G9r^>dgSsv} z#Ctev2hgi1^3Xogij{QyV-J`5boojzA;+t`>7DwxReKTlr+m^k+BG(rc0?QuGz=da zaOT*%rEfZ6>*@CKTTlPgO^@PxWaJm6(7z;?`U2*wnFp*yn(M6(j^bQz_a0{4uKA>B zwKtE%9y!Z?HbZ}H#ja;8F}3)G&PfCZ^HXcg+*52$`S;A3>AxAIoAIrIx9H!=M}Bix zxdG}*@5WbRJz0KIUwoJkCJ|RgdJOn)g42HoC;r`;n-ZLb9KTBPFWFVdFiwo`5ce55 z?tQZRj7{i!;ue_WkN47LpV^l%g#UagKe*lpSAQ4R+2AtIz%+o%JcFwzxXd%~?*QNI z!k-4bc?N!a;LS7e{~GE(1OF=UX&3%P;LS7eLEz0Z@P7l|JOlq6@RMBl!N8km;6FXd zeFnY^yh#WC55UiN;SU7fJOf_=-aG^UHt^;d_}>D*#D(7jc=HVWyTF@g;9mjWJOh6R z@GD*T9|CWlfqxBn^9=mcz?)~_Zvy@U7rqzp<{9|sfj7^JMA$@ zTTmbFjm34Qmh2quHgps^TDY2b^!3Nm@vQt(@(hp=fgcY+HF4u~6DGJ^;Ad z_)U!aupj(;U2`FVlW!ZLKmX9h$JlYrJ#k{(v8@rtJXLp5PBvAf9R4lNKX%EZ|FxR7 zrtuR#g>b&(=5Hjww^v{n@@OALkeEa4cyGpx4Ua?T@;Lqg|D4fW`bXdwyrG4EUg!*y z?Vwq0jq!l_r>JP04^6YFgK5ZS7rrgtlX*302?8ryHlA`C zE3Nj*JPP%xdXdj1pA5U(8^^GL&bgxTp5oI!T8Mp05o5lWuel1l{Y=ge(9FL;D z(;xnwexhd_d6Q3ee~0zT=d4SqFA)55x08lm;Io?bI>|(H8rv-p4(uprlgPjD?7zNM z0rUA^tWH1ffATKe_+aMjyei5S{*|Hy{P?8}%2xr-D?>Kh`1!8aW z|B`gAIYrff$z~5Bzv|;EaKw4u#Uh4?I@*o;6wXnigESBRNMHo3Jc89cg!;J#;E{7h z^(cN+FTphZ9XP}raZZ)01pEO%k^DTlE&5Wy{v)8e~&e<0sPdimSTKjI1 ziF{_xR4JZBy+}WApdRF}=vjMSey;b7^Zxe>*{8HdbSS=E=iysxG}qWjdD*zrULGM$ zd<2k{+L+edYvMXDgs}?t&}wfhxBQI#%GC9}z$&dN#+d;ZIQ-p7S^&CO_bHlxYkB#> zWnf8fCckujp2~98(bj~GJseizoV}>v{@~)f4nGPm3NRYmMVTgS>5y0#oEeV`HDMyn7oQ%(pira_tW_$ zcH!5QI~`nVw{_svIeTY-vxD|o#~f2#ia3M}^GW1+oO;xH^39Z`_a%ByDAr+k>14~g zrOs9xJ-zgn5j+6Yuat&$Vq%xL)X^YzD0V(nqNLx z=RqVGBU$Ja^45BXWjp<)=5<@4(X+qm&lAwO6dG0cF<;&HVIB1yyQ}m6z^lDXnveY# zdLUk;mwoKED)j}j6%W$x)#s}`#Uy$#A)af=cMsonCXVKfYq@JYuKgvFmq*K$yf4E4 zng=b~t0Nt$%ii?0I{9D5T3<^?Ceod!H3n4#+*wpzHxO9e{pT9WeEvN7JDP>*B_rp#C2j$SV8PiQK7dLe^Odx$CaNwZ|*L>`3T}FN2$Wl+9CI7qL?&|zLa$)>kzQ*WMs&pK8 z)yZz$MGw3b#!!arW}3U?(-ZnkUkLA!Bv-~R9LKlh?pyXbG@-xp2*azHY11q{`SSvE;AbdR@`hLz6P~HJ6YqFbtw97taAED{)uY(Uis~{$axlhzA0b! z6MLxr;1LtoaD6$PW!{ha5Znpier0u6=Wdr!pY6mafJb_we@t?IVL>#hpOWq)!vJeZ zQSmQ*(_Dc3!3cEhEZ-JcpL0yGbLIue2p{KClkcYT{*g`>qcx+MP8 zeqM(^>5j*n>T?}sNPi?dQ^z*8mA)+s-Qg_qvD?a7@La&zMpl*!T(ZZeY|7h>Z;@`a z#QDDN0Ie_Eg*~B1b~Fr4y8s*F`4`}le=l6ZBl?#BUj_Wmz*hmgBe165KpwKMWAR6{ z&O4phV{gytH2PQB6yXfPZ%^`MISaxs7tuNj+!65B@m=RR!AGGcF8`Bt(-^S@^kE^b z4I!H|@aLLPI&UD5Y7elM&(#<#M zU&)ya8heZfx6)qc{DrlgKh~jmq%7+e3n?$>jNyBNTQIqCPM$--Wny_q;|!rf-&|W2 z_OS}S15blT@h|~!t3Oq~9m%)3y(Q@{B!B1>%^sd`5*ct^1HFtT3Quh6T9cx$*V*~r zzORkYBpWE3sPhZ!_|}&^71G1_w^g)H{F|tJaJ981wA-DLZy)OC+VNZJh_?5&K5!`V z`#x}rE0A7};#sy?`g$|{QZ@H^+a~NA+YZ3{fb30_vV%&?IyUf1 zWD<$fM_P;v5_Z9>-)ptLM*Vh@&q6NJ$EzskOwL>I>x=q+#U^2Y3csY>8KMc;YG@Q~ z8Q#Zr%X1NVKBgbM2zcqd(RcEzj4{BUi@poSukY&bYk)nAJT)ow5!^N8!Il+9lII2b zT6i)(km$RW{5kRr;afk>FVp@Cudb$1C+LOgH&wpc>!p;bcIYoNMSiuhqbakB^3=`- zfv@E)_P6tHe5l0N`;<+J!$od?-^7`8=(NsGl%4pPd@s}2KS%{>e0w~`dI(pA_b0io z;@Xb)y}0(~x{mja8o#IUTd|89h;7qanEDB=O>4eOw%CH^NE&<0b?;kUoqKRy_X|g- z!>lbZMu^VUKBY{mcq-3*v2W6E@u?UTwaf2mObN}$$Yy}A3Z68E(tMe>ckB}FwE||$ zE(_l{3Ai-$Xsn~SgHM~$UvMg>KrjbVj_kJde7g2cl79ihIvuj|R@H*0##(TMIpqs!xC%v~>Ve4S>=mb_ZS)PAd7 zc$U9;ZOrjEli+-8SN2qpS1^OR!D!r|_>09Z4E2Xa~k&} zxqikaKQV?MHCj4B-D*yxg*vt1S^i&LY94hlqVx&!3fOj`UUX(t#V>e|F;CeSJrS&# zBO&hBnaDe0^SLr-)?0H%*IRYO#YU1E8_p?jM_&13b?tMiY79Qcb|%g7 z$(Y!>g>RJa#uBTartjPipCjCUE9<7D<+yrmz|S-e@wc@Lylgx6;E*O zQ5EG$miS;M-ldPLU!QAimeRSH_-^gA0*Cr<5R!aG=~HZLt#xZTmWmZ$BrO2E z{G->|Q?s1DS#{q+oAqK~`a!SyvC%7?F{DR#q+K+E&+tC4{GwZq<`gAU>6mHeD`Pucii_!slab&_Mwk>ygCf4?jrGii=2pOSyO6*|HO+HB0PVFY>XbO| zCis$EPJI|#M;+<;dgr+`XNl5MMcEz6)~lxnrGKeZ@i5Y{OSE674o^GRiR%!&(iwjm zxcSISeOOP@PPs)k_0+;Fw+~a=Fw*+UUrfp#4ln%!c-cwm&e_PpuRF`W1SfiMnPAAP zHh+q%H@_gQ7M(uCl#wbiCS1{%_qEJ{{*kucj?WRp?tFHeL)Y2Bs}C2Rz6s)rutPnE z!2|dw!-Kxnkzf3MI$)DIw>g6^FcX=1S&tIXsLGH3KhL zIwf1V%nX2e$Yp_#*O^SdWfY#i_#tejw%l$jp(W@0^P!UXDGVxl6ud zf6X{+3NQ`8z;~gB@0$O32-(R0>E2%Uaofud$azP7Z?{YG%XQyKAFB3a>^Ai*-TL5I z#p|*@f!sFn-P8L{`d^i``1r5uy~c6Ud!0{pm%g>9iW}k!t28z<%Qe{fd3KzsD!=|t;!(A-XYTx96Y zmtI5n?&}6~F)*`%xz*+AMPNRn?fdaar^W(v12EM|+A}cta$hT}85qSj)$)BNaAxi> z=g7#j<2o1NF#1c*^DeL#3|{i31CXtFf9)aJey7cE$N#l7HjBCcw9{N>82j9lG1;Cx z%LYi^0qc~4`WKB=RmO(-&N(5>kC?vq(p8+7&pJoXIC=;^)j?c3h>l%H`HN@|DqDVN z%aQ0p-0Xo{BRJXlzqqhdft>{G7}}%!hbwL+CKVazA1Z!1osA6SvmNKkn?9qWHg^H{ zQ&)vLo4dhp2fWs?2D$L#fLl%5`(GM_+F&mf^GTjx;cCQ}tK$71Jb%c=SixCqO%69P zPyKTX$}Px7b5H8iG=E}ckRknvX^Uy*hmnVT8vNh}!G+o17qM?dm#*I+JH5wa)Im07 z&KQg)@WGK8K5;?z=-k&F-9+A+Co+Bb*{@o(F}ra3|2f|V;Unw)@Kw(KG|3%UBX<*P zbL^8F{(+4VP1iz;+B$ogqIu+UJ~+KTPCB^~xqRABb%md`vdzS%cXWfR0q#EFKIjIw z{oY&lsHh#NZ_5H#>;^ZX8@_SCjRJ0UH@H+cIQ4T0;Qj<0zFFl^?75$Q(WQEQp6`;! zm#|BUvims)}-o*_41TmINFuV_HG@iE^Cl^pQQZ87Og27Th({I zWIlpE(t4l@8B33UK$`Y1XiZph(>=yGur`TrLt7Kf=MR$4g+G8cXJVU?{eh1V?+9!k zAMA%d*#17)JzZF@{mPFj`e1+PwB=IV{ofok)hh_M%-kMp{;fs9zG2c@6qC3#fE*Ni zFL~(RmzkpObo7CaTU?URMlAi_wE1cljHKpkrfwZANQKn&;TVr@N|uwRhkfG@h$X zO)q~&d#hs~o#*%84{nXekXtYIPhuCGZ*|zz@yE(0;`fs#xhhXxd}^7oN=10t2V~%- zqkOAJ)}gxijrBWx@1kCIka$kkQ@nNj#su_&OLGT|Z3??s!b{B6E?e5T=-nSU#lEhk zog_4efjks9i@33WVG*l#P{8!$JDnuY-WCOHM1}=U|Vgm52NC66?5`rWGzt?A1YUZYsk?No&2Q z!7p?`_x~gAUErlE>;3;Vx4mZ%BP?W7`|S3~g>03Ka8T@^k&J?gra4?xQaX-?X2r=- zsmv$`_U0}mdWq^dDdDm>>xY; z*ZIHxd%xCe)_Shr=lgtb&-b~_^>zehT-{K{&l>9geozLs#ep(3e?6h0jK_mA{;i>m zM;hR`x1kLWkv4=SPB|ZLD2Fjn?>FiHFZ7{@IP`EO^l&fn>PPXKc+7&=)Ss{Yfj(i3 ziAXl{Al>`@KB9k&E%B1#)pqc0y$k)n^)TbsgVn?6~)ecd`d*P-hz$+k!B=$h;PK4{h`{lq)>a{sZ#*##NHb zC2tvV^2claQz)PR&BRTqGVXqO)C6d=3wjjy?2jMeu&e9{f#}J@8Vof>G#Rz zTpugD%IJEPskVOghv-P!tu<)rhW0^EhBh~_7EW-7WoEEf8tYdZ)xJA|_J!%rS)o2+ z&O2ydEOO8uX>6l&m^Pln7~!hJv~l4P+L)$|I;-eNZT!}Y2iy3(bZ{WA!Zuzaz2B#e zjrE6Z{A`~#_V3fip|sJgHKiXTdEpehi*~5JQFtUqpDsDtr$dIe=*__X#C8xp#*5g^ zf$vIVv@h0#!<=*$V-(`x-FwdV*YHdxT|D38EgBHg^*pbabn@|C%bF(jZAYOSpGuE+ z^3~8Dv~FdfP5L@PpDBJ8GC%Z7h#scFchco8yvH-XpWGs?+Fv-><%EXrI$3-3rnrN!LocA3`ISfIG>bNg)n%lWQ*%Z}!d>!6*2O z=D{ibtobIjMSOqf8=`yvjFJQ}%aKKajIJ4W#N zvTl}vmAevX@2|IWMp#MQG=x^q1tm`l1Z(!u`vVCz7Kj%6@{f=@0*W2J9O% z?kcSC)K8v~400Fsi;j#OB;DMg4>f0Gn>OXNt`oiNj~k^EG(HTILV1a$MX;c0*GLTLXO{1E>~`t3UU`Ray#HaZPlT&aEr-Z0N0x|Dv9 zERZcGS+IEE-^u{#ec@6(9n&4)z#^G2v--C(;BMx%ly(y7lzw6VLuG*Cz9TsTeM;Ab zvT*?K)AHi+i;YeZk6ZL5Hgo;M>{%60%cm&X5v{A7-#;Aev%m(BE%tuKqtb74$g_&P zqDS%jv9w?3oqQGiC@f5~k~E@~_5eS!#p2Kt>vWCY+YPN8u$RD-Zil?qu|{4e(rMz zHrarZx5(5(^m8~?xE>fp!+;OIe7i{dx?62{$-#c%%#uPD8n!883+sCW9&glrR|M^l z>=iA-D~1+Z=_BFZneO93_6Fmt!OWkS@p;$=(Pfgf*gCzEF%!V+j6SqEnl}A_HZ|%u z@pEIkQqV^a^hu|KW<7`ltP+aXPz! zycy&*e)Oa@$CEw$Y(u!_l@zXd%zgBi8ld1{skb5-3J>`zZ_)EM8R>t-|o7w4Yuk7@mb9Q>Mt&6MA^Bvu` zxEgzAF?03EBxv{r;&u@JVv#uDNiJaB8taR#66@rwlKT?zuUI>gskdV%?DQf9U|77M zx|47#Pk)jpI!t-sdv~q(Drx%{*SJ>cz8dFa?uomshbyi1nhS&tpHppezwNd-%h?aO z$*gbug}u{zjXb|BQg*yp{T1KIWU(4a7Y%&v1mo>B zr&@GX&+7iOsdFvon5^~ErG;*5Wi5N%#@B95-|lws9?#Bohd;X5T^GCEZGwKSJa_37 zSGmVtF~?ogbi13)a|W%&dP;CRm1lKyw%d_k>$PrK>)lHHXyV2YzN&e)>kzK6R(>ZC zetr->y0D~Hu~zT7HF`VU#$B7AzsDU-xnl}Tya_?v^3UGmP9W@j!r}$e^uOJ0b~d?T z-Zfvi$E~n_Axyu9GIG>0g*w8razR$PMyxy#QO;kE_!_lNdknV;21jO;RPNEW)>q&3uS&J1)5k+mtU>`{$2$?;fz&z5D0G-Mg=K+;nAL)v644H(xv3-8}Yqck?kr z*kjI~TqnwUm7(sYv2)zs>fK0qL zns@ZqBHe`}*@sQku6LL8J=+;yvS(YoGu~eBZMPQHsy(s2vO~s$r?$*muYU3=Jv{{c_ zfhKay@sfUVnSJb;SKy~t@TPaO8=#<^EbqaoHZ%%H35pOvU=Qp*}L2(@;B%2bc>WR zi?k|Z!{%Guso5poH1IPM{OEif3!E16OT3=R^V~J}+;8g4!zas0KY_e$r0*cTc%YT^ z&Gu|}Sv>Ae%`d6ttyOy_5Z_I>U0PUMGv#h~Dru)t9_Nhh+3@N4F0#v2J&D}?ZV&ah znL6Q7cZ2J=;tBTRoYC#-{)0R)O{cspF!guua&?Zi;@8Z$$GwI!XB3urPFOFnX>PMQ zw-S8ZU2CIW&Svtczm~C9?nxDT+}5&W(OvGkadX|}4=;9?!LP|Jtm&$-CVLCKoxW{P z%31C9E8gpJ4~;jxxWpS4g!iYvlH=c#>twn@!Ml*c-+ZCL* zgv@sd5Bb~ZQ>VmOy@)=YRJXF6Wf)(%C$a_pDwbH6TJpxAYkz=ljbOVl_Hm<}%Q1lU zwA-!6y*TpYS!<5&uf=CdxN~Lg)70}UcfD_Scc5o?c(Gke(X%_e=$@t3*y~HHl8NFs zjWKqVc6cx3chH9A?u(Tj(DbHSQ_sR`f;8!E3;q3-q5^+z;8$q<6~bSp z?47wCUK4uvRlXD0DNQrrb@;0V{$f1}Yuavind96e-fp5U>FHk-c6j2K*U0-z@-QwcJhTH~D#$k8suNU<+!#cIdJ$ci9KJT-n}9cd5H!$R@Xg z_qIZhH)Qr~ca5_NIkO&~VlQfbrF+7}`R=OYHo0aEA8_fe@KHRa6S_=Z!7ACg%<1y! z2|TE-4TJ7*S%>Ozm#(q%6|cK9V$5-FIAN2kdpZmskXLr<26XzcjP86}u}5olm`7%< zr=NZ``gOwxHbL{OT_#R2Rhc%ucGC44LGDDbi&k#Hk6xPv$3Gr^ZZAG5a7TD~WNuC$yx&|AxqwVT~YN#o7+ z?9pFo@EEOZb~ija#AU6tky8;DzOo;!j~F=HO%!=5Ly+l1+_a5+=lAw&7rM8f^a1zw zV~%&x_4Mzt?j4tRxp#~m>fUkEac(R#hjlmT$eWAqrU4GR@&x)3-RbtPNe^%Oj`R_G zBH0(2l)t%*{{jD%p=oF@VXdh}pdX7i#MKtykfW=FR1n}f=_I@mJH*H zBI_~pO|H%kOqNsbR?;@*7ge{F`6XQn8d141%jc_PnSKQ(vnPf!v_{>;=TpFk&(xv3 zTmt)Jjho2Lt48em+$iNbCEsRB7n;HI8uytT;~H$B=E5S=C-1|TkOL-1{)}X zJPXHvs`EEP@o(6I5C1@x^X>SK^KCi4k7V8Q*j@*m8rjJCdGe*$jJLH;M}7o+NXaDq zWrgE)yT=>X#%#LWh- zqsVuw@K$7>9^v14n)@Smj<9UO4xFtPelXU##epNn*iij+27XzULqC}_LNqo{IzFD; za;*DwRvOr$ivzwE(LpPEF%qop>vx6UpRG3Mh4L==lJ-h35x}Uv*}8yr!|G@9ivIp9 z&$>lmPB_pOaNCSo&uK^>(!{x>QNLcGwu6gi;1DhT_M_m&@#po_e$hyh`hRl`{utV$ zI*+5FDo6eHFQ%NF=J=AjUs5!A5_svvA2V--55L-zAiK~wJ6C%X-qAT6N#@wp-&*sNqHo1d>TC76*54;Y1JtFw-z2Ym zkHU@Cy=lxQ90@nVk?`}xKOMx6>I`Y4nA2KJpB`>nh94N1_J-%{(-fN@CAA=kf%@{1YEt9Al+ut zeK4T4uaGW@jnJhw;?wS7t)%Wa)Lgafh^rKjjC;fG_QpHd6E^1tvF`GGzTf0K;jF37 zICf*g&aFu3j+JzAIaN*8x#(uSe2g_v56<3NP3O8fU$)!3kn(DmpIwWBx8squYVRjL z9W`|FRpJCgllj#gtC_p!PO(*-U5!s4U)ZNv)~Ya4p+{hs*7vX!?8&eG(6aOBqNK7Ox( zendx|(2w>Y=b4Ki1r4cwwOhKZ5sr8c-vY370ZZOmx$9TdA=*ngzPvo;%k0sr_^@k@ ztfRJP=}*?W>Kt^7b)4QRpGLzr@5=!X?UC*Y`$c;tUFbjT7Z=*q_uF)o{Hb;?nBAzr%poV0tJ4%XC9uCA0%8k~wAL<_Tsi}J1Ydirj}?dJ)LQ^qeSgT3RuQ(qlnZ69)~ z<^BL(cxbRCzR)2nGq&O<|NdZ$#Z6WuvmE{Lp-q+m+BV_DKhEl0m|kcwc>n&4PS5 z7=}Kp7b#b~@!&-0i(k={)?f)2>YF?`SO*Ro^F26nJMwjMl{sV|pI21CXVK7jl>FbI z%xUnZ!6#)2mnuu^xfb>*OL!DsgX@UmM(-YB}*0{&lbFkJVSmR;G2ZAx|(m4XNAMav+EAh zz~SUsyJ!IZCzQf70>-!xl&mQ~6-^#Ny8|2xKh!@X>WeYb& z@b>rQ*%Zkf`r_T>*@eI&d3HZ_G|IF6=-ftmHdr{w`tnTcmfnDN9$0y(&OMSm+d>GO8J#Du+BpA4?|9 ze-|0mNf{4P#=n#9ad6ux2PI!6!!{E?_aBsDhog1rckNXYt&aeA((h&PTGBi7(-F?+ z6wNQEo&SH){HLz?|Aywjn>v){6ST3f4sWFSDDnSqXnq`h^lmi299Ts2|Go53nm_9w zp!qj~v2w_Z|64SFF0${C_6B;n0*ptZ`Q-ls&Hw2=f1l=mL;OEV^U~R(Y4l_=>;u%f zS#u#BZY^p|LNSg8j;KRz$ueA`z3iSWmn*5l3`>y4aWc7iiK zP$WjT>6}FQG1TWR=w$qHHGf^%)T(r(RV)vU6w9ZyV0Tl_De_&+1fC4_>0N7C-ll%- z|19z@c&OXEtDi@G$SUkc-`>k2v!2B7l%tFZmX9O(v-~sKC)cNBdJBDU7 z^AJAKmd^JI(^w--yG$DGt5F-2W}4N*Tq5Ii&YZIcT+298v~Y0E8*AyS?169Z#1_(8 zR>Al~=qp?wBDiKk3wKh+2Ljk$LLW$HHKw_iG)2-lr1?4V+S8^rc2OJL)8{Hj_FxwKj_oR3f>T=_#BX-!>o0LOPp(*mv*^E>z_vAqR&;llw> zoXD@%6#gsEg*+MfbYBJE6YbMjMf&JeaGTDoGh;5RBHM!V&4#>ComQEPk8^nyyd@Zi zB<#$J#1Eb4B5CO6!68pDPMhl)`+2PH^D%p97Rkna`f~ILvOso&@Gp6p!G4Zpec!-7 z@`YhVXh}9enz|l*^oi;|e*4J}4tqRup{rHuBuRv5~dbr$T!9-IQ)P-_uyL zVeY5`hr*@$LF=4U_jgIFHC>JN>Kt%o*02_#bJlo73ykF%$7vm=#=Sb8XNya(hP@(jc=1O6B(aw z#n)PQIU4#MCfYZBHo1B%{5#y|g(~|_PS>8teWcZ0$XYugoa;Qfgu{830pDsY)0b~w z#b49NxAK7;iEr_n^hUq|dk%Wl&V*f#R2gq;ud--XYgD85K^lLC@5{lfU<-NkNc=0_ z4Ea)gxPZKU*Q5gffwNV$r%e5)vFaC)88=Y>H1dq2KGC0i$W!{Hxt=tli_--YX*|-5 z>XYVb(r6qrGDyR|x!yB>9NRk+e)=x-ARTiDzZ-Zs56hhKFnt`bmg#HoAiPf<swme`8J6DwYSapRir@B>mJxSz5ol zE9v_&Kdd9`qS;D0o z$MegbUUlt}WNzF0mn6QjA~4gQNO3}~jrO*o1Jvfmw#=g~>JwvEvCc#L51Jfc1TKYd z3Si=WAb5#@mk4PF3RkbAD<;s6CrHz#y5K4FkAYWh5WW~=r^GLU`*Pr(8_88C@Js$G zbX-kQ$KGby-JJD@4r6_2yYTS>{eM%i&b8BG|2TDt=EhU+y{-HAMrjx6$b)@AyZ%BM zZN+X+a^2ceuJcp}cg`5(Y19POhV$@n<(rk?{`z@~h% z4Zf)|>4P`OlL9ZPhIsa#8`y6rZVxnlwe9nUVEz(yix+1B@2!*}U9Y}Eh8WvS3@FqJ$?_pc3j zQraSEwO?1fs4_oC9{hIZ+!c+(6ec-cBwYDFL4Lt@Z?*!(8uT{!;4w@52w@(FK$`oy>INb)lDbEi(^+*k=;Ho zau!L*Z!eQKk=}qu+(f6&3-!9R29#{)LtvAxX2VJXvpBGh+*>l{$i?At}u@uK2?3xBK6#EY*Th8HW)_^rU}^P=CU z=y1b}$}e8j?}I~Lg%@x09_DNm!6;rVHIye_oEh-g+=lk6?Tbj;mmlTJ)%s}7xrFjz z6k(sE9IZhgL-^tN?+cWz`aesWe~AA$W4;afCHqHqg621lGxC_Z**s@i8JUca9eR%y z&0TKD<`Q%~smd5<(VWOs%>^uy?JoT%{_PIV@|0}WTp#>WZz6xFe;C6U{qq5S)t9I7 zE1A5SeA9A){^8Ca+5OT#vN1v*cqrc`cO-AdgO4J#l?id0J1F0~C@%p#Z8_FvXq>?O z@R$I0<|fvLI9EBL9Mrk1{~VMhT_zbQyEN1ZZP4LFLx;Xj*lu*f#dYoN?5h)+!ATQ1 z5r0Z2JV80)G3kV+3~>$d7Y205o}%`L8v0zYNhhqM@Bef(XID~2s1ukcKcY@(Gj!PF z-AQ_#$sl{HuTH2_o^+ycq;`fl%936-cqs3GM;RHy+Jdk~dH)<`s9#0HN0jm0TRn|2 zjK(ez#xSC_NYVEz$4Z=0T3GKfrfKh_9LeFUuyw}pF5h4$@84g<9(TSq{vFRRw%Z^p zSB^1X#*oFI|H(SWwvk=8;(R}C{Ve>lvX_-+1m(A6R#q9Dw;TLnduz|G`XCwf(J;oB zW?au)f_%)BWpI{O4 z`~8Q|r{+U6maz(yLt7uE4EX?_S{mCs!N&>qrS;VLlojJ3l_>TmcFn^fzR>Xp#ungV z5Mzh-T`GgN^*{@aZT}*$&Vn{B1Xj^f*zPFdGYFS2#-v9+7YI}P&L?~v=|#^gu-O{R zyPhpFtyo<;RhIB0Pk?l~Y9L)i_&(K8tXv$sW;v1?p73Ld$V6L$pyGZl#(AT88(*O@$Z~z`?-Pl3wndcm%aus^& zopl%_ zyj@&L*b2hBOjy&z`uTS81;U;u?C~&Ngw63*1-VZ;!dJi$iy}?cyRCHpO=#c&yt16Q8Rv0Txhe*CXMmopCROU|9j zukqoNMrA-V_5Yfs@^W?OO!;cnM(k*G7C!zxibr48wghd^`aXrV5_W$OraXJBjovoC zb+)F~GN=sOUT*p&jr=?9Pt=jm)wl;FaU3|gC)ndCzoPV|?4%~zeXosAn6p);@FcKB z67an44uSu%Uo@8U@vgMt`jIB^+QAx;!Et}i=Q`j>II=-06P|d2bE}fMRoDo^Kej4$ zjt4)QW01{q<5FM)Ud_vmq8+QqFP>BUFw%99X6Hhc(QWp`%0Ax4Bbw6KG@O@shA=ZX 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

  • {|DrP=s~4x`-gZx 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