Det hender jeg eksperimenterer med Z-wave, til og med på hovedsystemet. Jeg har et par Z-wave-interfacer jeg bytter mellom (kjører restore av backup til et nytt interface før for mye testing), og det fjerner all potensiell routing-informasjon. I løpet av de første timene prøver altså huset å "finne seg selv", alt går litt tregt, og det blir høyere risiko for at noe er satt til "Unknown".
Jeg skrev et script for å finne disse enhetene, og så polle dem for å faktisk lese statusen de har. Det hjelper både for å få fjernet de irriterende "Unknown"-status'ene, og det hjelper på å bedre routingen fordi kommandoen blir utført.
For at dette skal fungere ut av esken må HomeSeer finne seg selv på localholst på port 80. Hvis ikke må du endre "Dim url as String"-linja.
CheckForUnknown.vb
Public Sub Main(ByVal params As Object)
'Moskus 2020
Dim subStart As DateTime = DateTime.UtcNow
Dim url As String = "http://localhost/json?request=getstatus"
Dim json As String = ""
Dim DEBUG As Boolean = False
If DEBUG Then hs.WriteLog("CheckForErrors", "Downloading data... ")
Using client As New System.Net.WebClient
json = client.DownloadString(url)
json = json.ToLower()
End Using
If DEBUG Then hs.WriteLog("CheckForErrors", "Download done!")
Dim searchString As String = ("{""ref"":").ToLower()
Dim errorSearchString As String = ("""status"":""Unknown"",""device_type_string"":""Z-Wave Switch").ToLower()
Dim lst As New System.Collections.Generic.List(Of Integer)
Dim start As Integer = 0
If json.IndexOf(errorSearchString) > 0 Then ' Yes, we have errors, lets find the devices by looping through all devices
While start <> -1
Dim deviceJsonStart As Integer = json.IndexOf(searchString, start)
If deviceJsonStart = -1 Then Exit While
Dim deviceJsonEnd As Integer = json.IndexOf(searchString, deviceJsonStart + searchString.Length)
If deviceJsonEnd = -1 Then Exit While
Dim deviceJson As String = json.Substring(deviceJsonStart, deviceJsonEnd - deviceJsonStart) 'This is the JSON for a device
If deviceJson.Contains(errorSearchString) Then 'Check if the device contains the error and get the deviceRef if it doesn't
Dim deviceRef As Integer = deviceJson.Substring(searchString.Length, deviceJson.IndexOf(",") - searchString.Length)
lst.Add(deviceRef)
If DEBUG Then hs.WriteLog("CheckForErrors", "Found reference '" + deviceRef.ToString + "'")
End If
start = json.IndexOf(searchString, deviceJsonStart + 10)
End While
End If
For Each d As Integer In lst
Dim dev As Scheduler.Classes.DeviceClass = hs.GetDeviceByRef(d)
Dim devName As String = dev.Location2(hs) & ", " & dev.Location(hs) & ", " & dev.Name(hs)
Dim pollResult As HomeSeerAPI.IPlugInAPI.PollResultInfo = hs.PluginFunction("Z-Wave", "", "PollDevice", New Object() {d})
hs.WriteLog("CheckForErrors", "Poll of device " & d.ToString & " (" & devName & ") returned " & pollResult.Result.ToString & " (" & pollResult.Value & ")")
'Check if the device has the correct value
If pollResult.Result = HomeSeerAPI.IPlugInAPI.enumPollResult.OK OrElse pollResult.Result = HomeSeerAPI.IPlugInAPI.enumPollResult.Timeout_OK Then
Dim pollValue As Integer = pollResult.Value
Dim devValue As Integer = hs.DeviceValue(d)
'Set the device to the correct value
If devValue <> pollValue Then
For Each CAPI As HomeSeerAPI.CAPIControl In hs.CAPIGetControl(d)
If CAPI.ControlValue = devValue Then
Dim response As CAPIControlResponse = hs.CAPIControlHandler(CAPI)
hs.WriteLog("CheckForErrors", "Set " & d.ToString & " (" & devName & ") to " & CAPI.Label & ": " & response.ToString)
Exit For
End If
Next
End If
End If
Next
hs.WriteLog("CheckForErrors", "Done! Elapsed time: " & Math.Round(DateTime.UtcNow.Subtract(subStart).TotalSeconds, 2) & " seconds")
End Sub
Jeg kjører dette scriptet i et event hver 10. minutt. Men jeg har også en begrensning på at det ikke må ha vært bevegelse i huset i løpet av 5 minutter for å redusere trafikken når routingen er på det verste.
Jeg hadde selvfølgelig tenkt å disable scriptet når det ikke var behov for det, men ellers merker jeg ikke noe til det for det er særdeles sjeldent scriptet finner "Unknown" lenger, det ser jeg jo nå i loggen.