|
@@ -152,6 +152,14 @@ class GuestNameSensor(ReservationStrSensor):
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+_WIFI_QR_ESCAPE_RE = re.compile(r'([\\;,:"])')
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+def _wifi_qr_escape(value: str) -> str:
|
|
|
|
|
+ """Escape special characters in a WiFi QR field per the de-facto MECARD-style spec."""
|
|
|
|
|
+ return _WIFI_QR_ESCAPE_RE.sub(r"\\\1", value)
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
class WiFiKeySensor(_ReservationSensor):
|
|
class WiFiKeySensor(_ReservationSensor):
|
|
|
def __init__(self, coordinator, entry, slot, device_info) -> None:
|
|
def __init__(self, coordinator, entry, slot, device_info) -> None:
|
|
|
super().__init__(coordinator, entry, slot, device_info, "wifi_key", "wifi_key", "mdi:wifi-lock")
|
|
super().__init__(coordinator, entry, slot, device_info, "wifi_key", "wifi_key", "mdi:wifi-lock")
|
|
@@ -165,7 +173,11 @@ class WiFiKeySensor(_ReservationSensor):
|
|
|
res = self._reservation()
|
|
res = self._reservation()
|
|
|
if res.wifi_ssid is None or res.wifi_key is None:
|
|
if res.wifi_ssid is None or res.wifi_key is None:
|
|
|
return None
|
|
return None
|
|
|
- return {"qr": f"WIFI:S:{res.wifi_ssid};T:WPA;P:{res.wifi_key};;"}
|
|
|
|
|
|
|
+ ssid = _wifi_qr_escape(res.wifi_ssid)
|
|
|
|
|
+ if res.wifi_key == "":
|
|
|
|
|
+ return {"qr": f"WIFI:S:{ssid};T:nopass;;"}
|
|
|
|
|
+ key = _wifi_qr_escape(res.wifi_key)
|
|
|
|
|
+ return {"qr": f"WIFI:S:{ssid};T:WPA;P:{key};;"}
|
|
|
|
|
|
|
|
|
|
|
|
|
class ReservationTimeSensor(_ReservationSensor):
|
|
class ReservationTimeSensor(_ReservationSensor):
|