OH3: iterate through JSON

  • openHABian 3.3.0 on rPi4 with 4GB

I just installed the TR064 binding for my Fritzbox.

I eventually figured how to get the call list.
It can contain multiple calls in one json string; like so:

        [
        {"localNumber":"07520416505","remoteNumber":"0280008663","date":"2022-12-13T18:11:00+10","type":1,"duration":1},
        {"localNumber":"07520416505","remoteNumber":"6444131014","date":"2022-12-08T15:42:00+10","type":2,"duration":0},
        {"localNumber":"07520416505","remoteNumber":"0754212939","date":"2022-12-05T09:58:00+10","type":1,"duration":1},
        {"localNumber":"07520416505","remoteNumber":"0754212939","date":"2022-12-05T09:02:00+10","type":3,"duration":8},
        {"localNumber":"07520416505","remoteNumber":"0754212939","date":"2022-12-05T08:50:00+10","type":3,"duration":1}
        ]

My rule only captures the first call.

rule "Fritzbox: call list 2"
    when
        Item fbox_CallList2 changed
    then
        var String InputString = (fbox_CallList2.state as StringType).toString
        InputString = InputString.replace('[','')
        InputString = InputString.replace(']','')

        val String FBOX_CALL_LIST = InputString

        val String REMOTE_NUMBER = transform("JSONPATH", "$.remoteNumber", FBOX_CALL_LIST)
        val String CALL_TIMESTAMP = transform("JSONPATH", "$.date", FBOX_CALL_LIST)
        val String CALL_TYPE = transform("JSONPATH", "$.type", FBOX_CALL_LIST)

        logInfo(LOG_PREFIX + "00.01", "REMOTE_NUMBER......: {}", REMOTE_NUMBER)
        logInfo(LOG_PREFIX + "00.02", "CALL_TIMESTAMP.....: {}", CALL_TIMESTAMP)

        var String call_type = ""

        switch (CALL_TYPE)
        {
            case "1":
            {
                call_type = "incoming"
            }
            case "2":
            {
                call_type = "missed"
            }
            case "3":
            {
                call_type = "rejected"
            }
            case "4":
            {
                call_type = "outgoing"
            }
        }

        logInfo(LOG_PREFIX + "00.03", "CALL_TYPE..........: {} = {}", CALL_TYPE, call_type)
end

Sometimes there is only one call in the list.

How can iterate through all of these?

Any hints appreciated.

It’s a JSON array.

JSONPATH allows addressing array elements like

"$.[2].remoteNumber"

where [2] is the third element (numbered from 0)

You should be able to get the length (number of array elements) with
“$.length()”
but remember transforms always return strings, so you’d need to parse that into an integer.

1 Like

Thank you for the pointers…

I have changed my rule to this:

rule "Fritzbox: call list 10"
    when
        Item fbox_CallList10 changed
        //Item fbox_CallList10 received update
    then
        var String input_string = (fbox_CallList10.state as StringType).toString
        logInfo(LOG_PREFIX + "02.01", "input_string........: {}", input_string)
        input_string = input_string.replace('[', '')
        input_string = input_string.replace(']', '')

        val json_arr_length = Integer::parseInt(transform("JSONPATH", "$.length()", input_string))
        var i = 0
        logInfo(LOG_PREFIX + "02.02", "json_arr_length.....: {}", json_arr_length)
        logInfo(LOG_PREFIX + "02.03", "i...................: {}", i)

        val String FBOX_CALL_LIST = input_string

        for (i = 0; i < json_arr_length; i++)
        {

            val String REMOTE_NUMBER = transform("JSONPATH", "$.[" + i + "].remoteNumber", FBOX_CALL_LIST)
            val String CALL_TIMESTAMP = transform("JSONPATH", "$.[" + i + "].date", FBOX_CALL_LIST)
            val String CALL_TYPE = transform("JSONPATH", "$.[" + i + "].type", FBOX_CALL_LIST)

            logInfo(LOG_PREFIX + "02.04", "REMOTE_NUMBER......: {}", REMOTE_NUMBER)
            logInfo(LOG_PREFIX + "02.05", "CALL_TIMESTAMP.....: {}", CALL_TIMESTAMP)

            var String call_type = ""

            switch (CALL_TYPE)
            {
                case "1":
                {
                    call_type = "incoming"
                }
                case "2":
                {
                    call_type = "missed"
                }
                case "3":
                {
                    call_type = "rejected"
                }
                case "4":
                {
                    call_type = "outgoing"
                }
            }

            logInfo(LOG_PREFIX + "02.06", "CALL_TYPE..........: {} = {}", CALL_TYPE, call_type)
        }
end

Which somehow does not produce the desired result. It seems like it does dissect the string into elements, but rather lists the whole array.

2022-12-14 07:44:08.287 [INFO ] [hab.core.model.script.Fritzbox.02.02] - json_arr_length.....: 5
2022-12-14 07:44:08.289 [INFO ] [hab.core.model.script.Fritzbox.02.03] - i...................: 0
2022-12-14 07:44:08.296 [INFO ] [hab.core.model.script.Fritzbox.02.04] - REMOTE_NUMBER......: {"localNumber":"07520416505","remoteNumber":"0280008663","date":"2022-12-13T18:11:00+10","type":1,"duration":1},{"localNumber":"07520416505","remoteNumber":"6444131014","date":"2022-12-08T15:42:00+10","type":2,"duration":0},{"localNumber":"07520416505","remoteNumber":"0754241239","date":"2022-12-05T09:58:00+10","type":1,"duration":1},{"localNumber":"07520416505","remoteNumber":"0754241239","date":"2022-12-05T09:02:00+10","type":3,"duration":8},{"localNumber":"07520416505","remoteNumber":"0754241239","date":"2022-12-05T08:50:00+10","type":3,"duration":1}
2022-12-14 07:44:08.297 [INFO ] [hab.core.model.script.Fritzbox.02.05] - CALL_TIMESTAMP.....: {"localNumber":"07520416505","remoteNumber":"0280008663","date":"2022-12-13T18:11:00+10","type":1,"duration":1},{"localNumber":"07520416505","remoteNumber":"6444131014","date":"2022-12-08T15:42:00+10","type":2,"duration":0},{"localNumber":"07520416505","remoteNumber":"0754241239","date":"2022-12-05T09:58:00+10","type":1,"duration":1},{"localNumber":"07520416505","remoteNumber":"0754241239","date":"2022-12-05T09:02:00+10","type":3,"duration":8},{"localNumber":"07520416505","remoteNumber":"0754241239","date":"2022-12-05T08:50:00+10","type":3,"duration":1}
2022-12-14 07:44:08.299 [INFO ] [hab.core.model.script.Fritzbox.02.06] - CALL_TYPE..........: {"localNumber":"07520416505","remoteNumber":"0280008663","date":"2022-12-13T18:11:00+10","type":1,"duration":1},{"localNumber":"07520416505","remoteNumber":"6444131014","date":"2022-12-08T15:42:00+10","type":2,"duration":0},{"localNumber":"07520416505","remoteNumber":"0754241239","date":"2022-12-05T09:58:00+10","type":1,"duration":1},{"localNumber":"07520416505","remoteNumber":"0754241239","date":"2022-12-05T09:02:00+10","type":3,"duration":8},{"localNumber":"07520416505","remoteNumber":"0754241239","date":"2022-12-05T08:50:00+10","type":3,"duration":1} = 
2022-12-14 07:44:08.303 [INFO ] [hab.core.model.script.Fritzbox.02.04] - REMOTE_NUMBER......: {"localNumber":"07520416505","remoteNumber":"0280008663","date":"2022-12-13T18:11:00+10","type":1,"duration":1},{"localNumber":"07520416505","remoteNumber":"6444131014","date":"2022-12-08T15:42:00+10","type":2,"duration":0},{"localNumber":"07520416505","remoteNumber":"0754241239","date":"2022-12-05T09:58:00+10","type":1,"duration":1},{"localNumber":"07520416505","remoteNumber":"0754241239","date":"2022-12-05T09:02:00+10","type":3,"duration":8},{"localNumber":"07520416505","remoteNumber":"0754241239","date":"2022-12-05T08:50:00+10","type":3,"duration":1}
2022-12-14 07:44:08.305 [INFO ] [hab.core.model.script.Fritzbox.02.05] - CALL_TIMESTAMP.....: {"localNumber":"07520416505","remoteNumber":"0280008663","date":"2022-12-13T18:11:00+10","type":1,"duration":1},{"localNumber":"07520416505","remoteNumber":"6444131014","date":"2022-12-08T15:42:00+10","type":2,"duration":0},{"localNumber":"07520416505","remoteNumber":"0754241239","date":"2022-12-05T09:58:00+10","type":1,"duration":1},{"localNumber":"07520416505","remoteNumber":"0754241239","date":"2022-12-05T09:02:00+10","type":3,"duration":8},{"localNumber":"07520416505","remoteNumber":"0754241239","date":"2022-12-05T08:50:00+10","type":3,"duration":1}
2022-12-14 07:44:08.306 [INFO ] [hab.core.model.script.Fritzbox.02.06] - CALL_TYPE..........: {"localNumber":"07520416505","remoteNumber":"0280008663","date":"2022-12-13T18:11:00+10","type":1,"duration":1},{"localNumber":"07520416505","remoteNumber":"6444131014","date":"2022-12-08T15:42:00+10","type":2,"duration":0},{"localNumber":"07520416505","remoteNumber":"0754241239","date":"2022-12-05T09:58:00+10","type":1,"duration":1},{"localNumber":"07520416505","remoteNumber":"0754241239","date":"2022-12-05T09:02:00+10","type":3,"duration":8},{"localNumber":"07520416505","remoteNumber":"0754241239","date":"2022-12-05T08:50:00+10","type":3,"duration":1} = 
2022-12-14 07:44:08.311 [INFO ] [hab.core.model.script.Fritzbox.02.04] - REMOTE_NUMBER......: {"localNumber":"07520416505","remoteNumber":"0280008663","date":"2022-12-13T18:11:00+10","type":1,"duration":1},{"localNumber":"07520416505","remoteNumber":"6444131014","date":"2022-12-08T15:42:00+10","type":2,"duration":0},{"localNumber":"07520416505","remoteNumber":"0754241239","date":"2022-12-05T09:58:00+10","type":1,"duration":1},{"localNumber":"07520416505","remoteNumber":"0754241239","date":"2022-12-05T09:02:00+10","type":3,"duration":8},{"localNumber":"07520416505","remoteNumber":"0754241239","date":"2022-12-05T08:50:00+10","type":3,"duration":1}
2022-12-14 07:44:08.313 [INFO ] [hab.core.model.script.Fritzbox.02.05] - CALL_TIMESTAMP.....: {"localNumber":"07520416505","remoteNumber":"0280008663","date":"2022-12-13T18:11:00+10","type":1,"duration":1},{"localNumber":"07520416505","remoteNumber":"6444131014","date":"2022-12-08T15:42:00+10","type":2,"duration":0},{"localNumber":"07520416505","remoteNumber":"0754241239","date":"2022-12-05T09:58:00+10","type":1,"duration":1},{"localNumber":"07520416505","remoteNumber":"0754241239","date":"2022-12-05T09:02:00+10","type":3,"duration":8},{"localNumber":"07520416505","remoteNumber":"0754241239","date":"2022-12-05T08:50:00+10","type":3,"duration":1}
2022-12-14 07:44:08.314 [INFO ] [hab.core.model.script.Fritzbox.02.06] - CALL_TYPE..........: {"localNumber":"07520416505","remoteNumber":"0280008663","date":"2022-12-13T18:11:00+10","type":1,"duration":1},{"localNumber":"07520416505","remoteNumber":"6444131014","date":"2022-12-08T15:42:00+10","type":2,"duration":0},{"localNumber":"07520416505","remoteNumber":"0754241239","date":"2022-12-05T09:58:00+10","type":1,"duration":1},{"localNumber":"07520416505","remoteNumber":"0754241239","date":"2022-12-05T09:02:00+10","type":3,"duration":8},{"localNumber":"07520416505","remoteNumber":"0754241239","date":"2022-12-05T08:50:00+10","type":3,"duration":1} = 
2022-12-14 07:44:08.319 [INFO ] [hab.core.model.script.Fritzbox.02.04] - REMOTE_NUMBER......: {"localNumber":"07520416505","remoteNumber":"0280008663","date":"2022-12-13T18:11:00+10","type":1,"duration":1},{"localNumber":"07520416505","remoteNumber":"6444131014","date":"2022-12-08T15:42:00+10","type":2,"duration":0},{"localNumber":"07520416505","remoteNumber":"0754241239","date":"2022-12-05T09:58:00+10","type":1,"duration":1},{"localNumber":"07520416505","remoteNumber":"0754241239","date":"2022-12-05T09:02:00+10","type":3,"duration":8},{"localNumber":"07520416505","remoteNumber":"0754241239","date":"2022-12-05T08:50:00+10","type":3,"duration":1}
2022-12-14 07:44:08.320 [INFO ] [hab.core.model.script.Fritzbox.02.05] - CALL_TIMESTAMP.....: {"localNumber":"07520416505","remoteNumber":"0280008663","date":"2022-12-13T18:11:00+10","type":1,"duration":1},{"localNumber":"07520416505","remoteNumber":"6444131014","date":"2022-12-08T15:42:00+10","type":2,"duration":0},{"localNumber":"07520416505","remoteNumber":"0754241239","date":"2022-12-05T09:58:00+10","type":1,"duration":1},{"localNumber":"07520416505","remoteNumber":"0754241239","date":"2022-12-05T09:02:00+10","type":3,"duration":8},{"localNumber":"07520416505","remoteNumber":"0754241239","date":"2022-12-05T08:50:00+10","type":3,"duration":1}
2022-12-14 07:44:08.321 [INFO ] [hab.core.model.script.Fritzbox.02.06] - CALL_TYPE..........: {"localNumber":"07520416505","remoteNumber":"0280008663","date":"2022-12-13T18:11:00+10","type":1,"duration":1},{"localNumber":"07520416505","remoteNumber":"6444131014","date":"2022-12-08T15:42:00+10","type":2,"duration":0},{"localNumber":"07520416505","remoteNumber":"0754241239","date":"2022-12-05T09:58:00+10","type":1,"duration":1},{"localNumber":"07520416505","remoteNumber":"0754241239","date":"2022-12-05T09:02:00+10","type":3,"duration":8},{"localNumber":"07520416505","remoteNumber":"0754241239","date":"2022-12-05T08:50:00+10","type":3,"duration":1} = 
2022-12-14 07:44:08.327 [INFO ] [hab.core.model.script.Fritzbox.02.04] - REMOTE_NUMBER......: {"localNumber":"07520416505","remoteNumber":"0280008663","date":"2022-12-13T18:11:00+10","type":1,"duration":1},{"localNumber":"07520416505","remoteNumber":"6444131014","date":"2022-12-08T15:42:00+10","type":2,"duration":0},{"localNumber":"07520416505","remoteNumber":"0754241239","date":"2022-12-05T09:58:00+10","type":1,"duration":1},{"localNumber":"07520416505","remoteNumber":"0754241239","date":"2022-12-05T09:02:00+10","type":3,"duration":8},{"localNumber":"07520416505","remoteNumber":"0754241239","date":"2022-12-05T08:50:00+10","type":3,"duration":1}
2022-12-14 07:44:08.328 [INFO ] [hab.core.model.script.Fritzbox.02.05] - CALL_TIMESTAMP.....: {"localNumber":"07520416505","remoteNumber":"0280008663","date":"2022-12-13T18:11:00+10","type":1,"duration":1},{"localNumber":"07520416505","remoteNumber":"6444131014","date":"2022-12-08T15:42:00+10","type":2,"duration":0},{"localNumber":"07520416505","remoteNumber":"0754241239","date":"2022-12-05T09:58:00+10","type":1,"duration":1},{"localNumber":"07520416505","remoteNumber":"0754241239","date":"2022-12-05T09:02:00+10","type":3,"duration":8},{"localNumber":"07520416505","remoteNumber":"0754241239","date":"2022-12-05T08:50:00+10","type":3,"duration":1}
2022-12-14 07:44:08.329 [INFO ] [hab.core.model.script.Fritzbox.02.06] - CALL_TYPE..........: {"localNumber":"07520416505","remoteNumber":"0280008663","date":"2022-12-13T18:11:00+10","type":1,"duration":1},{"localNumber":"07520416505","remoteNumber":"6444131014","date":"2022-12-08T15:42:00+10","type":2,"duration":0},{"localNumber":"07520416505","remoteNumber":"0754241239","date":"2022-12-05T09:58:00+10","type":1,"duration":1},{"localNumber":"07520416505","remoteNumber":"0754241239","date":"2022-12-05T09:02:00+10","type":3,"duration":8},{"localNumber":"07520416505","remoteNumber":"0754241239","date":"2022-12-05T08:50:00+10","type":3,"duration":1} = 

I have tried the following variation:

  1. did not remove the [] form the input_string
  2. transform("JSONPATH", "$.[" + i + "].remoteNumber", FBOX_CALL_LIST)
  3. transform("JSONPATH", "$.[i].remoteNumber", FBOX_CALL_LIST)

All three lead to the same result.
What am I missing?


[update]

Well, the [] have to stay AND the element has to be extracted like so: "$.[" + i + "].remoteNumber".

Solved! works. :slight_smile: Thank you!