Resend command for wireless blinds / rollershutter

  • Platform information: OH 2.3

I wrote a rule that re-sends commands when a blind / rollerhutter is offline. It does work well. I am, however looking for an improvement as I think my use of timers is not ideal.

Second question: is there a way to derive the channel from the item (for the offline detection)

var Timer T1
var Timer T2
var Timer T3
var Timer T4
var Timer T5
var Timer T6
var Timer T7
var Timer T8
var Timer T9
var Timer T10
var Timer T11
var Timer T12
var Timer T13

 

rule "RolloResendCommand"
when
    Member of gRollo received command
then
        createTimer(now.plusSeconds(1)) [
            var String myChannel = NULL
            var Timer reSendTimer 
       
            switch (triggeringItem.name.toString()) { 
                case 'EG_Wohnen_RaffstoreWest'  :  { myChannel =  "homematic:HM-LC-Bl1PBU-FM:pivccu:MEQ070724"; if (T1!== null) T1.cancel()  }
                case 'EG_Wohnen_RaffstoreOst'  :   { myChannel =  "homematic:HM-LC-Bl1PBU-FM:pivccu:MEQ071124"; if (T2!== null) T2.cancel()  }
                case 'EG_Wohnen_RolloOst'  :       { myChannel =  "homematic:HM-LC-Bl1PBU-FM:pivccu:MEQ031127"; if (T3!== null) T3.cancel()  }
                case 'EG_Kueche_Rollo'  :          { myChannel =  "homematic:HM-LC-Bl1PBU-FM:pivccu:MEQ072240"; if (T4!== null) T4.cancel()  }
                case 'EG_WC_Rollo'  :              { myChannel =  "homematic:HM-LC-Bl1PBU-FM:pivccu:MEQ072056"; if (T5!== null) T5.cancel()  }
                case 'EG_Arbeitszimmer_Rollo'  :   { myChannel =  "homematic:HM-LC-Bl1PBU-FM:pivccu:MEQ110144"; if (T6!== null) T6.cancel()  }
                case 'EG_Flur_Rollo'  :            { myChannel =  "homematic:HM-LC-Bl1PBU-FM:pivccu:MEQ072218"; if (T7!== null) T7.cancel()  }
                case 'OG_Bad_Rollo'  :             { myChannel =  "homematic:HM-LC-Bl1PBU-FM:pivccu:MEQ110061"; if (T8!== null) T8.cancel()  }
                case 'OG_Leo_RolloWest'  :         { myChannel =  "homematic:HM-LC-Bl1PBU-FM:pivccu:MEQ110059"; if (T9!== null) T9.cancel()  }
                case 'OG_Tim_RolloOst'  :          { myChannel =  "homematic:HM-LC-Bl1PBU-FM:pivccu:MEQ110628"; if (T10!== null) T10.cancel()  }
                case 'OG_Toby_RolloSued'  :        { myChannel =  "homematic:HM-LC-Bl1PBU-FM:pivccu:MEQ110622"; if (T11!== null) T11.cancel()  }
                case 'OG_Felix_RolloOst'  :         { myChannel =  "homematic:HM-LC-Bl1PBU-FM:pivccu:MEQ110132"; if (T12!== null) T12.cancel()  }
                case 'OG_Schlafen_Rollo'  :        { myChannel =  "homematic:HM-LC-Bl1PBU-FM:pivccu:MEQ117014"; if (T13!== null) T13.cancel()  }
               // default      :                     { }
            }
            var status = ThingAction.getThingStatusInfo(myChannel).getStatus()// openhab 2.3
            // var status = getThingStatusInfo(myChannel).getStatus()// openhab 2.4
            if (status.toString() == "OFFLINE") {
                sendMail("fritzmessage@gmx.de", triggeringItem.name.toString()+ "is offline",  "Resend Command: " + receivedCommand.toString() )
                logInfo(triggeringItem.name.toString(), "is offline. Resend Command: " + receivedCommand.toString() )
               
                reSendTimer = createTimer(now.plusSeconds(180)) [
                    logInfo(triggeringItem.name.toString(), "execute timer. Resend Command: " + receivedCommand.toString())
                    triggeringItem.sendCommand(receivedCommand) 
                ]   
                switch (triggeringItem.name.toString()) { 
                    case 'EG_Wohnen_RaffstoreWest'  :  { T1= reSendTimer}
                    case 'EG_Wohnen_RaffstoreOst'  :   { T2= reSendTimer}
                    case 'EG_Wohnen_RolloOst'  :       { T3= reSendTimer}
                    case 'EG_Kueche_Rollo'  :          { T4= reSendTimer}
                    case 'EG_WC_Rollo'  :              { T5= reSendTimer}
                    case 'EG_Arbeitszimmer_Rollo'  :   { T6= reSendTimer}
                    case 'EG_Flur_Rollo'  :            { T7= reSendTimer}
                    case 'OG_Bad_Rollo'  :             { T8= reSendTimer}
                    case 'OG_Leo_RolloWest'  :         { T9= reSendTimer}
                    case 'OG_Tim_RolloOst'  :          { T10= reSendTimer}
                    case 'OG_Toby_RolloSued'  :        { T11= reSendTimer}
                    case 'OG_Felix_RolloOst'  :         { T12= reSendTimer}
                    case 'OG_Schlafen_Rollo'  :        { T13= reSendTimer}
                }
               
 
            }

        ]
end

This pattern gives an example of storing multiple timers in a Map (“array”) indexed by Item name, which should be useful

I would have thought the REST API can provide channel details, possibly direct on/offline status