474
README.md
474
README.md
@@ -16,19 +16,18 @@ and should prevent most any random attacker on your network from being able to
|
|||||||
|
|
||||||
## Setup
|
## Setup
|
||||||
|
|
||||||
```
|
```python3
|
||||||
pip3 -r requirements.txt
|
pip3 install -r requirements.txt
|
||||||
```
|
```
|
||||||
|
|
||||||
Install the Python dependencies; the `sslpsk` one is a little weird
|
Install the Python dependencies; the `sslpsk` one is a little weird
|
||||||
and we might need to revisit it later.
|
and we might need to revisit it later.
|
||||||
|
|
||||||
|
|
||||||
## Authenticate to the cloud servers
|
## Authenticate to the cloud servers
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
```
|
```bash
|
||||||
hc-login $USERNAME $PASSWORD > config.json
|
hc-login $USERNAME $PASSWORD > config.json
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -44,10 +43,9 @@ the resulting configuration JSON file *should* be sufficient to
|
|||||||
connect to the devices on your local network, assuming that
|
connect to the devices on your local network, assuming that
|
||||||
your mDNS or DNS server resolves the names correctly.
|
your mDNS or DNS server resolves the names correctly.
|
||||||
|
|
||||||
|
|
||||||
## Home Connect to MQTT
|
## Home Connect to MQTT
|
||||||
|
|
||||||
```
|
```bash
|
||||||
hc2mqtt config.json
|
hc2mqtt config.json
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -71,89 +69,89 @@ library.
|
|||||||
|
|
||||||
Example message published to `homeconnect/dishwasher`:
|
Example message published to `homeconnect/dishwasher`:
|
||||||
|
|
||||||
```
|
```json
|
||||||
{
|
{
|
||||||
"state": "Run",
|
"state": "Run",
|
||||||
"door": "Closed",
|
"door": "Closed",
|
||||||
"remaining": "2:49",
|
"remaining": "2:49",
|
||||||
"power": true,
|
"power": true,
|
||||||
"lowwaterpressure": false,
|
"lowwaterpressure": false,
|
||||||
"aquastop": false,
|
"aquastop": false,
|
||||||
"error": false,
|
"error": false,
|
||||||
"remainingseconds": 10140
|
"remainingseconds": 10140
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
<summary>Full state information</summary>
|
<summary>Full state information</summary>
|
||||||
|
|
||||||
```
|
```json
|
||||||
{
|
{
|
||||||
'AllowBackendConnection': False,
|
'AllowBackendConnection': False,
|
||||||
'BackendConnected': False,
|
'BackendConnected': False,
|
||||||
'RemoteControlLevel': 'ManualRemoteStart',
|
'RemoteControlLevel': 'ManualRemoteStart',
|
||||||
'SoftwareUpdateAvailable': 'Off',
|
'SoftwareUpdateAvailable': 'Off',
|
||||||
'ConfirmPermanentRemoteStart': 'Off',
|
'ConfirmPermanentRemoteStart': 'Off',
|
||||||
'ActiveProgram': 0,
|
'ActiveProgram': 0,
|
||||||
'SelectedProgram': 8192,
|
'SelectedProgram': 8192,
|
||||||
'RemoteControlStartAllowed': False,
|
'RemoteControlStartAllowed': False,
|
||||||
'520': '2022-02-21T16:48:54',
|
'520': '2022-02-21T16:48:54',
|
||||||
'RemoteControlActive': True,
|
'RemoteControlActive': True,
|
||||||
'AquaStopOccured': 'Off',
|
'AquaStopOccured': 'Off',
|
||||||
'DoorState': 'Open',
|
'DoorState': 'Open',
|
||||||
'PowerState': 'Off',
|
'PowerState': 'Off',
|
||||||
'ProgramFinished': 'Off',
|
'ProgramFinished': 'Off',
|
||||||
'ProgramProgress': 100,
|
'ProgramProgress': 100,
|
||||||
'LowWaterPressure': 'Off',
|
'LowWaterPressure': 'Off',
|
||||||
'RemainingProgramTime': 0,
|
'RemainingProgramTime': 0,
|
||||||
'ProgramAborted': 'Off',
|
'ProgramAborted': 'Off',
|
||||||
'547': False,
|
'547': False,
|
||||||
'RemainingProgramTimeIsEstimated': True,
|
'RemainingProgramTimeIsEstimated': True,
|
||||||
'OperationState': 'Inactive',
|
'OperationState': 'Inactive',
|
||||||
'StartInRelative': 0,
|
'StartInRelative': 0,
|
||||||
'EnergyForecast': 82,
|
'EnergyForecast': 82,
|
||||||
'WaterForecast': 70,
|
'WaterForecast': 70,
|
||||||
'ConnectLocalWiFi': 'Off',
|
'ConnectLocalWiFi': 'Off',
|
||||||
'SoftwareUpdateTransactionID': 0,
|
'SoftwareUpdateTransactionID': 0,
|
||||||
'SoftwareDownloadAvailable': 'Off',
|
'SoftwareDownloadAvailable': 'Off',
|
||||||
'SoftwareUpdateSuccessful': 'Off',
|
'SoftwareUpdateSuccessful': 'Off',
|
||||||
'ProgramPhase': 'Drying',
|
'ProgramPhase': 'Drying',
|
||||||
'SilenceOnDemandRemainingTime': 0,
|
'SilenceOnDemandRemainingTime': 0,
|
||||||
'EcoDryActive': False,
|
'EcoDryActive': False,
|
||||||
'RinseAid': 'R04',
|
'RinseAid': 'R04',
|
||||||
'SensitivityTurbidity': 'Standard',
|
'SensitivityTurbidity': 'Standard',
|
||||||
'ExtraDry': False,
|
'ExtraDry': False,
|
||||||
'HotWater': 'ColdWater',
|
'HotWater': 'ColdWater',
|
||||||
'TimeLight': 'On',
|
'TimeLight': 'On',
|
||||||
'EcoAsDefault': 'LastProgram',
|
'EcoAsDefault': 'LastProgram',
|
||||||
'SoundLevelSignal': 'Off',
|
'SoundLevelSignal': 'Off',
|
||||||
'SoundLevelKey': 'Medium',
|
'SoundLevelKey': 'Medium',
|
||||||
'WaterHardness': 'H04',
|
'WaterHardness': 'H04',
|
||||||
'DryingAssistantAllPrograms': 'AllPrograms',
|
'DryingAssistantAllPrograms': 'AllPrograms',
|
||||||
'SilenceOnDemandDefaultTime': 1800,
|
'SilenceOnDemandDefaultTime': 1800,
|
||||||
'SpeedOnDemand': False,
|
'SpeedOnDemand': False,
|
||||||
'InternalError': 'Off',
|
'InternalError': 'Off',
|
||||||
'CheckFilterSystem': 'Off',
|
'CheckFilterSystem': 'Off',
|
||||||
'DrainingNotPossible': 'Off',
|
'DrainingNotPossible': 'Off',
|
||||||
'DrainPumpBlocked': 'Off',
|
'DrainPumpBlocked': 'Off',
|
||||||
'WaterheaterCalcified': 'Off',
|
'WaterheaterCalcified': 'Off',
|
||||||
'LowVoltage': 'Off',
|
'LowVoltage': 'Off',
|
||||||
'SaltLack': 'Off',
|
'SaltLack': 'Off',
|
||||||
'RinseAidLack': 'Off',
|
'RinseAidLack': 'Off',
|
||||||
'SaltNearlyEmpty': 'Off',
|
'SaltNearlyEmpty': 'Off',
|
||||||
'RinseAidNearlyEmpty': 'Off',
|
'RinseAidNearlyEmpty': 'Off',
|
||||||
'MachineCareReminder': 'Off',
|
'MachineCareReminder': 'Off',
|
||||||
'5121': False,
|
'5121': False,
|
||||||
'HalfLoad': False,
|
'HalfLoad': False,
|
||||||
'IntensivZone': False,
|
'IntensivZone': False,
|
||||||
'VarioSpeedPlus': False,
|
'VarioSpeedPlus': False,
|
||||||
'5131': False,
|
'5131': False,
|
||||||
'5134': True,
|
'5134': True,
|
||||||
'SilenceOnDemand': False
|
'SilenceOnDemand': False
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
</details>
|
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
### Clothes washer
|
### Clothes washer
|
||||||
|
|
||||||
@@ -167,86 +165,86 @@ binary data over the websocket (type 0x82).
|
|||||||
|
|
||||||
Example message published to `homeconnect/washer`:
|
Example message published to `homeconnect/washer`:
|
||||||
|
|
||||||
```
|
```json
|
||||||
{
|
{
|
||||||
"state": "Ready",
|
"state": "Ready",
|
||||||
"door": "Closed",
|
"door": "Closed",
|
||||||
"remaining": "3:48",
|
"remaining": "3:48",
|
||||||
"power": true,
|
"power": true,
|
||||||
"lowwaterpressure": false,
|
"lowwaterpressure": false,
|
||||||
"aquastop": false,
|
"aquastop": false,
|
||||||
"error": false,
|
"error": false,
|
||||||
"remainingseconds": 13680
|
"remainingseconds": 13680
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
<summary>Full state information</summary>
|
<summary>Full state information</summary>
|
||||||
|
|
||||||
```
|
```json
|
||||||
{
|
{
|
||||||
'BackendConnected': False,
|
'BackendConnected': False,
|
||||||
'CustomerEnergyManagerPaired': False,
|
'CustomerEnergyManagerPaired': False,
|
||||||
'CustomerServiceConnectionAllowed': False,
|
'CustomerServiceConnectionAllowed': False,
|
||||||
'DoorState': 'Open',
|
'DoorState': 'Open',
|
||||||
'FlexStart': 'Disabled',
|
'FlexStart': 'Disabled',
|
||||||
'LocalControlActive': False,
|
'LocalControlActive': False,
|
||||||
'OperationState': 'Ready',
|
'OperationState': 'Ready',
|
||||||
'RemoteControlActive': True,
|
'RemoteControlActive': True,
|
||||||
'RemoteControlStartAllowed': False,
|
'RemoteControlStartAllowed': False,
|
||||||
'WiFiSignalStrength': -50,
|
'WiFiSignalStrength': -50,
|
||||||
'LoadInformation': 0,
|
'LoadInformation': 0,
|
||||||
'AquaStopOccured': 'Off',
|
'AquaStopOccured': 'Off',
|
||||||
'CustomerServiceRequest': 'Off',
|
'CustomerServiceRequest': 'Off',
|
||||||
'LowWaterPressure': 'Off',
|
'LowWaterPressure': 'Off',
|
||||||
'ProgramFinished': 'Off',
|
'ProgramFinished': 'Off',
|
||||||
'SoftwareUpdateAvailable': 'Off',
|
'SoftwareUpdateAvailable': 'Off',
|
||||||
'WaterLevelTooHigh': 'Off',
|
'WaterLevelTooHigh': 'Off',
|
||||||
'DoorNotLockable': 'Off',
|
'DoorNotLockable': 'Off',
|
||||||
'DoorNotUnlockable': 'Off',
|
'DoorNotUnlockable': 'Off',
|
||||||
'DoorOpen': 'Off',
|
'DoorOpen': 'Off',
|
||||||
'FatalErrorOccured': 'Off',
|
'FatalErrorOccured': 'Off',
|
||||||
'FoamDetection': 'Off',
|
'FoamDetection': 'Off',
|
||||||
'DrumCleanReminder': 'Off',
|
'DrumCleanReminder': 'Off',
|
||||||
'PumpError': 'Off',
|
'PumpError': 'Off',
|
||||||
'ReleaseRinseHoldPending': 'Off',
|
'ReleaseRinseHoldPending': 'Off',
|
||||||
'EnergyForecast': 20,
|
'EnergyForecast': 20,
|
||||||
'EstimatedTotalProgramTime': 13680,
|
'EstimatedTotalProgramTime': 13680,
|
||||||
'FinishInRelative': 13680,
|
'FinishInRelative': 13680,
|
||||||
'FlexFinishInRelative': 0,
|
'FlexFinishInRelative': 0,
|
||||||
'ProgramProgress': 0,
|
'ProgramProgress': 0,
|
||||||
'RemainingProgramTime': 13680,
|
'RemainingProgramTime': 13680,
|
||||||
'RemainingProgramTimeIsEstimated': True,
|
'RemainingProgramTimeIsEstimated': True,
|
||||||
'WaterForecast': 40,
|
'WaterForecast': 40,
|
||||||
'LoadRecommendation': 10000,
|
'LoadRecommendation': 10000,
|
||||||
'ProcessPhase': 4,
|
'ProcessPhase': 4,
|
||||||
'ReferToProgram': 0,
|
'ReferToProgram': 0,
|
||||||
'LessIroning': False,
|
'LessIroning': False,
|
||||||
'Prewash': False,
|
'Prewash': False,
|
||||||
'RinseHold': False,
|
'RinseHold': False,
|
||||||
'RinsePlus': 0,
|
'RinsePlus': 0,
|
||||||
'SilentWash': False,
|
'SilentWash': False,
|
||||||
'Soak': False,
|
'Soak': False,
|
||||||
'SpeedPerfect': False,
|
'SpeedPerfect': False,
|
||||||
'SpinSpeed': 160,
|
'SpinSpeed': 160,
|
||||||
'Stains': 0,
|
'Stains': 0,
|
||||||
'Temperature': 254,
|
'Temperature': 254,
|
||||||
'WaterPlus': False,
|
'WaterPlus': False,
|
||||||
'AllowBackendConnection': False,
|
'AllowBackendConnection': False,
|
||||||
'AllowEnergyManagement': False,
|
'AllowEnergyManagement': False,
|
||||||
'AllowFlexStart': False,
|
'AllowFlexStart': False,
|
||||||
'ChildLock': False,
|
'ChildLock': False,
|
||||||
'Language': 'En',
|
'Language': 'En',
|
||||||
'PowerState': 'On',
|
'PowerState': 'On',
|
||||||
'EndSignalVolume': 'Medium',
|
'EndSignalVolume': 'Medium',
|
||||||
'KeySignalVolume': 'Loud',
|
'KeySignalVolume': 'Loud',
|
||||||
'EnableDrumCleanReminder': True,
|
'EnableDrumCleanReminder': True,
|
||||||
'ActiveProgram': 0,
|
'ActiveProgram': 0,
|
||||||
'SelectedProgram': 28718
|
'SelectedProgram': 28718
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
</details>
|
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
### Coffee Machine
|
### Coffee Machine
|
||||||
|
|
||||||
@@ -257,101 +255,101 @@ The coffee machine needs a better mapping to MQTT messages.
|
|||||||
<details>
|
<details>
|
||||||
<summary>Full state information</summary>
|
<summary>Full state information</summary>
|
||||||
|
|
||||||
```
|
```json
|
||||||
{
|
{
|
||||||
'LastSelectedBeverage': 8217,
|
'LastSelectedBeverage': 8217,
|
||||||
'LocalControlActive': False,
|
'LocalControlActive': False,
|
||||||
'PowerSupplyError': 'Off',
|
'PowerSupplyError': 'Off',
|
||||||
'DripTrayNotInserted': 'Off',
|
'DripTrayNotInserted': 'Off',
|
||||||
'DripTrayFull': 'Off',
|
'DripTrayFull': 'Off',
|
||||||
'WaterFilterShouldBeChanged': 'Off',
|
'WaterFilterShouldBeChanged': 'Off',
|
||||||
'WaterTankEmpty': 'Off',
|
'WaterTankEmpty': 'Off',
|
||||||
'WaterTankNearlyEmpty': 'Off',
|
'WaterTankNearlyEmpty': 'Off',
|
||||||
'BrewingUnitIsMissing': 'Off',
|
'BrewingUnitIsMissing': 'Off',
|
||||||
'SelectedProgram': 0,
|
'SelectedProgram': 0,
|
||||||
'MacchiatoPause': '5Sec',
|
'MacchiatoPause': '5Sec',
|
||||||
'ActiveProgram': 0,
|
'ActiveProgram': 0,
|
||||||
'BeverageCountdownWaterfilter': 48,
|
'BeverageCountdownWaterfilter': 48,
|
||||||
'BeverageCountdownCalcNClean': 153,
|
'BeverageCountdownCalcNClean': 153,
|
||||||
'RemoteControlStartAllowed': True,
|
'RemoteControlStartAllowed': True,
|
||||||
'EmptyDripTray': 'Off',
|
'EmptyDripTray': 'Off',
|
||||||
'BeverageCountdownDescaling': 153,
|
'BeverageCountdownDescaling': 153,
|
||||||
'EmptyDripTrayRemoveContainer': 'Off',
|
'EmptyDripTrayRemoveContainer': 'Off',
|
||||||
'BeverageCounterRistrettoEspresso': 177,
|
'BeverageCounterRistrettoEspresso': 177,
|
||||||
'AllowBackendConnection': True,
|
'AllowBackendConnection': True,
|
||||||
'BeverageCounterHotWater': 37351,
|
'BeverageCounterHotWater': 37351,
|
||||||
'RemindForMilkAfter': 'Off',
|
'RemindForMilkAfter': 'Off',
|
||||||
'BeverageCounterFrothyMilk': 22,
|
'BeverageCounterFrothyMilk': 22,
|
||||||
'BeverageCounterCoffeeAndMilk': 1077,
|
'BeverageCounterCoffeeAndMilk': 1077,
|
||||||
'CustomerServiceRequest': 'Off',
|
'CustomerServiceRequest': 'Off',
|
||||||
'4645': 0,
|
'4645': 0,
|
||||||
'CoffeeMilkOrder': 'FirstCoffee',
|
'CoffeeMilkOrder': 'FirstCoffee',
|
||||||
'BackendConnected': True,
|
'BackendConnected': True,
|
||||||
'BeverageCounterCoffee': 21,
|
'BeverageCounterCoffee': 21,
|
||||||
'Enjoy': 'Off',
|
'Enjoy': 'Off',
|
||||||
'UserMode': 'Barista',
|
'UserMode': 'Barista',
|
||||||
'PlaceEmptyGlassUnderOutlet': 'Off',
|
'PlaceEmptyGlassUnderOutlet': 'Off',
|
||||||
'WaterTankNotInserted': 'Off',
|
'WaterTankNotInserted': 'Off',
|
||||||
'PlaylistRunning': False,
|
'PlaylistRunning': False,
|
||||||
'BeverageCounterPowderCoffee': 9,
|
'BeverageCounterPowderCoffee': 9,
|
||||||
'DemoModeActive': False,
|
'DemoModeActive': False,
|
||||||
'CleanBrewingUnit': 'Off',
|
'CleanBrewingUnit': 'Off',
|
||||||
'WaterHardness': 'Medium',
|
'WaterHardness': 'Medium',
|
||||||
'CloseDoor': 'Off',
|
'CloseDoor': 'Off',
|
||||||
'EmptyMilkTank': 'Off',
|
'EmptyMilkTank': 'Off',
|
||||||
'SpecialRinsing': 'Off',
|
'SpecialRinsing': 'Off',
|
||||||
'AllowConsumerInsights': False,
|
'AllowConsumerInsights': False,
|
||||||
'SwitchOffAfter': '01Hours15Minutes',
|
'SwitchOffAfter': '01Hours15Minutes',
|
||||||
'4681': 0,
|
'4681': 0,
|
||||||
'LastSelectedCoffeeWorldBeverage': 20514,
|
'LastSelectedCoffeeWorldBeverage': 20514,
|
||||||
'BrightnessDisplay': 7,
|
'BrightnessDisplay': 7,
|
||||||
'CleanMilkTank': 'Off',
|
'CleanMilkTank': 'Off',
|
||||||
'NotEnoughWaterForThisKindOfBeverage': 'Off',
|
'NotEnoughWaterForThisKindOfBeverage': 'Off',
|
||||||
'ChildLock': False,
|
'ChildLock': False,
|
||||||
'4666': 0,
|
'4666': 0,
|
||||||
'Language': 'De',
|
'Language': 'De',
|
||||||
'MilkContainerConnected': 'Off',
|
'MilkContainerConnected': 'Off',
|
||||||
'SoftwareUpdateAvailable': 'Off',
|
'SoftwareUpdateAvailable': 'Off',
|
||||||
'LeaveProfilesAutomatically': True,
|
'LeaveProfilesAutomatically': True,
|
||||||
'RemoveWaterFilter': 'Off',
|
'RemoveWaterFilter': 'Off',
|
||||||
'OperationState': 'Inactive',
|
'OperationState': 'Inactive',
|
||||||
'BeverageCounterHotMilk': 9,
|
'BeverageCounterHotMilk': 9,
|
||||||
'4362': 0,
|
'4362': 0,
|
||||||
'MilkTubeRemoved': 'Off',
|
'MilkTubeRemoved': 'Off',
|
||||||
'DeviceIsToCold4C': 'Off',
|
'DeviceIsToCold4C': 'Off',
|
||||||
'SystemHasRunDry': 'Off',
|
'SystemHasRunDry': 'Off',
|
||||||
'DeviceShouldBeDescaled': 'Off',
|
'DeviceShouldBeDescaled': 'Off',
|
||||||
'PowerState': 'Standby',
|
'PowerState': 'Standby',
|
||||||
'DeviceShouldBeCleaned': 'Off',
|
'DeviceShouldBeCleaned': 'Off',
|
||||||
'DeviceShouldBeCalcNCleaned': 'Off',
|
'DeviceShouldBeCalcNCleaned': 'Off',
|
||||||
'BeanContainerEmpty': 'Off',
|
'BeanContainerEmpty': 'Off',
|
||||||
'MilkStillOK': 'Off',
|
'MilkStillOK': 'Off',
|
||||||
'CoffeeOutletMissing': 'Off',
|
'CoffeeOutletMissing': 'Off',
|
||||||
'MilkReminder': 'Off',
|
'MilkReminder': 'Off',
|
||||||
'RefillEmptyWaterTank': 'Off',
|
'RefillEmptyWaterTank': 'Off',
|
||||||
'RefillEmptyBeanContainer': 'Off',
|
'RefillEmptyBeanContainer': 'Off',
|
||||||
'UnderOverVoltage': 'Off',
|
'UnderOverVoltage': 'Off',
|
||||||
'NotEnoughPomaceCapacityForThisKindOfBeverage': 'Off',
|
'NotEnoughPomaceCapacityForThisKindOfBeverage': 'Off',
|
||||||
'AdjustGrindSetting': 'Off',
|
'AdjustGrindSetting': 'Off',
|
||||||
'InsertWaterFilter': 'Off',
|
'InsertWaterFilter': 'Off',
|
||||||
'FillDescaler': 'Off',
|
'FillDescaler': 'Off',
|
||||||
'CleanFillWaterTank': 'Off',
|
'CleanFillWaterTank': 'Off',
|
||||||
'PlaceContainerUnderOutlet': 'Off',
|
'PlaceContainerUnderOutlet': 'Off',
|
||||||
'SwitchOffPower30sekBackOn': 'Off',
|
'SwitchOffPower30sekBackOn': 'Off',
|
||||||
'ThrowCleaningDiscInTheDrawer': 'Off',
|
'ThrowCleaningDiscInTheDrawer': 'Off',
|
||||||
'RemoveMilkContainer': 'Off',
|
'RemoveMilkContainer': 'Off',
|
||||||
'RemoveContainerUnderOutlet': 'Off',
|
'RemoveContainerUnderOutlet': 'Off',
|
||||||
'MilkContainerRemoved': 'Off',
|
'MilkContainerRemoved': 'Off',
|
||||||
'ServiceProgramFinished': 'Off',
|
'ServiceProgramFinished': 'Off',
|
||||||
'DeviceDescalingOverdue': 'Off',
|
'DeviceDescalingOverdue': 'Off',
|
||||||
'DeviceDescalingBlockage': 'Off',
|
'DeviceDescalingBlockage': 'Off',
|
||||||
'CustomerServiceConnectionAllowed': False,
|
'CustomerServiceConnectionAllowed': False,
|
||||||
'BeverageCountdownCleaning': 38,
|
'BeverageCountdownCleaning': 38,
|
||||||
'ProcessPhase': 'None'
|
'ProcessPhase': 'None'
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
</details>
|
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
## FRIDA tools
|
## FRIDA tools
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user