[SOLVED] Jython filter, lambda, group: return a list of item names

Hello,
the following code does not provide the desired result:

listOfMembers = filter(lambda item: item.state == OnOffType.OFF, ir.getItem("gSysBatteryState").members) 
LOG.info(listOfMembers)

the result is as follows:

2020-03-04 17:43:11.106 [INFO ] [jsr223.jython.TEST                           ] - [LaCrosseTemperatureSensor1 (Type=SwitchItem, State=OFF, Label=Sensor 1 Batteriestand, Category=statusbattery, Groups=[gSysBatteryState]), LaCrosseTemperatureSensor2 (Type=SwitchItem, State=OFF, Label=Sensor 2 Batteriestand, Category=statusbattery, Groups=[gSysBatteryState]), LaCrosseTemperatureSensor3 (Type=SwitchItem, State=OFF, Label=Sensor 3 Batteriestand, Category=statusbattery, Groups=[gSysBatteryState]), LaCrosseTemperatureSensor4 (Type=SwitchItem, State=OFF, Label=Sensor 4 Batteriestand, Category=statusbattery, Groups=[gSysBatteryState]), LaCrosseTemperatureSensor5 (Type=SwitchItem, State=OFF, Label=Sensor 5 Batteriestand, Category=statusbattery, Groups=[gSysBatteryState]), LaCrosseTemperatureSensor6 (Type=SwitchItem, State=OFF, Label=Sensor 6 Batteriestand, Category=statusbattery, Groups=[gSysBatteryState]), LaCrosseTemperatureSensor7 (Type=SwitchItem, State=OFF, Label=Sensor 7 Batteriestand, Category=statusbattery, Groups=[gSysBatteryState]), LaCrosseTemperatureSensor8 (Type=SwitchItem, State=OFF, Label=Sensor 8 Batteriestand, Category=statusbattery, Groups=[gSysBatteryState])]

what i need:

LaCrosseTemperatureSensor1, LaCrosseTemperatureSensor2, LaCrosseTemperatureSensor3, LaCrosseTemperatureSensor4, LaCrosseTemperatureSensor5, LaCrosseTemperatureSensor6, LaCrosseTemperatureSensor7, LaCrosseTemperatureSensor8

how do I change the jython code to get the desired result?
Thank you!
OH 2.5.3

What is the desired result? All Items in gSysBatteryState with a state of OFF? That is what your code is currently doing. You could also use a list comprehension…

listOfMembers = [item for item in ir.getItem("gSysBatteryState").members if item.state == OnOffType.OFF]

Yes, exactly, only the item names

Oh… for the names use…

listOfMembers = [item.name for item in ir.getItem("gSysBatteryState").members if item.state == OFF]

(Actually, you don’t need to specify OnOffType, since OFF is in scope)

You can also do it with a map and another lambda, but list comprehensions are much cleaner…

listOfMembers = map(lambda item: item.name, filter(lambda item: item.state == OFF, ir.getItem("gSysBatteryState").members))

Thank you! :+1:

with

listOfMembers = [item.name for item in ir.getItem("gSysBatteryState").members if item.state == OFF]
LOG.info(listOfMembers)

the result is:

2020-03-04 18:53:26.760 [INFO ] [jsr223.jython.TEST                          ] - [u'LaCrosseTemperatureSensor1', u'LaCrosseTemperatureSensor2', u'LaCrosseTemperatureSensor3', u'LaCrosseTemperatureSensor4', u'LaCrosseTemperatureSensor5', u'LaCrosseTemperatureSensor6', u'LaCrosseTemperatureSensor7', u'LaCrosseTemperatureSensor8']

one question, what’s the little “u” in front of each item name?

Edit: hah, unicode! :grinning:

1 Like

hi again,

another problem has come up.
I would like to receive a list of sensors that are above a certain temperature.

The following code unfortunately returns ALL members of the group:

listOfMembers = [item.name for item in ir.getItem("gTemperatureFireAlarm").members if item.state > 25]

The picture shows all group members:
image

I have then tried the following, unfortunately i get an error message here

listOfMembers = [item.name for item in ir.getItem("gTemperatureFireAlarm").members if (float(item.state.toString()) > 25)]
2020-03-05 10:32:18.929 [ERROR] [jsr223.jython.virt Feueralarm                     ] - Traceback (most recent call last):
  File "/etc/openhab2/automation/lib/python/core/log.py", line 51, in wrapper
    return fn(*args, **kwargs)
  File "<script>", line 35, in virt_firealarm
ValueError: invalid literal for float: 21.4 \xb0C

Thanks for your help

For a DecimalType…

listOfMembers = [item.name for item in ir.getItem("gTemperatureFireAlarm").members if item.state > DecimalType(25)]

For a QuantityType and a temperature in Celcius…

listOfMembers = [item.name for item in ir.getItem("gTemperatureFireAlarm").members if item.state > QuantityType(u"25 °C")]

These are documented here…
https://openhab-scripters.github.io/openhab-helper-libraries/Guides/But%20How%20Do%20I.html#convert-a-value-to-a-state-for-comparison

1 Like

Works great! :+1:
Thanks a lot, without people like you it would be hard for me to port my rules from dsl to jython!

1 Like