diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..94a25f7
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/capture/disable_guest_wifi b/capture/disable_guest_wifi
new file mode 100644
index 0000000..e69de29
diff --git a/capture/enable_guest_wifi.request b/capture/enable_guest_wifi.request
new file mode 100644
index 0000000..991da2c
--- /dev/null
+++ b/capture/enable_guest_wifi.request
@@ -0,0 +1,45 @@
+POST /soap/server_sa/ HTTP/1.0
+SOAPAction: urn:NETGEAR-ROUTER:service:WLANConfiguration:1#SetGuestAccessEnabled2
+content-type: text/xml;charset=utf-8
+HOST: www.routerlogin.com
+User-Agent: SOAP Toolkit 3.0
+connection: keep-Alive
+Cache-Control: no-cache
+Pragma: no-cache
+Cookie: sess_id=595c7d4dbd5cd58a94352588a87c6c3295464a3e7ac5262592e08799820c3e01830a65a0e60a540d47582e1850a861e25b003af85315d2ab8a0104ee2cdab661; SameSite=Strict
+content-length: 752
+
+
+
+session_ID
+
+
+
+1
+GUEST_SSID_key
+0
+0
+0
+GUEST_SSID
+WPA2-PSK
+
+
+
+HTTP/1.1 200 OK
+CONTENT-LENGTH:460
+CONTENT-TYPE: text/xml; charset="UTF-8"
+SERVER: "OS/version" UPnP/1.0 "product/version"
+
+
+
+
+
+
+ 000
+
+
diff --git a/pynetgear/__init__.py b/pynetgear/__init__.py
index c8fd287..90cc151 100644
--- a/pynetgear/__init__.py
+++ b/pynetgear/__init__.py
@@ -161,6 +161,67 @@ def tofloats(lst): return (float(t) for t in lst)
trafficdict = {t.tag: parse_text(t.text) for t in data}
return trafficdict
+ def set_guest_wifi_enable(self,SSID,SSID_KEY):
+ """
+ Turn on Guest WIFI
+
+ Returns None if error occurred.
+ """
+ _LOGGER.info("Enable Guest Wifi")
+
+ def parse_response(response):
+ try:
+ result = re.search(REGEX_ENABLE_GUEST_WIFI, response).group(1)
+ except (AttributeError):
+ _LOGGER.error("Error parsing respone: %s", response)
+ return False, None
+ else:
+ return True, result
+ # Right now key should be 16 characters are less, key is broken down into key1,key2..key4
+ # So the assumption is you have breack it down into 16 byte chunks
+ success, response = self._make_request(
+ ACTION_ENABLE_GUEST_WIFI,
+ SOAP_ENABLE_GUEST_WIFI.format(session_id=SESSION_ID,ssid=SSID,ssid_key=SSID_KEY))
+
+ if not success:
+ return None
+
+ parsable, raw = parse_response(response)
+
+ if not parsable:
+ return None
+ return success, response
+
+ def set_guest_wifi_disable(self):
+ """
+ Turn off Guest WIFI
+
+ Returns None if error occurred.
+ """
+ _LOGGER.info("Disable Guest Wifi")
+
+ def parse_response(response):
+ try:
+ result = re.search(REGEX_ENABLE_GUEST_WIFI, response).group(1)
+ except (AttributeError):
+ _LOGGER.error("Error parsing respone: %s", response)
+ return False, None
+ else:
+ return True, result
+
+ success, response = self._make_request(
+ ACTION_DISABLE_GUEST_WIFI,
+ SOAP_DISABLE_GUEST_WIFI.format(session_id=SESSION_ID))
+
+ if not success:
+ return None
+
+ parsable, raw = parse_response(response)
+
+ if not parsable:
+ return None
+ return success, response
+
def _make_request(self, action, message, try_login_after_failure=True):
"""Make an API request to the router."""
# If we are not logged in, the request will fail for sure.
@@ -217,9 +278,15 @@ def convert(value, to_type, default=None):
"urn:NETGEAR-ROUTER:service:DeviceInfo:1#GetAttachDevice"
ACTION_GET_TRAFFIC_METER = \
"urn:NETGEAR-ROUTER:service:DeviceConfig:1#GetTrafficMeterStatistics"
+ACTION_ENABLE_GUEST_WIFI = \
+ "SOAPAction: urn:NETGEAR-ROUTER:service:WLANConfiguration:1#SetGuestAccessEnabled2"
+ACTION_DISABLE_GUEST_WIFI = \
+ "urn:NETGEAR-ROUTER:service:WLANConfiguration:1#SetGuestAccessEnabled"
REGEX_ATTACHED_DEVICES = r"(.*)"
+REGEX_ENABLE_GUEST_WIFI =r".*(WLANConfiguration:1).*"
+
# Until we know how to generate it, give the one we captured
SESSION_ID = "A7D88AE69687E58D9A00"
@@ -268,5 +335,41 @@ def convert(value, to_type, default=None):
"""
+SOAP_ENABLE_GUEST_WIFI = """
+
+
+ {session_id}
+
+
+
+ 1
+ {ssid_key}
+ 0
+ 0
+ 0
+ {ssid}
+ WPA2-PSK
+
+
+
+ """
+
+SOAP_DISABLE_GUEST_WIFI = """
+
+ {session_id}
+
+
+ 0
+
+
+ """
+
+
UNKNOWN_DEVICE_DECODED = ''
UNKNOWN_DEVICE_ENCODED = '<unknown>'