diff --git a/README.md b/README.md
index 08a2319..bc39fac 100644
--- a/README.md
+++ b/README.md
@@ -34,7 +34,9 @@ Bei einem bereits konfigurierten Bestandsgerät liest der dritte Schritt automat
### Geräte im Netzwerk (LAN-Scanner)
-Der vierte Schritt führt DHCP-Leases (`/ip/dhcp-server/lease`), die ARP-Tabelle (`/ip/arp`) und die Bridge-Host-Tabelle (`/interface/bridge/host`) per MAC-Adresse zu einer Geräteliste zusammen, gruppiert nach dem physischen Anschluss, an dem ein Gerät tatsächlich hängt (aus der Bridge-Host-Tabelle — ARP/Lease zeigen bei gebrückten Setups sonst nur die Bridge selbst, nicht den echten Port). Rein informativ bis auf eine Aktion: Bei einem Gerät mit DHCP-Lease lässt sich diese per Klick fest zuweisen (RouterOS „Make Static") oder wieder entfernen, damit es beim nächsten DHCP-Kontakt wieder eine dynamische Adresse bekommt. Wie die IST-Zustand-Analyse verändert dieser Schritt nichts an der vom Assistenten geplanten Soll-Konfiguration.
+Der vierte Schritt führt DHCP-Leases (`/ip/dhcp-server/lease`), die ARP-Tabelle (`/ip/arp`) und die Bridge-Host-Tabelle (`/interface/bridge/host`) per MAC-Adresse zu einer Geräteliste zusammen, gruppiert nach dem physischen Anschluss, an dem ein Gerät tatsächlich hängt (aus der Bridge-Host-Tabelle — ARP/Lease zeigen bei gebrückten Setups sonst nur die Bridge selbst, nicht den echten Port). Rein informativ bis auf eine Aktion: Bei einem Gerät mit DHCP-Lease lässt sich diese per Klick fest zuweisen (RouterOS „Make Static") oder wieder entfernen. Ein „Aktualisieren"-Button lädt die Liste jederzeit neu.
+
+RouterOS kennt keinen direkten „wieder dynamisch machen"-Befehl — das Rückgängig-Machen entfernt den Lease-Eintrag komplett. Das betroffene Gerät merkt das aber nicht sofort: Es hält seine bisherige IP-Adresse client-seitig weiter, bis es von sich aus eine neue DHCP-Anfrage stellt (Lease-Renewal-Timer) oder der Link neu aufgebaut wird (Kabel/WLAN trennen und neu verbinden, Neustart). Bis dahin zeigt die Zeile „Feste IP entfernt" mit deaktiviertem Button und einem erklärenden Hinweistext, statt kommentarlos auszugrauen. Wie die IST-Zustand-Analyse verändert dieser Schritt nichts an der vom Assistenten geplanten Soll-Konfiguration.
### Experten-Modus
diff --git a/src/MikrotikInstaller.App/ViewModels/Steps/LanScanDeviceRowViewModel.cs b/src/MikrotikInstaller.App/ViewModels/Steps/LanScanDeviceRowViewModel.cs
index 6e60a39..41c62c1 100644
--- a/src/MikrotikInstaller.App/ViewModels/Steps/LanScanDeviceRowViewModel.cs
+++ b/src/MikrotikInstaller.App/ViewModels/Steps/LanScanDeviceRowViewModel.cs
@@ -17,6 +17,7 @@ public partial class LanScanDeviceRowViewModel : ObservableObject
[NotifyPropertyChangedFor(nameof(StatusLabel))]
[NotifyPropertyChangedFor(nameof(ActionLabel))]
[NotifyPropertyChangedFor(nameof(CanToggleStatic))]
+ [NotifyPropertyChangedFor(nameof(ActionHint))]
private DiscoveredDevice _device;
[ObservableProperty]
@@ -26,6 +27,18 @@ public partial class LanScanDeviceRowViewModel : ObservableObject
[ObservableProperty]
private string? _errorMessage;
+ ///
+ /// Gesetzt, direkt nachdem für dieses Gerät eine feste Lease entfernt wurde. RouterOS kennt danach
+ /// keinen Lease-Eintrag mehr für dieses Gerät — das Gerät selbst merkt das aber nicht sofort: Es hält
+ /// seine bisherige IP-Adresse client-seitig weiter, bis es von sich aus eine neue DHCP-Anfrage stellt
+ /// (Lease-Renewal-Timer) oder der Link neu aufgebaut wird (Kabel/WLAN trennen und neu verbinden,
+ /// Neustart). Rein für die Anzeige — wird bei jedem Neuladen des Schritts wieder zurückgesetzt.
+ ///
+ [ObservableProperty]
+ [NotifyPropertyChangedFor(nameof(StatusLabel))]
+ [NotifyPropertyChangedFor(nameof(ActionHint))]
+ private bool _isAwaitingNewLease;
+
public string MacAddress => Device.MacAddress;
public string IpAddressDisplay => Device.IpAddress ?? "Keine IP bekannt";
@@ -36,6 +49,7 @@ public partial class LanScanDeviceRowViewModel : ObservableObject
{
{ IsStaticLease: true } => "Feste IP-Adresse",
{ HasDhcpLease: true } => "Automatisch per DHCP",
+ _ when IsAwaitingNewLease => "Feste IP entfernt",
_ => "Kein DHCP-Lease",
};
@@ -43,4 +57,9 @@ public partial class LanScanDeviceRowViewModel : ObservableObject
/// Ohne DHCP-Lease-Eintrag gibt es nichts, das umgestellt werden könnte.
public bool CanToggleStatic => !IsBusy && Device.LeaseId is not null;
+
+ /// Erklärt, warum der Button gerade deaktiviert ist, nachdem eine feste Zuweisung entfernt wurde.
+ public string? ActionHint => IsAwaitingNewLease && Device.LeaseId is null
+ ? "Erst wieder möglich, sobald sich das Gerät neu meldet — üblicherweise nach Trennen/Neuverbinden oder wenn seine bisherige Lease-Zeit abläuft, nicht sofort."
+ : null;
}
diff --git a/src/MikrotikInstaller.App/ViewModels/Steps/LanScanStepViewModel.cs b/src/MikrotikInstaller.App/ViewModels/Steps/LanScanStepViewModel.cs
index f0bd89f..fd79a2f 100644
--- a/src/MikrotikInstaller.App/ViewModels/Steps/LanScanStepViewModel.cs
+++ b/src/MikrotikInstaller.App/ViewModels/Steps/LanScanStepViewModel.cs
@@ -47,6 +47,7 @@ public partial class LanScanStepViewModel : WizardStepViewModelBase
public override Task OnActivatedAsync() => LoadAsync();
+ /// Auch als manuelles "Aktualisieren" genutzt — z. B. um nach einem Trennen/Neuverbinden zu prüfen, ob ein Gerät wieder eine DHCP-Lease bekommen hat.
[RelayCommand]
private Task Retry() => LoadAsync();
@@ -99,9 +100,15 @@ public partial class LanScanStepViewModel : WizardStepViewModelBase
try
{
- row.Device = row.Device.IsStaticLease
- ? await LanScanService.UndoStaticAsync(_session.Client, row.Device)
- : await LanScanService.MakeStaticAsync(_session.Client, row.Device);
+ if (row.Device.IsStaticLease)
+ {
+ row.Device = await LanScanService.UndoStaticAsync(_session.Client, row.Device);
+ row.IsAwaitingNewLease = true;
+ }
+ else
+ {
+ row.Device = await LanScanService.MakeStaticAsync(_session.Client, row.Device);
+ }
}
catch (RouterOsException ex)
{
diff --git a/src/MikrotikInstaller.App/Views/Steps/LanScanStepView.xaml b/src/MikrotikInstaller.App/Views/Steps/LanScanStepView.xaml
index 25d9233..5989d55 100644
--- a/src/MikrotikInstaller.App/Views/Steps/LanScanStepView.xaml
+++ b/src/MikrotikInstaller.App/Views/Steps/LanScanStepView.xaml
@@ -8,7 +8,15 @@
mc:Ignorable="d"
d:DesignWidth="600">
-
+
+
+
+
+
+
+
@@ -17,8 +25,6 @@
-
+