[SOLVED] Vscode displays problem but rule works

My rule works without problems, but in vscode a problem is showed.

Problems showed in vscode

Type mismatch: cannot convert from element type String to Number
Type mismatch: cannot convert from String[] to Iterable<? extends Number> | Number[]

this is the relevant part of my rule

        val vArraySelected = husqvarnaMowerArraySelected.split("},")
        var googleCoordinatesSelected=""

        logInfo("DEBUG","vArraySelected: " + vArraySelected.toString)

        for (Number i: vArraySelected) {
            var String vCoordinateSelected = transform("JSONPATH", "$.state", i + "}")
            googleCoordinatesSelected = googleCoordinatesSelected + '{"lat": ' + vCoordinateSelected.replace(',',', "lng": ') + '},'
        }
        // remove last comma & store to item
        googleCoordinatesSelected = transform("REGEX", "(.*)\\,", googleCoordinatesSelected)
        HusqvarnaMowerMapArraySelected.postUpdate("[" + googleCoordinatesSelected + "]")

        logInfo("DEBUG","googleCoordinatesSelected: " + googleCoordinatesSelected.toString)
        logInfo("DEBUG","HusqvarnaMowerMapArraySelected: " + HusqvarnaMowerMapArraySelected.state.toString)

the problem point to this line (vArraySelected is underlined):

for (Number i: vArraySelected) {

the output in openhab.log:

2019-12-22 12:52:48.171 [INFO ] [eclipse.smarthome.model.script.DEBUG] - vArraySelected: [{"time":1572649200364,"state":"47.61338833333333,8.731683333333333", {"time":1572695790379,"state":"47.613415,8.731713333333333", {"time":1572695830364,"state":"47.613385,8.731688333333333", {"time":1572695950388,"state":"47.613395,8.731716666666667"]
2019-12-22 12:52:48.175 [INFO ] [eclipse.smarthome.model.script.DEBUG] - googleCoordinatesSelected: {"lat": 47.61338833333333, "lng": 8.731683333333333},{"lat": 47.613415, "lng": 8.731713333333333},{"lat": 47.613385, "lng": 8.731688333333333},{"lat": 47.613395, "lng": 8.731716666666667}
2019-12-22 12:52:48.178 [INFO ] [eclipse.smarthome.model.script.DEBUG] - HusqvarnaMowerMapArraySelected: [{"lat": 47.61338833333333, "lng": 8.731683333333333},{"lat": 47.613415, "lng": 8.731713333333333},{"lat": 47.613385, "lng": 8.731688333333333},{"lat": 47.613395, "lng": 8.731716666666667}]

Change to this:

        val Number vArraySelected = husqvarnaMowerArraySelected.split("},")

If you specify the type mof the variable the openHAB and hence VSCode, don’t have to guess

The problems are not gone that way.

val Number vArraySelected = husqvarnaMowerArraySelected.split("},")

Results in (for “husqvarnaMowerArraySelected.split(”},")"):

Type mismatch: cannot convert from String[] to Number

And:

for (Number i: vArraySelected) {

results in (for “vArraySelected”):

Type mismatch: cannot convert from Number to Iterable<? extends Number> | Number[]

Here is the complete rule, perhaps the issue is somwhere else:

// Husqvarna_Status
rule "Husqvarna Map Display"
when 
    Item HusqvarnaMowerMapDate changed or
    Item Husqvarna_PositionMowingString changed or
    Item Husqvarna_Position changed
then

    if (HusqvarnaMowerMapDate.toString.contains("TODAY")) {
        var String timeRangeEnd = now.toString("yyyy-MM-dd'T'HH:mm:ss.SSS").replace(":","%3A")
        var String timeRangeStart = now.toString("yyyy-MM-dd'T'" + "00:00:00.000").replace(":","%3A")

        // call REST API to get the JSON object for today
        var String mowerArraySelected = sendHttpGetRequest("http://127.0.0.1:8082/rest/persistence/items/Husqvarna_PositionMowingString?starttime=" + timeRangeStart + "&endtime=" + timeRangeEnd)
        var String husqvarnaMowerArraySelected = transform("REGEX", ".*\\[(.*)\\].*", mowerArraySelected)

        husqvarnaMowerArraySelected = transform("REGEX", "(.*)\\}", husqvarnaMowerArraySelected)
        val vArraySelected = husqvarnaMowerArraySelected.split("},")
        var googleCoordinatesSelected=""

        logInfo("DEBUG","vArraySelected: " + vArraySelected.toString)

        for (Number i: vArraySelected) {
            var String vCoordinateSelected = transform("JSONPATH", "$.state", i + "}")
            googleCoordinatesSelected = googleCoordinatesSelected + '{"lat": ' + vCoordinateSelected.replace(',',', "lng": ') + '},'
        }
        // remove last comma & store to item
        googleCoordinatesSelected = transform("REGEX", "(.*)\\,", googleCoordinatesSelected)
        HusqvarnaMowerMapArraySelected.postUpdate("[" + googleCoordinatesSelected + "]")

        logInfo("DEBUG","googleCoordinatesSelected: " + googleCoordinatesSelected.toString)
        logInfo("DEBUG","HusqvarnaMowerMapArraySelected: " + HusqvarnaMowerMapArraySelected.state.toString)

    }

    if (HusqvarnaMowerMapDate.toString.contains("YESTERDAY")) {
        var String timeRangeEnd = now.minusDays(1).toString("yyyy-MM-dd'T'" + "23:59:59.999").replace(":","%3A")
        var String timeRangeStart = now.minusDays(1).toString("yyyy-MM-dd'T'" + "00:00:00.000").replace(":","%3A")

        // call REST API to get the JSON object for yesterday
        var String mowerArraySelected = sendHttpGetRequest("http://127.0.0.1:8082/rest/persistence/items/Husqvarna_PositionMowingString?starttime=" + timeRangeStart + "&endtime=" + timeRangeEnd)
        var String husqvarnaMowerArraySelected = transform("REGEX", ".*\\[(.*)\\].*", mowerArraySelected)

        husqvarnaMowerArraySelected = transform("REGEX", "(.*)\\}", husqvarnaMowerArraySelected)
        val vArraySelected = husqvarnaMowerArraySelected.split("},")
        var googleCoordinatesSelected=""

        logInfo("DEBUG","vArraySelected: " + vArraySelected.toString)

        for (Number i: vArraySelected) {
            var String vCoordinateSelected = transform("JSONPATH", "$.state", i + "}")
            googleCoordinatesSelected = googleCoordinatesSelected + '{"lat": ' + vCoordinateSelected.replace(',',', "lng": ') + '},'
        }
        // remove last comma & store to item
        googleCoordinatesSelected = transform("REGEX", "(.*)\\,", googleCoordinatesSelected)
        HusqvarnaMowerMapArraySelected.postUpdate("[" + googleCoordinatesSelected + "]")

        logInfo("DEBUG","googleCoordinatesSelected: " + googleCoordinatesSelected.toString)
        logInfo("DEBUG","HusqvarnaMowerMapArraySelected: " + HusqvarnaMowerMapArraySelected.state.toString)

    }

    if (HusqvarnaMowerMapDate.toString.contains("2DAYSAGO")) {
        var String timeRangeEnd = now.minusDays(2).toString("yyyy-MM-dd'T'" + "23:59:59.999").replace(":","%3A")
        var String timeRangeStart = now.minusDays(2).toString("yyyy-MM-dd'T'" + "00:00:00.000").replace(":","%3A")

        // call REST API to get the JSON object for day before yesterday
        var String mowerArraySelected = sendHttpGetRequest("http://127.0.0.1:8082/rest/persistence/items/Husqvarna_PositionMowingString?starttime=" + timeRangeStart + "&endtime=" + timeRangeEnd)
        var String husqvarnaMowerArraySelected = transform("REGEX", ".*\\[(.*)\\].*", mowerArraySelected)

        husqvarnaMowerArraySelected = transform("REGEX", "(.*)\\}", husqvarnaMowerArraySelected)
        val vArraySelected = husqvarnaMowerArraySelected.split("},")
        var googleCoordinatesSelected=""

        for (Number i: vArraySelected) {
            var String vCoordinateSelected = transform("JSONPATH", "$.state", i + "}")
            googleCoordinatesSelected = googleCoordinatesSelected + '{"lat": ' + vCoordinateSelected.replace(',',', "lng": ') + '},'
        }
        // remove last comma & store to item
        googleCoordinatesSelected = transform("REGEX", "(.*)\\,", googleCoordinatesSelected)
        HusqvarnaMowerMapArraySelected.postUpdate("[" + googleCoordinatesSelected + "]")
    }
    if (HusqvarnaMowerMapDate.toString.contains("3DAYSAGO")) {
        var String timeRangeEnd = now.minusDays(3).toString("yyyy-MM-dd'T'" + "23:59:59.999").replace(":","%3A")
        var String timeRangeStart = now.minusDays(3).toString("yyyy-MM-dd'T'" + "00:00:00.000").replace(":","%3A")

        // call REST API to get the JSON object for three days ago
        var String mowerArraySelected = sendHttpGetRequest("http://127.0.0.1:8082/rest/persistence/items/Husqvarna_PositionMowingString?starttime=" + timeRangeStart + "&endtime=" + timeRangeEnd)
        var String husqvarnaMowerArraySelected = transform("REGEX", ".*\\[(.*)\\].*", mowerArraySelected)

        husqvarnaMowerArraySelected = transform("REGEX", "(.*)\\}", husqvarnaMowerArraySelected)
        val vArraySelected = husqvarnaMowerArraySelected.split("},")
        var googleCoordinatesSelected=""

        for (Number i: vArraySelected) {
            var String vCoordinateSelected = transform("JSONPATH", "$.state", i + "}")
            googleCoordinatesSelected = googleCoordinatesSelected + '{"lat": ' + vCoordinateSelected.replace(',',', "lng": ') + '},'
        }
        // remove last comma & store to item
        googleCoordinatesSelected = transform("REGEX", "(.*)\\,", googleCoordinatesSelected)
        HusqvarnaMowerMapArraySelected.postUpdate("[" + googleCoordinatesSelected + "]")
    }
    if (HusqvarnaMowerMapDate.toString.contains("4DAYSAGO")) {
        var String timeRangeEnd = now.minusDays(4).toString("yyyy-MM-dd'T'" + "23:59:59.999").replace(":","%3A")
        var String timeRangeStart = now.minusDays(4).toString("yyyy-MM-dd'T'" + "00:00:00.000").replace(":","%3A")

        // call REST API to get the JSON object for 4 days ago
        var String mowerArraySelected = sendHttpGetRequest("http://127.0.0.1:8082/rest/persistence/items/Husqvarna_PositionMowingString?starttime=" + timeRangeStart + "&endtime=" + timeRangeEnd)
        var String husqvarnaMowerArraySelected = transform("REGEX", ".*\\[(.*)\\].*", mowerArraySelected)

        husqvarnaMowerArraySelected = transform("REGEX", "(.*)\\}", husqvarnaMowerArraySelected)
        val vArraySelected = husqvarnaMowerArraySelected.split("},")
        var googleCoordinatesSelected=""

        for (Number i: vArraySelected) {
            var String vCoordinateSelected = transform("JSONPATH", "$.state", i + "}")
            googleCoordinatesSelected = googleCoordinatesSelected + '{"lat": ' + vCoordinateSelected.replace(',',', "lng": ') + '},'
        }
        // remove last comma & store to item
        googleCoordinatesSelected = transform("REGEX", "(.*)\\,", googleCoordinatesSelected)
        HusqvarnaMowerMapArraySelected.postUpdate("[" + googleCoordinatesSelected + "]")
    }

    if (HusqvarnaMowerMapDate.toString.contains("LASTWEEK")) {
        var String timeRangeEnd = now.toString("yyyy-MM-dd'T'HH:mm:ss.SSS").replace(":","%3A")
        var String timeRangeStart = now.minusDays(7).toString("yyyy-MM-dd'T'HH:mm:ss.SSS").replace(":","%3A")
    
        // call REST API to get the JSON object for last 7 days
        var String mowerArraySelected = sendHttpGetRequest("http://127.0.0.1:8082/rest/persistence/items/Husqvarna_PositionMowingString?starttime=" + timeRangeStart + "&endtime=" + timeRangeEnd)
        var String husqvarnaMowerArraySelected = transform("REGEX", ".*\\[(.*)\\].*", mowerArraySelected)

        husqvarnaMowerArraySelected = transform("REGEX", "(.*)\\}", husqvarnaMowerArraySelected)
        val vArraySelected = husqvarnaMowerArraySelected.split("},")
        var googleCoordinatesSelected=""

        for (Number i: vArraySelected) {
            var String vCoordinateSelected = transform("JSONPATH", "$.state", i + "}")
            googleCoordinatesSelected = googleCoordinatesSelected + '{"lat": ' + vCoordinateSelected.replace(',',', "lng": ') + '},'
        }
        // remove last comma & store to item
        googleCoordinatesSelected = transform("REGEX", "(.*)\\,", googleCoordinatesSelected)
        HusqvarnaMowerMapArraySelected.postUpdate("[" + googleCoordinatesSelected + "]")
    }
    // update URL to let habPanel refresh
    postUpdate(HusqvarnaMowerMapUrl, "../static/mowermapEmpty.html")
    Thread::sleep(100)
    postUpdate(HusqvarnaMowerMapUrl, "../static/mowermap.html")
end

I found the solution. Documented here, perhaps it helps someone …

problem was the faulty defined FOR loop
wrong:

for (Number i: vArraySelected) {

correct, as I loop through a string array:

for (String i: vArraySelected) {

complete rule:

// Husqvarna_Status
rule "Husqvarna Map Display"
when 
    Item HusqvarnaMowerMapDate changed or
    Item Husqvarna_PositionMowingString changed or
    Item Husqvarna_Position changed
then
    if (HusqvarnaMowerMapDate.toString.contains("TODAY")) {
        var String timeRangeEnd = now.toString("yyyy-MM-dd'T'HH:mm:ss.SSS").replace(":","%3A")
        var String timeRangeStart = now.toString("yyyy-MM-dd'T'" + "00:00:00.000").replace(":","%3A")

        // call REST API to get the JSON object for today
        var String mowerArraySelected = sendHttpGetRequest("http://127.0.0.1:8082/rest/persistence/items/Husqvarna_PositionMowingString?starttime=" + timeRangeStart + "&endtime=" + timeRangeEnd)
        var String husqvarnaMowerArraySelected = transform("REGEX", ".*\\[(.*)\\].*", mowerArraySelected)

        husqvarnaMowerArraySelected = transform("REGEX", "(.*)\\}", husqvarnaMowerArraySelected)
        val vArraySelected = husqvarnaMowerArraySelected.split("},")
        var googleCoordinatesSelected=""

        for (String i: vArraySelected) {
            var String vCoordinateSelected = transform("JSONPATH", "$.state", i + "}")
            googleCoordinatesSelected = googleCoordinatesSelected + '{"lat": ' + vCoordinateSelected.replace(',',', "lng": ') + '},'
        }
        // remove last comma & store to item
        googleCoordinatesSelected = transform("REGEX", "(.*)\\,", googleCoordinatesSelected)
        HusqvarnaMowerMapArraySelected.postUpdate("[" + googleCoordinatesSelected + "]")
    }
    if (HusqvarnaMowerMapDate.toString.contains("YESTERDAY")) {
        var String timeRangeEnd = now.minusDays(1).toString("yyyy-MM-dd'T'" + "23:59:59.999").replace(":","%3A")
        var String timeRangeStart = now.minusDays(1).toString("yyyy-MM-dd'T'" + "00:00:00.000").replace(":","%3A")

        // call REST API to get the JSON object for yesterday
        var String mowerArraySelected = sendHttpGetRequest("http://127.0.0.1:8082/rest/persistence/items/Husqvarna_PositionMowingString?starttime=" + timeRangeStart + "&endtime=" + timeRangeEnd)
        var String husqvarnaMowerArraySelected = transform("REGEX", ".*\\[(.*)\\].*", mowerArraySelected)

        husqvarnaMowerArraySelected = transform("REGEX", "(.*)\\}", husqvarnaMowerArraySelected)
        val vArraySelected = husqvarnaMowerArraySelected.split("},")
        var googleCoordinatesSelected=""

        for (String i: vArraySelected) {
            var String vCoordinateSelected = transform("JSONPATH", "$.state", i + "}")
            googleCoordinatesSelected = googleCoordinatesSelected + '{"lat": ' + vCoordinateSelected.replace(',',', "lng": ') + '},'
        }
        // remove last comma & store to item
        googleCoordinatesSelected = transform("REGEX", "(.*)\\,", googleCoordinatesSelected)
        HusqvarnaMowerMapArraySelected.postUpdate("[" + googleCoordinatesSelected + "]")
    }
    if (HusqvarnaMowerMapDate.toString.contains("2DAYSAGO")) {
        var String timeRangeEnd = now.minusDays(2).toString("yyyy-MM-dd'T'" + "23:59:59.999").replace(":","%3A")
        var String timeRangeStart = now.minusDays(2).toString("yyyy-MM-dd'T'" + "00:00:00.000").replace(":","%3A")

        // call REST API to get the JSON object for 2 days ago
        var String mowerArraySelected = sendHttpGetRequest("http://127.0.0.1:8082/rest/persistence/items/Husqvarna_PositionMowingString?starttime=" + timeRangeStart + "&endtime=" + timeRangeEnd)
        var String husqvarnaMowerArraySelected = transform("REGEX", ".*\\[(.*)\\].*", mowerArraySelected)

        husqvarnaMowerArraySelected = transform("REGEX", "(.*)\\}", husqvarnaMowerArraySelected)
        val vArraySelected = husqvarnaMowerArraySelected.split("},")
        var googleCoordinatesSelected=""

        for (String i: vArraySelected) {
            var String vCoordinateSelected = transform("JSONPATH", "$.state", i + "}")
            googleCoordinatesSelected = googleCoordinatesSelected + '{"lat": ' + vCoordinateSelected.replace(',',', "lng": ') + '},'
        }
        // remove last comma & store to item
        googleCoordinatesSelected = transform("REGEX", "(.*)\\,", googleCoordinatesSelected)
        HusqvarnaMowerMapArraySelected.postUpdate("[" + googleCoordinatesSelected + "]")
    }
    if (HusqvarnaMowerMapDate.toString.contains("3DAYSAGO")) {
        var String timeRangeEnd = now.minusDays(3).toString("yyyy-MM-dd'T'" + "23:59:59.999").replace(":","%3A")
        var String timeRangeStart = now.minusDays(3).toString("yyyy-MM-dd'T'" + "00:00:00.000").replace(":","%3A")

        // call REST API to get the JSON object for 3 days ago
        var String mowerArraySelected = sendHttpGetRequest("http://127.0.0.1:8082/rest/persistence/items/Husqvarna_PositionMowingString?starttime=" + timeRangeStart + "&endtime=" + timeRangeEnd)
        var String husqvarnaMowerArraySelected = transform("REGEX", ".*\\[(.*)\\].*", mowerArraySelected)

        husqvarnaMowerArraySelected = transform("REGEX", "(.*)\\}", husqvarnaMowerArraySelected)
        val vArraySelected = husqvarnaMowerArraySelected.split("},")
        var googleCoordinatesSelected=""

        for (String i: vArraySelected) {
            var String vCoordinateSelected = transform("JSONPATH", "$.state", i + "}")
            googleCoordinatesSelected = googleCoordinatesSelected + '{"lat": ' + vCoordinateSelected.replace(',',', "lng": ') + '},'
        }
        // remove last comma & store to item
        googleCoordinatesSelected = transform("REGEX", "(.*)\\,", googleCoordinatesSelected)
        HusqvarnaMowerMapArraySelected.postUpdate("[" + googleCoordinatesSelected + "]")
    }
    if (HusqvarnaMowerMapDate.toString.contains("4DAYSAGO")) {
        var String timeRangeEnd = now.minusDays(4).toString("yyyy-MM-dd'T'" + "23:59:59.999").replace(":","%3A")
        var String timeRangeStart = now.minusDays(4).toString("yyyy-MM-dd'T'" + "00:00:00.000").replace(":","%3A")

        // call REST API to get the JSON object for 4 days ago
        var String mowerArraySelected = sendHttpGetRequest("http://127.0.0.1:8082/rest/persistence/items/Husqvarna_PositionMowingString?starttime=" + timeRangeStart + "&endtime=" + timeRangeEnd)
        var String husqvarnaMowerArraySelected = transform("REGEX", ".*\\[(.*)\\].*", mowerArraySelected)

        husqvarnaMowerArraySelected = transform("REGEX", "(.*)\\}", husqvarnaMowerArraySelected)
        val vArraySelected = husqvarnaMowerArraySelected.split("},")
        var googleCoordinatesSelected=""

        for (String i: vArraySelected) {
            var String vCoordinateSelected = transform("JSONPATH", "$.state", i + "}")
            googleCoordinatesSelected = googleCoordinatesSelected + '{"lat": ' + vCoordinateSelected.replace(',',', "lng": ') + '},'
        }
        // remove last comma & store to item
        googleCoordinatesSelected = transform("REGEX", "(.*)\\,", googleCoordinatesSelected)
        HusqvarnaMowerMapArraySelected.postUpdate("[" + googleCoordinatesSelected + "]")
    }
    if (HusqvarnaMowerMapDate.toString.contains("LASTWEEK")) {
        var String timeRangeEnd = now.toString("yyyy-MM-dd'T'HH:mm:ss.SSS").replace(":","%3A")
        var String timeRangeStart = now.minusDays(7).toString("yyyy-MM-dd'T'HH:mm:ss.SSS").replace(":","%3A")
    
        // call REST API to get the JSON object for last 7 days
        var String mowerArraySelected = sendHttpGetRequest("http://127.0.0.1:8082/rest/persistence/items/Husqvarna_PositionMowingString?starttime=" + timeRangeStart + "&endtime=" + timeRangeEnd)
        var String husqvarnaMowerArraySelected = transform("REGEX", ".*\\[(.*)\\].*", mowerArraySelected)

        husqvarnaMowerArraySelected = transform("REGEX", "(.*)\\}", husqvarnaMowerArraySelected)
        val vArraySelected = husqvarnaMowerArraySelected.split("},")
        var googleCoordinatesSelected=""

        for (String i: vArraySelected) {
            var String vCoordinateSelected = transform("JSONPATH", "$.state", i + "}")
            googleCoordinatesSelected = googleCoordinatesSelected + '{"lat": ' + vCoordinateSelected.replace(',',', "lng": ') + '},'
        }
        // remove last comma & store to item
        googleCoordinatesSelected = transform("REGEX", "(.*)\\,", googleCoordinatesSelected)
        HusqvarnaMowerMapArraySelected.postUpdate("[" + googleCoordinatesSelected + "]")
    }
    // update URL to let habPanel refresh
    postUpdate(HusqvarnaMowerMapUrl, "../static/mowermapEmpty.html")
    Thread::sleep(100)
    postUpdate(HusqvarnaMowerMapUrl, "../static/mowermap.html")
end