Jump to content
  • Sign Up
Støtt hjemmeautomasjon.no!

SCRIPT: CheckForUnknown.vb - Finner enheter som er satt til "Unknown" og poller dem


Moskus
 Share

Recommended Posts

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

 

 

image.png

 

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.

  • Like 4
Link to comment
Share on other sites

  • 2 weeks later...
  • 5 weeks later...
On 07/08/2021 at 09:01, Moskus said:

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.

 

Jeg har implementert dette scriptet og kjørt det hver natt. Tenkte det holdt. Det viser seg imidlertid at det - etter å ha kjørt noen uker - hadde en uønsket sideffekt. Jeg har vifter som styres med PWM (Qubino). Disse har både kontrollene on/off - og mulighet for å kontrollere hastighet fra 0 til 100%. Devicen med on/off fikk status som unknown. Effekten av dette er at scriptet korrigerte denne til "on" - som fører til at viften kjører på 100% - som er rimelig heftig luftstrøm og støy. Vet ikke hvorfor akkurat denne devicen fikk status som unknown. Devicene er jo også litt ulogiske siden man typisk styrer farten til å være noe mellom off og on...

Ingen stor praktisk krise, har foreløpig slått av den eventen som kjører scriptet, men tenkte jeg skulle gi beskjed til @Moskus

 

sep-16 04:14:26	 	CheckForErrors	Set 2376 (1.etasje, WC, bryter vifte) to On: All_Success
sep-16 04:14:26	 	Device Control	Device: 1.etasje WC bryter vifte to On (255) by/from: CAPI Control Handler
sep-16 04:14:26	 	CheckForErrors	Poll of device 2376 (1.etasje, WC, bryter vifte) returned OK (254)

 

Link to comment
Share on other sites

2 hours ago, Gizmo said:

Effekten av dette er at scriptet korrigerte denne til "on"

Hvis den er "unknown" så polles enheten. Hvis pollet verdi er ulik device-verdien, så trigges device-verdien på ny.

 

Du kan fjerne dette ved å kommentere ut eller fjerne denne linja:

Dim response As CAPIControlResponse = hs.CAPIControlHandler(CAPI)

 

  • Thanks 1
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...