Opinion on rule set for programmable watering system

I have trouble with persistence. I added the sqlite addon via habmin.
Then:

services/jdbc.cfg

url=jdbc:sqlite:./testSqlite.db

persistence/sonoffitems.persist

Strategies {
}
Items {
arrauto, arrpelsec, arrbambounordsec, arrstarth, arrstartm : strategy = everyChange, restoreOnStartup
}

No ERROR in logs. Driver found. sqllite file created.
I only want the items specified to be updated at everyChange and restoreOnStartup.
Any clue ?

rename your persist file to jdbc.persist

I slept on it and relized I made it very complicated!!

var itemName = triggeringItem.name
var state = 0
if (itemName == "arrbambounord") {
        state = arrbambounordsec.state as Number
    } else if (itemName == "arrpel") {
        state = arrpel.state as Number
    }
logInfo("VALUE", state.toString)

@fpalinf for your label with the seconds I think it’s a feature not a bug.
EDIT: it was a bug.

https://www.eclipse.org/smarthome/blog/2018/02/22/units-of-measurement.html

@Josar the thing is it worked flawlessly on 2.2.0 and when I migrated it in 2.3.0-SNAPSHOT it stopped working. Anyway, I will take time to sort it out soon.

1 Like

There is a way of only triggering your irrigation based on the weather too.

Thanks all for the advices, I removed all single items and use exclusively groups.
It is a nice sequential start and stop of each pump.

I would be happy to clean it up a bit if you have other advices.
Also the programmable cron is still a bit tricky.

arr.rules

//import org.joda.time.DateTime

var Timer myTimer = null

// Todo configurable via l'interface
rule "timed watering"
when 
    //Time cron "0 28 22 1/1 * ? *"
    Time cron "0 0 3 1/1 * ? *" // 3am everyday
then
   waterAllZone.sendCommand(ON)
end

rule "waterAllZone"
when 
    Item waterAllZone changed
then
   if (waterAllZone.state==OFF) {
      waterValves.sendCommand(OFF)
      //arrbambounord.sendCommand(OFF)
      //arrpel.sendCommand(OFF)
   }
   else if (waterAllZone.state==ON) {
      waterValve1.sendCommand(ON)
   }
end

rule "waterValves changed"
when
    Member of waterValves changed
    //Item waterValves received update

then
   logInfo("triggeringItem",triggeringItem.toString) //triggeringItem is not set
    if (triggeringItem.state==OFF) {
        if (myTimer!==null) {
            myTimer.cancel
            myTimer = null
        }
    }
    else if (triggeringItem.state==ON) {
        if (myTimer!==null) {
            myTimer.cancel
            myTimer = null
        }
        var itemName = triggeringItem.name
        logInfo("waterValves = ", waterValves.toString)

        var concatenateName = itemName + "Duration"
        logInfo("concatenateName = ", concatenateName)

        logInfo("triggering item = ", waterValves.members.toString)
        var waterValveXDuration = waterValvesDuration.members.filter[ i | i.name == concatenateName ].get(0)
        logInfo("state =", waterValveXDuration.state.toString)

        //Get the name of the next item in the group ... how to simplify ?
        var itemNameStr = itemName.toString
        var itemNameWithoutNumberStr = itemNameStr.substring(0, itemNameStr.length() - 1)
        var itemNumber = itemNameStr.substring(itemNameStr.length() - 1, itemNameStr.length())
        var concatNext = itemNameWithoutNumberStr + (Integer.parseInt(itemNumber) + 1)

        var duration = 0
        if (waterValveXDuration.state !== NULL) {
            duration = (waterValveXDuration.state as DecimalType).intValue
        }

        myTimer = createTimer(now.plusSeconds(duration)) [|
          triggeringItem.sendCommand(OFF)
          if (waterAllZone.state==ON) {
          try { //How to avoid try and catch and use check ?
            var waterValveNext = waterValves.members.filter[ i | i.name == concatNext ].get(0)
            logInfo("open next watering valve =", concatNext)
            waterValveNext.sendCommand(ON)
            }
          catch (Throwable t) {
            logInfo("last valve", "this was the last valve")
            }
            }
        ]
    }


end



rule "System started"
when
    System started
then
Thread::sleep(10 * 1000)

logInfo("arr.rules", "Default system value loading")
if (waterValve1Duration.state == NULL) MyGroup.members.forEach[ i | i.postUpdate(5)]

//if (waterValve2Duration.state == NULL) waterValve2Duration.postUpdate(5)
if (wateringStartHour.state == NULL) wateringStartHour.postUpdate(3)
if (wateringStartMin.state == NULL) wateringStartMin.postUpdate(0)
end

all.items

Number waterValve1Duration (waterValvesDuration)
Number waterValve2Duration (waterValvesDuration)
Number waterValve3Duration (waterValvesDuration)

Number wateringStartHour
Number wateringStartMin
Switch scheduledWatering
Switch waterAllZone

Group waterValves
Group waterValvesDuration

Switch waterValve1 (waterValves)
    { mqtt=">[agde:ESPURNA_802DF2/relay/0/set:command:*:default],
            <[agde:ESPURNA_802DF2/relay/0:state:MAP(onoff.map)]" }
Switch waterValve2 (waterValves)
    { mqtt=">[agde:ESPURNA_802DF2/relay/1/set:command:*:default],
            <[agde:ESPURNA_802DF2/relay/1:state:MAP(onoff.map)]" }
Switch waterValve3 "grass watering valve" (waterValves)
    { mqtt=">[agde:ESPURNA_802DF2/relay/2/set:command:*:default],
            <[agde:ESPURNA_802DF2/relay/2:state:MAP(onoff.map)]" }

Switch pacpool
    { mqtt=">[agde:ESPURNA_2BBB38/relay/1/set:command:*:default],
            <[agde:ESPURNA_2BBB38/relay/1:state:MAP(onoff.map)]" }

all.sitemap

sitemap all label="Main Menu"
{
	Frame label="Garden" {
                Setpoint item=wateringStartHour label="Starting hour [%d h]" step=1 minValue=0 maxValue=23
                Setpoint item=wateringStartMin label="Starting minute [%d min]" step=1 minValue=0 maxValue=59
                Switch item=scheduledWatering label="Automatic water on"
                Switch item=waterAllZone label="Start watering all zones"

                Switch item=waterValve1 label="Bambou south watering - waterValve1"
                Setpoint item=waterValve1Duration label="Bambou south watering duration [%d]" step=1 minValue=1 maxValue=600
                Switch item=waterValve2 label="Bambou west watering - waterValve2"
                Setpoint item=waterValve2Duration label="Bambou west watering duration [%d]" step=1 minValue=1 maxValue=600
                Switch item=waterValve3 label="Grass watering waterValve3"
                Setpoint item=waterValve3Duration label="Grass watering duration [%d]" step=1 minValue=1 maxValue=600
	}

        Frame label="Piscine" {
		Switch item=pacpool label="Pool heating"
//		Switch item=PacPiscine label="Pool filtration pump"
}
}