Page 2 of 5

Re: afvalwijzer script

Posted: Thu Aug 13, 2015 10:50 am
by bartbakels
Jammer, dat mijn adres niet supported is :(

Re: afvalwijzer script

Posted: Thu Aug 13, 2015 10:52 am
by raymonvdm
bartbakels wrote:Jammer, dat mijn adres niet supported is :(
Ik vermoed dat je gemeente de data niet heeft aan geleverd bij afvalwijzer, wellicht kunnen ze dat als nog doen?

Re: afvalwijzer script

Posted: Fri Aug 14, 2015 1:46 am
by JoopK
stefxx wrote:Hier de output, beetje leesbaar: http://codebeautify.org/jsonviewer/c0531e

En als je de iconen zoekt: http://codebeautify.org/jsonviewer/1f58e2
Met welk commando krijg je de iconen terug?

Re: afvalwijzer script

Posted: Fri Aug 14, 2015 2:07 am
by JoopK
Working for me in HS2: (added status only V17)

Code: Select all

Public Sub Main()
Dim Postcode, Huisnummer, Toevoeging
Dim objHttp, Text, i, Ophaaldagen
Dim Datum, d

' Vul hier je eigen gegevens in
Postcode = "2622pb"
Huisnummer = "83"
Toevoeging = ""

' Ander test adres
'Postcode = "8266bh"
'Huisnummer = "1"
'Toevoeging = ""

Set objHttp = CreateObject("Msxml2.ServerXMLHTTP")
objHttp.Open "GET", "http://json.mijnafvalwijzer.nl/?method=postcodecheck&postcode=" & Postcode & "&street=&huisnummer=" & Huisnummer & "&toevoeging=" & Toevoeging & _
    "&platform=phone&langs=nl&mobiletype=android&platform=phone&version=33%20HTTP/1.1", False
objHttp.Send
Text = objHttp.ResponseText
Set objHttp = Nothing

If Len(Text) > 10 Then

    Set oJSON = New aspJSON
    oJSON.loadJSON(Text)

    'Get single value
    hs.writelog "afval", "Response: " & oJSON.data("response")
    hs.writelog "afval", "Gemeente: " & oJSON.data("data")("gemeente")
    Datum = Year(now()) & "-" & Right("0" & Month(Now()),2) & "-" & Right("0" & Day(Now()),2)
    hs.writelog "afval", "Datum: " & chr(13) & Datum
    Ophaaldagen = ""
    For Each i In oJSON.data("data")("ophaaldagen")("data")
        Set this = oJSON.data("data")("ophaaldagen")("data").item(i)
        Ophaaldagen = Ophaaldagen & this.item("type") & ": " & this.item("date") & this.item("type") & ": " & this.item("date") & chr(13)
        d = this.item("date")
        hs.writelog "afval", "d: " & chr(13) & d
        If d >= Datum Then
          Hs.setdevicestring "V17", this.item("type") & ": " & this.item("date")
          Exit For
        End If
    Next
    hs.writelog "afval", "Ophaaldagen: " & chr(13) & Ophaaldagen

Else   

    hs.writelog "afval", "No data received. Location probably not supported by mijnafvalwijzer.nl."
   
End If

End Sub

'Februari 2014 - Version 1.17 by Gerrit van Kuipers
Class aspJSON
   Public data
   Private p_JSONstring
   private aj_in_string, aj_in_escape, aj_i_tmp, aj_char_tmp, aj_s_tmp, aj_line_tmp, aj_line, aj_lines, aj_currentlevel, aj_currentkey, aj_currentvalue, aj_newlabel, aj_XmlHttp, aj_RegExp, aj_colonfound

   Private Sub Class_Initialize()
      Set data = Collection()

       Set aj_RegExp = new regexp
       aj_RegExp.Pattern = "\s{0,}(\S{1}[\s,\S]*\S{1})\s{0,}"
       aj_RegExp.Global = False
       aj_RegExp.IgnoreCase = True
       aj_RegExp.Multiline = True
   End Sub

   Private Sub Class_Terminate()
      Set data = Nothing
       Set aj_RegExp = Nothing
   End Sub

   Public Sub loadJSON(inputsource)
      inputsource = aj_MultilineTrim(inputsource)
      If Len(inputsource) = 0 Then Err.Raise 1, "loadJSON Error", "No data to load."
      
      select case Left(inputsource, 1)
         case "{", "["
         case else
            Set aj_XmlHttp = CreateObject("Msxml2.ServerXMLHTTP")
            aj_XmlHttp.open "GET", inputsource, False
            aj_XmlHttp.setRequestHeader "Content-Type", "text/json"
            aj_XmlHttp.setRequestHeader "CharSet", "UTF-8"
            aj_XmlHttp.Send
            inputsource = aj_XmlHttp.responseText
            set aj_XmlHttp = Nothing
      end select

      p_JSONstring = CleanUpJSONstring(inputsource)
      aj_lines = Split(p_JSONstring, Chr(13) & Chr(10))

      Dim level(99)
      aj_currentlevel = 1
      Set level(aj_currentlevel) = data
      For Each aj_line In aj_lines
         aj_currentkey = ""
         aj_currentvalue = ""
         If Instr(aj_line, ":") > 0 Then
            aj_in_string = False
            aj_in_escape = False
            aj_colonfound = False
            For aj_i_tmp = 1 To Len(aj_line)
               If aj_in_escape Then
                  aj_in_escape = False
               Else
                  Select Case Mid(aj_line, aj_i_tmp, 1)
                     Case """"
                        aj_in_string = Not aj_in_string
                     Case ":"
                        If Not aj_in_escape And Not aj_in_string Then
                           aj_currentkey = Left(aj_line, aj_i_tmp - 1)
                           aj_currentvalue = Mid(aj_line, aj_i_tmp + 1)
                           aj_colonfound = True
                           Exit For
                        End If
                     Case "\"
                        aj_in_escape = True
                  End Select
               End If
            Next
            if aj_colonfound then
               aj_currentkey = aj_Strip(aj_JSONDecode(aj_currentkey), """")
               If Not level(aj_currentlevel).exists(aj_currentkey) Then level(aj_currentlevel).Add aj_currentkey, ""
            end if
         End If
         If right(aj_line,1) = "{" Or right(aj_line,1) = "[" Then
            If Len(aj_currentkey) = 0 Then aj_currentkey = level(aj_currentlevel).Count
            Set level(aj_currentlevel).Item(aj_currentkey) = Collection()
            Set level(aj_currentlevel + 1) = level(aj_currentlevel).Item(aj_currentkey)
            aj_currentlevel = aj_currentlevel + 1
            aj_currentkey = ""
         ElseIf right(aj_line,1) = "}" Or right(aj_line,1) = "]" or right(aj_line,2) = "}," Or right(aj_line,2) = "]," Then
            aj_currentlevel = aj_currentlevel - 1
         ElseIf Len(Trim(aj_line)) > 0 Then
            if Len(aj_currentvalue) = 0 Then aj_currentvalue = aj_line
            aj_currentvalue = getJSONValue(aj_currentvalue)

            If Len(aj_currentkey) = 0 Then aj_currentkey = level(aj_currentlevel).Count
            level(aj_currentlevel).Item(aj_currentkey) = aj_currentvalue
         End If
      Next
   End Sub

   Public Function Collection()
      set Collection = CreateObject("Scripting.Dictionary")
   End Function

   Public Function AddToCollection(dictobj)
      if TypeName(dictobj) <> "Dictionary" then Err.Raise 1, "AddToCollection Error", "Not a collection."
      aj_newlabel = dictobj.Count
      dictobj.Add aj_newlabel, Collection()
      set AddToCollection = dictobj.item(aj_newlabel)
   end function

   Private Function CleanUpJSONstring(aj_originalstring)
      aj_originalstring = Replace(aj_originalstring, Chr(13) & Chr(10), "")
      aj_originalstring = Mid(aj_originalstring, 2, Len(aj_originalstring) - 2)
      aj_in_string = False : aj_in_escape = False : aj_s_tmp = ""
      For aj_i_tmp = 1 To Len(aj_originalstring)
         aj_char_tmp = Mid(aj_originalstring, aj_i_tmp, 1)
         If aj_in_escape Then
            aj_in_escape = False
            aj_s_tmp = aj_s_tmp & aj_char_tmp
         Else
            Select Case aj_char_tmp
               Case "\" : aj_s_tmp = aj_s_tmp & aj_char_tmp : aj_in_escape = True
               Case """" : aj_s_tmp = aj_s_tmp & aj_char_tmp : aj_in_string = Not aj_in_string
               Case "{", "["
                  aj_s_tmp = aj_s_tmp & aj_char_tmp & aj_InlineIf(aj_in_string, "", Chr(13) & Chr(10))
               Case "}", "]"
                  aj_s_tmp = aj_s_tmp & aj_InlineIf(aj_in_string, "", Chr(13) & Chr(10)) & aj_char_tmp
               Case "," : aj_s_tmp = aj_s_tmp & aj_char_tmp & aj_InlineIf(aj_in_string, "", Chr(13) & Chr(10))
               Case Else : aj_s_tmp = aj_s_tmp & aj_char_tmp
            End Select
         End If
      Next

      CleanUpJSONstring = ""
      aj_s_tmp = split(aj_s_tmp, Chr(13) & Chr(10))
      For Each aj_line_tmp In aj_s_tmp
         aj_line_tmp = replace(replace(aj_line_tmp, chr(10), ""), chr(13), "")
         CleanUpJSONstring = CleanUpJSONstring & aj_Trim(aj_line_tmp) & Chr(13) & Chr(10)
      Next
   End Function

   Private Function getJSONValue(ByVal val)
      val = Trim(val)
      If Left(val,1) = ":"  Then val = Mid(val, 2)
      If Right(val,1) = "," Then val = Left(val, Len(val) - 1)
      val = Trim(val)

      Select Case val
         Case "true"  : getJSONValue = True
         Case "false" : getJSONValue = False
         Case "null" : getJSONValue = Null
         Case Else
            If (Instr(val, """") = 0) Then
               If IsNumeric(val) Then
                  getJSONValue = CDbl(val)
               Else
                  getJSONValue = val
               End If
            Else
               If Left(val,1) = """" Then val = Mid(val, 2)
               If Right(val,1) = """" Then val = Left(val, Len(val) - 1)
               getJSONValue = aj_JSONDecode(Trim(val))
            End If
      End Select
   End Function

   Private JSONoutput_level
   Public Function JSONoutput()
      dim wrap_dicttype, aj_label
      JSONoutput_level = 1
      wrap_dicttype = "[]"
      For Each aj_label In data
          If Not aj_IsInt(aj_label) Then wrap_dicttype = "{}"
      Next
      JSONoutput = Left(wrap_dicttype, 1) & Chr(13) & Chr(10) & GetDict(data) & Right(wrap_dicttype, 1)
   End Function

   Private Function GetDict(objDict)
      dim aj_item, aj_keyvals, aj_label, aj_dicttype
      For Each aj_item In objDict
         Select Case TypeName(objDict.Item(aj_item))
            Case "Dictionary"
               GetDict = GetDict & Space(JSONoutput_level * 4)
               
               aj_dicttype = "[]"
               For Each aj_label In objDict.Item(aj_item).Keys
                   If Not aj_IsInt(aj_label) Then aj_dicttype = "{}"
               Next
               If aj_IsInt(aj_item) Then
                  GetDict = GetDict & (Left(aj_dicttype,1) & Chr(13) & Chr(10))
               Else
                  GetDict = GetDict & ("""" & aj_JSONEncode(aj_item) & """" & ": " & Left(aj_dicttype,1) & Chr(13) & Chr(10))
               End If
               JSONoutput_level = JSONoutput_level + 1
               
               aj_keyvals = objDict.Keys
               GetDict = GetDict & (GetSubDict(objDict.Item(aj_item)) & Space(JSONoutput_level * 4) & Right(aj_dicttype,1) & aj_InlineIf(aj_item = aj_keyvals(objDict.Count - 1),"" , ",") & Chr(13) & Chr(10))
            Case Else
               aj_keyvals =  objDict.Keys
               GetDict = GetDict & (Space(JSONoutput_level * 4) & aj_InlineIf(aj_IsInt(aj_item), "", """" & aj_JSONEncode(aj_item) & """: ") & WriteValue(objDict.Item(aj_item)) & aj_InlineIf(aj_item = aj_keyvals(objDict.Count - 1),"" , ",") & Chr(13) & Chr(10))
         End Select
      Next
   End Function

   Private Function aj_IsInt(val)
      aj_IsInt = (TypeName(val) = "Integer" Or TypeName(val) = "Long")
   End Function

   Private Function GetSubDict(objSubDict)
      GetSubDict = GetDict(objSubDict)
      JSONoutput_level= JSONoutput_level -1
   End Function

   Private Function WriteValue(ByVal val)
      Select Case TypeName(val)
         Case "Double", "Integer", "Long": WriteValue = val
         Case "Null"                  : WriteValue = "null"
         Case "Boolean"               : WriteValue = aj_InlineIf(val, "true", "false")
         Case Else                  : WriteValue = """" & aj_JSONEncode(val) & """"
      End Select
   End Function

   Private Function aj_JSONEncode(ByVal val)
      val = Replace(val, "\", "\\")
      val = Replace(val, """", "\""")
      'val = Replace(val, "/", "\/")
      val = Replace(val, Chr(8), "\b")
      val = Replace(val, Chr(12), "\f")
      val = Replace(val, Chr(10), "\n")
      val = Replace(val, Chr(13), "\r")
      val = Replace(val, Chr(9), "\t")
      aj_JSONEncode = Trim(val)
   End Function

   Private Function aj_JSONDecode(ByVal val)
      val = Replace(val, "\""", """")
      val = Replace(val, "\\", "\")
      val = Replace(val, "\/", "/")
      val = Replace(val, "\b", Chr(8))
      val = Replace(val, "\f", Chr(12))
      val = Replace(val, "\n", Chr(10))
      val = Replace(val, "\r", Chr(13))
      val = Replace(val, "\t", Chr(9))
      aj_JSONDecode = Trim(val)
   End Function

   Private Function aj_InlineIf(condition, returntrue, returnfalse)
      If condition Then aj_InlineIf = returntrue Else aj_InlineIf = returnfalse
   End Function

   Private Function aj_Strip(ByVal val, stripper)
      If Left(val, 1) = stripper Then val = Mid(val, 2)
      If Right(val, 1) = stripper Then val = Left(val, Len(val) - 1)
      aj_Strip = val
   End Function

   Private Function aj_MultilineTrim(TextData)
      aj_MultilineTrim = aj_RegExp.Replace(TextData, "$1")
   End Function

   private function aj_Trim(val)
      aj_Trim = Trim(val)
      Do While Left(aj_Trim, 1) = Chr(9) : aj_Trim = Mid(aj_Trim, 2) : Loop
      Do While Right(aj_Trim, 1) = Chr(9) : aj_Trim = Left(aj_Trim, Len(aj_Trim) - 1) : Loop
      aj_Trim = Trim(aj_Trim)
   end function
End Class
Now only add a nice icon...

Re: afvalwijzer script

Posted: Fri Aug 14, 2015 9:33 am
by raymonvdm
Could u also make it work in HS3 ?

Re: afvalwijzer script

Posted: Fri Aug 14, 2015 12:21 pm
by JoopK
Er zitten maar 2 HS specifieke statements in hs.setdevice value en hs.writelog. Als je even de HS3 syntax opzoekt bouw je het zo om.

Re: afvalwijzer script

Posted: Thu Aug 20, 2015 12:44 pm
by raymonvdm
I have tried but HS3 is not accepting my script skills :D

Re: afvalwijzer script

Posted: Mon Aug 24, 2015 9:42 pm
by JoopK
I checked the HS3 syntax, and it look they remain unchanged, except that the created device should not be refered to as "V17", but by the reference number?

Re: Afvalwijzer script

Posted: Sun Aug 30, 2015 5:14 pm
by Karell
Don't work here on hs3 , get a bunch of errors

Re: Afvalwijzer script

Posted: Sun Sep 13, 2015 10:35 pm
by JoopK
Did you save the code as *.VBS?

Re: Afvalwijzer script

Posted: Thu Sep 17, 2015 1:47 pm
by mrqnapper
Hi, I tried to use the script as well in my Hs3 system but receive this error:

Code: Select all

Running script, script run or compile error in file: C:/Program Files/HomeSeer HS3/scripts/afvalophaalscript.vbs5:Ongeldige procedureaanroep of ongeldig argument: 'hs.setdevicestring' in line 40 More info: Ongeldige procedureaanroep of ongeldig argument: 'hs.setdevicestring'
I have it saved as *.vbs and have used the reference number of the device.

Would be very help-full to get this working since we started recently with waste separation, which brings more days for collecting the different waste types.

Thanks W.

Re: Afvalwijzer script

Posted: Thu Sep 17, 2015 2:19 pm
by raymonvdm
Maybe someone with HS3 scripting experience can take a look?

Re: Afvalwijzer script

Posted: Thu Sep 17, 2015 3:13 pm
by mrqnapper
Good Idea :)

Re: Afvalwijzer script

Posted: Thu Sep 17, 2015 3:41 pm
by stefxx
Als iemand Almere zover krijgt dat die ook zijn data beschikbaar stelt via de afvalwijzer maak ik er wel iets moois van. Misschien wel een plugin :)

Tot die tijd... heb ik genoeg andere klusjes voor mezelf om eerst af te maken :oops:

Re: Afvalwijzer script

Posted: Thu Sep 17, 2015 4:00 pm
by raymonvdm
stefxx wrote:Als iemand Almere zover krijgt dat die ook zijn data beschikbaar stelt via de afvalwijzer maak ik er wel iets moois van. Misschien wel een plugin :)

Tot die tijd... heb ik genoeg andere klusjes voor mezelf om eerst af te maken :oops:

Kunnen we je niet omkopen ?