New to Rules and having issues, simple temp rule

Hello everyone -I’m new to rules outside Paper UI. I recently setup my sitemaps although I have no items because I haven’t added anything new. I was able to set my home.sitemap up using the location of the PaperUI item with no issues. Now I’m trying to make a rule to trigger based off outside temp. I can see the rule go through with no errors on the log file. But I dont see an actual change in the item I’m attempting to change. I’m running openhabian on a pi3. I’ve dumb’d down the rule a bit just to see what makes it tick, then I’ll build it up some. Here is what I have so far:

rule "MasterBedRoomAC"
when
    Item LocalWeather_Current_ changed
then
        if (LocalWeather_Current_.state <= 88) {
        FrontRoomSmartEnergySwitch_Switch.sendCommand(OFF)
        }
end

What am I missing? I’ve tried rearranging it every which way with no luck. Thanks in advance.

I could be wrong, but I don’t think you can end the name of an item with an underscore. Everything else in the rule looks good. Another thing to try is to add a log entry after the triggers, so that you know that the rule actually gets triggered. Something like…

logDebug("Rules","MasterBedroomAC: rule started: LocalWeather_Current_.state=[{}]",LocalWeather_Current_.state.toString)

I’ve taken off the underscore, item was added through PaperUi not sure why it did that. I couldn’t find where to modify the string name in json so I just deleted the item and remade it. Now its LocalWeather_Current. Also added the debut log, waiting for it to come around to see what it says.

Let us know if Scott’s suggestion fixes it. The code looks correct otherwise so it might take some digging to figure it out.

nope didn’t fix it, I can see the rule trigger in logs and it shows the temp number it triggered on. The same item (frontroomsmartenergyswitch) is controllable from basic ui. Not sure what im missing. I might change the rule to trigger from say bathroom switch change so i can do more testing vs waiting for temp change.

Add logging to the Rule both inside and outside the if statement.

Log out the value of LocalWeather_Current.state.

Watch events.log and see if FrontRoomSmartEnergySwitch_Switch is receiving the OFF command.

Alittle confused right now, so I changed it up some to see what changes what. I did this rule:

This turns off my bathroom switch if I turn on/off my wood furnace blower. Name of xxxx.sendCommand(OFF) does absolutely nothing. It can be test.sendCommand(OFF) and bathroom still turns off. If I remove line 6 then nothing happens. What am I missing here?

rule "MasterBedRoomAC"
when
    Item WoodFurnaceBlower_Switch changed
then
        if (Bathroom_Switch.state = OFF) {
       FrontRoomSmartEnergySwitch_Switch.sendCommand(OFF)
        }
end```

If I try something like this, then the WoodFurnaceSwitch gets lost and goes back and forth between on/off.

rule "MasterBedRoomAC"
when
    Item WoodFurnaceBlower_Switch changed 
    then
		if(WoodFurnaceBlower_Switch.state = ON) {
		FrontRoomSmartEnergySwitch_Switch.sendCommand(ON)
		}
	else if(WoodFurnaceBlower_Switch.state = OFF) { 
		FrontRoomSmartEnergySwitch_Switch.sendCommand(OFF)
		}
end

Add logging to the Rule both inside and outside the if statement.

Log out the value of all relevant Items.

Watch events.log and see if all updates and commands are occurring.

Not sure if I have my rule correct for logging, fairly new to this all. I did the following which gave this log info out:


rule "Master Bedroom AC"
when
        Item WoodFurnaceBlower_Switch received command
then
                logDebug("Rules","MasterBedroomAC: rule started: WoodFurnaceBlower_Switch.state=[{}]",WoodFurnaceBlower_Switch.state.toString)
        if (WoodFurnaceBlower_Switch.state = ON) {
                logInfo(name, "Masterbedroom AC ON")
                FrontRoomSmartEnergySwitch_Switch.sendCommand(ON)
        }
        if (WoodFurnaceBlower_Switch.state = OFF) {
                logInfo(name, "Masterbedroom AC OFF")
                FrontRoomSmartEnergySwitch_Switch.sendCommand(OFF)
        }
end


2018-09-24 13:01:51.947 [DEBUG] [rest.core.internal.item.ItemResource] - Received HTTP POST request at 'items/WoodFurnaceBlower_Switch' with value 'ON'.

==> /var/log/openhab2/events.log <==

2018-09-24 13:01:51.956 [ome.event.ItemCommandEvent] - Item 'WoodFurnaceBlower_Switch' received command ON

==> /var/log/openhab2/openhab.log <==

2018-09-24 13:01:51.961 [DEBUG] [nternal.profiles.ProfileCallbackImpl] - Delegating command 'ON' for item 'WoodFurnaceBlower_Switch' to handler for channel 'zwave:device:c9fd3b4d:node8:switch_binary'

2018-09-24 13:01:51.962 [DEBUG] [ntime.internal.engine.RuleEngineImpl] - Executing rule 'Master Bedroom AC'

2018-09-24 13:01:51.966 [DEBUG] [nternal.common.InvocationHandlerSync] - Already in a safe-call context, executing 'ThingHandler.handleCommand()' directly on 'org.openhab.binding.zwave.handler.ZWaveThingHandler@e72531'.

2018-09-24 13:01:51.979 [DEBUG] [nternal.profiles.ProfileCallbackImpl] - Delegating update 'ON' for item 'WoodFurnaceBlower_Switch' to handler for channel 'zwave:device:c9fd3b4d:node8:switch_binary'

==> /var/log/openhab2/events.log <==

2018-09-24 13:01:51.981 [vent.ItemStateChangedEvent] - WoodFurnaceBlower_Switch changed from OFF to ON

==> /var/log/openhab2/openhab.log <==

2018-09-24 13:01:51.986 [DEBUG] [nternal.common.InvocationHandlerSync] - Already in a safe-call context, executing 'ThingHandler.handleUpdate()' directly on 'org.openhab.binding.zwave.handler.ZWaveThingHandler@e72531'.

2018-09-24 13:01:52.000 [DEBUG] [eclipse.smarthome.model.script.Rules] - MasterBedroomAC: rule started: WoodFurnaceBlower_Switch.state=[ON]

2018-09-24 13:01:51.999 [DEBUG] [.sitemap.internal.SitemapEventOutput] - Sent sitemap event for widget 0200 to subscription 9f5e8630-6638-4bc8-8c17-372be715020a.

==> /var/log/openhab2/events.log <==

2018-09-24 13:01:52.021 [vent.ItemStateChangedEvent] - WoodFurnaceBlower_Switch changed from ON to OFF

==> /var/log/openhab2/openhab.log <==

2018-09-24 13:01:52.028 [DEBUG] [.sitemap.internal.SitemapEventOutput] - Sent sitemap event for widget 0200 to subscription 9f5e8630-6638-4bc8-8c17-372be715020a.

==> /var/log/openhab2/events.log <==

2018-09-24 13:01:52.077 [vent.ItemStateChangedEvent] - WoodFurnaceBlower_Switch changed from OFF to ON

==> /var/log/openhab2/openhab.log <==

2018-09-24 13:01:52.081 [DEBUG] [.sitemap.internal.SitemapEventOutput] - Sent sitemap event for widget 0200 to subscription 9f5e8630-6638-4bc8-8c17-372be715020a.

==> /var/log/openhab2/events.log <==

2018-09-24 13:01:57.838 [vent.ItemStateChangedEvent] - ZoneMinderServer_CPULoad changed from 1.79 to 1.8

==> /var/log/openhab2/openhab.log <==

2018-09-24 13:02:00.153 [DEBUG] [cheduler.ExpressionThreadPoolManager] - Scheduling the task 'org.eclipse.smarthome.core.scheduler.RunnableWrapper@616a1d' to execute in 59999 ms

Got it working with this code, couldn’t make it work with one rules so I did two. Seems to work with a switch as a trigger, now how to make it work based off a temperature value. hmmm


rule "Master Bedroom AC"
when
        Item WoodFurnaceBlower_Switch changed from OFF to ON
then
                if(WoodFurnaceBlower_Switch.state == ON) {
                FrontRoomSmartEnergySwitch_Switch.sendCommand(ON)
        }
end

rule "Master Bedroom AC"
when
        Item WoodFurnaceBlower_Switch changed from ON to OFF
then
                if(WoodFurnaceBlower_Switch.state == OFF) {
                FrontRoomSmartEnergySwitch_Switch.sendCommand(OFF)
        }
end


It’s hard to read the logs with the events and openhab logs interlaced like that.

Have you edited your log4j config? It is odd that at least the logInfo statements are not shown.

That being said, the whole Rule could be simplified to:

rule "Master Bedroom AC"
when
    Item WoodFurnaceBlower_Switch received command
then
    logInfo(name, "Masterbedroom AC " + receivedCommand)
    FrontRoomSmartEnergySwitch_Switch.sendCommand(receivedCommand)
end
rule "Temperature value"
when
    Item Temperature changed
then
    if(Temperature.state > someThreshold) {
        // do something
    }
    else {
        // do something else
    }
end
1 Like

I don’t recalling doing so, here is my org.ops4j.pax.logging.cfg file:


# Common pattern layout for appenders
#log4j2.pattern = %d{ISO8601} | %-5p | %-16t | %-32c{1} | %X{bundle.id} - %X{bundle.name} - %X$

# Root logger
log4j2.rootLogger.level = WARN
log4j2.rootLogger.appenderRefs = out, osgi
log4j2.rootLogger.appenderRef.out.ref = LOGFILE
log4j2.rootLogger.appenderRef.osgi.ref = OSGI

# Karaf Shell logger
log4j2.logger.shell.name = org.apache.karaf.shell.support
log4j2.logger.shell.level = OFF
log4j2.logger.shell.appenderRefs = stdout
log4j2.logger.shell.appenderRef.stdout.ref = STDOUT

#Â Security audit logger
log4j2.logger.audit.name = org.apache.karaf.jaas.modules.audit
log4j2.logger.audit.level = INFO
log4j2.logger.audit.additivity = false
log4j2.logger.audit.appenderRefs = audit
log4j2.logger.audit.appenderRef.audit.ref = AUDIT

# openHAB specific logger configuration

log4j2.logger.openhab.name = org.openhab
log4j2.logger.openhab.level = INFO

log4j2.logger.smarthome.name = org.eclipse.smarthome
log4j2.logger.smarthome.level = DEBUG

log4j2.logger.smarthomeItemStateEvent.name = smarthome.event.ItemStateEvent
log4j2.logger.smarthomeItemStateEvent.level = ERROR
log4j2.logger.smarthomeItemAddedEvent.name = smarthome.event.ItemAddedEvent
log4j2.logger.smarthomeItemAddedEvent.level = ERROR
log4j2.logger.smarthomeItemRemovedEvent.name = smarthome.event.ItemRemovedEvent
log4j2.logger.smarthomeItemRemovedEvent.level = ERROR
log4j2.logger.smarthomeThingStatusInfoEvent.name = smarthome.event.ThingStatusInfoEvent
log4j2.logger.smarthomeThingStatusInfoEvent.level = ERROR
log4j2.logger.smarthomeThingAddedEvent.name = smarthome.event.ThingAddedEvent
log4j2.logger.smarthomeThingAddedEvent.level = ERROR
log4j2.logger.smarthomeThingRemovedEvent.name = smarthome.event.ThingRemovedEvent
log4j2.logger.smarthomeThingRemovedEvent.level = ERROR
log4j2.logger.smarthomeInboxUpdatedEvent.name = smarthome.event.InboxUpdatedEvent
log4j2.logger.smarthomeInboxUpdatedEvent.level = ERROR

log4j2.logger.events.name = smarthome.event
log4j2.logger.events.level = INFO

I don’t see anything unexpected here except that the file looks truncated. I have all sorts of stuff after your last line in mine. In particular you are missing all the appenders. Without the appenders the logger won’t write anything.

Here is my full config. Note that I have added custom configs to put zwave, zigbee, and nest1 logs into their own files.

# Common pattern layout for appenders
#log4j2.pattern = %d{ISO8601} | %-5p | %-16t | %-32c{1} | %X{bundle.id} - %X{bundle.name} - %X{bundle.version} | %m%n

# Root logger
log4j2.rootLogger.level = WARN
log4j2.rootLogger.appenderRefs = out, osgi
log4j2.rootLogger.appenderRef.out.ref = LOGFILE
log4j2.rootLogger.appenderRef.osgi.ref = OSGI

# Karaf Shell logger
log4j2.logger.shell.name = org.apache.karaf.shell.support
log4j2.logger.shell.level = OFF
log4j2.logger.shell.appenderRefs = stdout
log4j2.logger.shell.appenderRef.stdout.ref = STDOUT

# Security audit logger
log4j2.logger.audit.name = org.apache.karaf.jaas.modules.audit
log4j2.logger.audit.level = INFO
log4j2.logger.audit.additivity = false
log4j2.logger.audit.appenderRefs = audit
log4j2.logger.audit.appenderRef.audit.ref = AUDIT

# openHAB specific logger configuration

log4j2.logger.openhab.name = org.openhab
log4j2.logger.openhab.level = INFO

log4j2.logger.smarthome.name = org.eclipse.smarthome
log4j2.logger.smarthome.level = INFO

log4j2.logger.smarthomeItemStateEvent.name = smarthome.event.ItemStateEvent
log4j2.logger.smarthomeItemStateEvent.level = ERROR
log4j2.logger.smarthomeItemAddedEvent.name = smarthome.event.ItemAddedEvent
log4j2.logger.smarthomeItemAddedEvent.level = ERROR
log4j2.logger.smarthomeItemRemovedEvent.name = smarthome.event.ItemRemovedEvent
log4j2.logger.smarthomeItemRemovedEvent.level = ERROR
log4j2.logger.smarthomeThingStatusInfoEvent.name = smarthome.event.ThingStatusInfoEvent
log4j2.logger.smarthomeThingStatusInfoEvent.level = ERROR
log4j2.logger.smarthomeThingAddedEvent.name = smarthome.event.ThingAddedEvent
log4j2.logger.smarthomeThingAddedEvent.level = ERROR
log4j2.logger.smarthomeThingRemovedEvent.name = smarthome.event.ThingRemovedEvent
log4j2.logger.smarthomeThingRemovedEvent.level = ERROR
log4j2.logger.smarthomeInboxUpdatedEvent.name = smarthome.event.InboxUpdatedEvent
log4j2.logger.smarthomeInboxUpdatedEvent.level = ERROR

log4j2.logger.events.name = smarthome.event
log4j2.logger.events.level = INFO
log4j2.logger.events.additivity = false
log4j2.logger.events.appenderRefs = event
log4j2.logger.events.appenderRef.event.ref = EVENT
log4j2.logger.events.appenderRef.osgi.ref = OSGI

log4j2.logger.jupnp.name = org.jupnp
log4j2.logger.jupnp.level = ERROR

log4j2.logger.jmdns.name = javax.jmdns
log4j2.logger.jmdns.level = ERROR

# This suppresses all Maven download issues from the log when doing feature installations
# as we are logging errors ourselves in a nicer way anyhow.
log4j2.logger.paxurl.name = org.ops4j.pax.url.mvn.internal.AetherBasedResolver
log4j2.logger.paxurl.level = ERROR

# Filters known issues of pax-web (issue link to be added here).
# Can be removed once the issues are resolved in an upcoming version.
log4j2.logger.paxweb.name = org.ops4j.pax.web.pax-web-runtime
log4j2.logger.paxweb.level = OFF

# Filters known issues of lsp4j, see
# https://github.com/eclipse/smarthome/issues/4639
# https://github.com/eclipse/smarthome/issues/4629
# https://github.com/eclipse/smarthome/issues/4643
# Can be removed once the issues are resolved in an upcoming version.
log4j2.logger.lsp4j.name = org.eclipse.lsp4j
log4j2.logger.lsp4j.level = OFF

# Filters known issues of KarServiceImpl, see
# https://github.com/openhab/openhab-distro/issues/519#issuecomment-351944506
# Can be removed once the issues are resolved in an upcoming version.
log4j2.logger.karservice.name = org.apache.karaf.kar.internal.KarServiceImpl
log4j2.logger.karservice.level = ERROR

### Custom Loggers ###
# ZWave
log4j2.logger.zwave.name = org.openhab.binding.zwave
log4j2.logger.zwave.level = INFO
log4j2.logger.zwave.additivity = false
log4j2.logger.zwave.appenderRefs = ZWAVE
log4j2.logger.zwave.appenderRef.zwave.ref = ZWAVE

# Zigbee
log4j2.logger.zigbee.name = org.openhab.binding.zigbee
log4j2.logger.zigbee.level = DEBUG
log4j2.logger.zigbee.additivity = false
log4j2.logger.zigbee.appenderRefs = ZIGBEE
log4j2.logger.zigbee.appenderRef.zigbee.ref = ZIGBEE

# Nest1
log4j2.logger.nest.name = org.openhab.binding.nest
log4j2.logger.nest.level = INFO
log4j2.logger.nest.additivity = false
log4j2.logger.nest.appenderRefs = NEST
log4j2.logger.nest.appenderRef.nest.ref = NEST

# Appenders configuration

### Custom Appenders ###
# ZWave
log4j2.appender.zwave.name = ZWAVE
log4j2.appender.zwave.type = RollingRandomAccessFile
log4j2.appender.zwave.fileName = ${openhab.logdir}/zwave.log
log4j2.appender.zwave.filePattern = ${openhab.logdir}/zwave.log.%i
log4j2.appender.zwave.immediateFlush = true
log4j2.appender.zwave.append = true
log4j2.appender.zwave.layout.type = PatternLayout
log4j2.appender.zwave.layout.pattern = %d{dd-MMM-yyyy HH:mm:ss.SSS} [%-5.5p] [%-50.50c] - %m%n
log4j2.appender.zwave.policies.type = Policies
log4j2.appender.zwave.policies.size.type = SizeBasedTriggeringPolicy
log4j2.appender.zwave.policies.size.size = 10MB
log4j2.appender.zwave.strategy.type = DefaultRolloverStrategy
log4j2.appender.zwave.strategy.max = 10

# Zigbee
log4j2.appender.zigbee.name = ZIGBEE
log4j2.appender.zigbee.type = RollingRandomAccessFile
log4j2.appender.zigbee.fileName = ${openhab.logdir}/zigbee.log
log4j2.appender.zigbee.filePattern = ${openhab.logdir}/zigbee.log.%i
log4j2.appender.zigbee.immediateFlush = true
log4j2.appender.zigbee.append = true
log4j2.appender.zigbee.layout.type = PatternLayout
log4j2.appender.zigbee.layout.pattern = %d{dd-MMM-yyyy HH:mm:ss.SSS} [%-5.5p] [%-50.50c] - %m%n
log4j2.appender.zigbee.policies.type = Policies
log4j2.appender.zigbee.policies.size.type = SizeBasedTriggeringPolicy
log4j2.appender.zigbee.policies.size.size = 10MB
log4j2.appender.zigbee.strategy.type = DefaultRolloverStrategy
log4j2.appender.zigbee.strategy.max = 10

# Nest1
log4j2.appender.nest.name = NEST
log4j2.appender.nest.type = RollingRandomAccessFile
log4j2.appender.nest.fileName = ${openhab.logdir}/nest.log
log4j2.appender.nest.filePattern = ${openhab.logdir}/nest.log.%i
log4j2.appender.nest.immediateFlush = true
log4j2.appender.nest.append = true
log4j2.appender.nest.layout.type = PatternLayout
log4j2.appender.nest.layout.pattern = %d{dd-MMM-yyyy HH:mm:ss.SSS} [%-5.5p] [%-50.50c] - %m%n
log4j2.appender.nest.policies.type = Policies
log4j2.appender.nest.policies.size.type = SizeBasedTriggeringPolicy
log4j2.appender.nest.policies.size.size = 10MB
log4j2.appender.nest.strategy.type = DefaultRolloverStrategy
log4j2.appender.nest.strategy.max = 10

# Console appender not used by default (see log4j2.rootLogger.appenderRefs)
log4j2.appender.console.type = Console
log4j2.appender.console.name = STDOUT
log4j2.appender.console.layout.type = PatternLayout
log4j2.appender.console.layout.pattern = %d{HH:mm:ss.SSS} [%-5.5p] [%-36.36c] - %m%n

# Rolling file appender
log4j2.appender.out.type = RollingRandomAccessFile
log4j2.appender.out.name = LOGFILE
log4j2.appender.out.fileName = ${openhab.logdir}/openhab.log
log4j2.appender.out.filePattern = ${openhab.logdir}/openhab.log.%i
log4j2.appender.out.immediateFlush = true
log4j2.appender.out.append = true
log4j2.appender.out.layout.type = PatternLayout
log4j2.appender.out.layout.pattern = %d{yyyy-MM-dd HH:mm:ss.SSS} [%-5.5p] [%-36.36c] - %m%n
log4j2.appender.out.policies.type = Policies
log4j2.appender.out.policies.size.type = SizeBasedTriggeringPolicy
log4j2.appender.out.policies.size.size = 16MB

# Event log appender
log4j2.appender.event.type = RollingRandomAccessFile
log4j2.appender.event.name = EVENT
log4j2.appender.event.fileName = ${openhab.logdir}/events.log
log4j2.appender.event.filePattern = ${openhab.logdir}/events.log.%i
log4j2.appender.event.immediateFlush = true
log4j2.appender.event.append = true
log4j2.appender.event.layout.type = PatternLayout
log4j2.appender.event.layout.pattern = %d{yyyy-MM-dd HH:mm:ss.SSS} [%-26.26c] - %m%n
log4j2.appender.event.policies.type = Policies
log4j2.appender.event.policies.size.type = SizeBasedTriggeringPolicy
log4j2.appender.event.policies.size.size = 16MB

# Audit file appender
log4j2.appender.audit.type = RollingRandomAccessFile
log4j2.appender.audit.name = AUDIT
log4j2.appender.audit.fileName = ${openhab.logdir}/audit.log
log4j2.appender.audit.filePattern = ${openhab.logdir}/audit.log.%i
log4j2.appender.audit.append = true
log4j2.appender.audit.layout.type = PatternLayout
log4j2.appender.audit.layout.pattern = %d{yyyy-MM-dd HH:mm:ss.SSS} [%-5.5p] [%-36.36c] - %m%n
log4j2.appender.audit.policies.type = Policies
log4j2.appender.audit.policies.size.type = SizeBasedTriggeringPolicy
log4j2.appender.audit.policies.size.size = 8MB

# OSGi appender
log4j2.appender.osgi.type = PaxOsgi
log4j2.appender.osgi.name = OSGI
log4j2.appender.osgi.filter = *
log4j2.logger.org_apache_sshd.level = TRACE
log4j2.logger.org_apache_sshd.name = org.apache.sshd