OpenSprinkler › Forums › Third-Party Software › OpenHab support and Integration Pathways for OpenSprinkler
Tagged: API, Design for IOT, MQTT, OpenHab, OpenSprinkler
- This topic has 5 replies, 4 voices, and was last updated 7 years ago by Ray.
-
AuthorPosts
-
January 12, 2016 at 12:58 pm #41285
safetyfactormanParticipantI am interested to discuss the integration of OpenSprinkler with other software. Perhaps the first step of this process should be for the designers of OpenSprinkler to share their vision of how OpenSprinkler is to integrate with IOT.
My understanding is that the python version of OpenSprinkler has MQTT support, which was created by the OpenSprinkler community. I would like to better understand what are the capabilities of this specification are, and if it is possible to create documentation to better explain how to use this api.
I see OpenHab as a complementary solution that could create mutually beneficial synergies for both technologies through integration. I know that implementations of OpenHab/Opensprinkler have already taken place. I think that it would be extremely beneficial to have an example which demonstrates the integration of OpenHab with OpenSprinkler, that is available to the OpenSprinkler and OpenHab communities.
January 19, 2016 at 7:11 pm #41336
RayKeymasterI know that someone has integrated OpenSprinkler with OpenHab in the past. But since the OpenSprinkler firmware has changed considerably since then (and probably OpenHab too), I am not sure if it’s still compatible.
I am glad to see there have been many interests in integrating OpenSprinkler with various home automation services / controllers (beyond OpenHab, there are also Vera, SmartThings, IFTTT etc.) Unfortunately implementing, maintaining, and testing these plugins require a lot of programming and engineering efforts. Samer and I both have daytime jobs and are not quite willing to quit our daytime jobs yet. It’s not that we are uninterested in extensions, we simply don’t have the cycles to work on them. So in the end, a lot of these extended capabilities will have to be implemented by users and shared with the community.
February 9, 2016 at 12:07 pm #41484
nomennudemParticipantI have heard about open sprinkler being used in an openhab setup. It looks like great software but I have not found their documentation to be very complete.
I’m looking at this iot middlewear which claims to have ag components. It might be a better fit for opensprinkler.
http://www.kaaproject.org/February 17, 2016 at 12:14 am #41537
RayKeymasterOk, noted and will check it out. Thanks.
September 7, 2017 at 5:43 am #47610
paul8ParticipantFor OpenSprinkler Pi, I integrated to OpenHab by writing rules directly. It wasn’t as hard as it appears, you just drive the gpio pins.
The core of the logic was something like:
Switch swWateringClock "Clock" <waterpump> (InternalFlags) { gpio="pin:4 force:yes activelow:yes" } Switch swWateringNoE "NoE" <waterpump> (InternalFlags) { gpio="pin:17 force:yes activelow:yes" } Switch swWateringData "Data" <waterpump> (InternalFlags) { gpio="pin:27 force:yes activelow:no" } Switch swWateringLatch "Latch" <waterpump> (InternalFlags) { gpio="pin:22 force:yes activelow:yes" } Switch swWateringUpdate "Update valves" <waterpump> (InternalFlags)
Plus a set of switches, one for each watering line:
Group:Number:SUM WateringSwitches "Watering Switches" (Watering) Switch swWatering1 "Kitchen Garden" <waterpump> (WateringSwitches) ... Switch swWatering24 "Watering 24" <waterpump> (WateringSwitches)
And a rule that would update the OpenSprinkler Pi to turn valves on or off when something changes
rule "Update watering status" when Item swWateringUpdate changed to ON then var int valve = 24 // number of valves on the opensprinkler pi - I have one expansion board, hence 24 valves logDebug( 'watering', 'Watering update flag is on') if( swWateringClock.state == Uninitialized || swWateringClock.state == ON ){ logInfo( 'watering', 'Clock was null or ON, probably means something was wrong') sendCommand( swWateringClock, OFF ) } if( swWateringNoE.state == Uninitialized ){ logInfo( 'watering', 'NoE was null, probably means something was wrong') sendCommand( swWateringNoE, OFF ) } if( swWateringData.state == Uninitialized || swWateringData.state == ON ){ logInfo( 'watering', 'Data was null or ON, probably means something was wrong') sendCommand( swWateringData, OFF ) } if( swWateringLatch.state == Uninitialized || swWateringLatch.state == ON ){ logInfo( 'watering', 'Latch was null or ON, probably means something was wrong') sendCommand( swWateringLatch, OFF ) } // NoE controls whether any valves are on. Set to true if any valves are going to be on logDebug( 'watering', 'Total of switches is: ' + WateringSwitches.state ) if( WateringSwitches.state > 0 && swWateringNoE.state == OFF ){ logDebug( 'watering', 'NoE is off, turning it on' ) sendCommand( swWateringNoE, ON ) } if( swWateringData == null ){ sendCommand( swWateringData, OFF ) } // set the Latch, which allows programming, program takes effect when turned back OFF sendCommand( swWateringLatch, ON ) while (valve > 0) { // write out the value of the next valve - we write them in reverse order from 24 down to 1 logDebug( 'watering', 'Processing valve: ' + valve ) // find the next valve var org.openhab.core.library.items.SwitchItem currentSwitch = WateringSwitches.members.filter( m | m.name == ('swWatering' + valve ) ).last // set the data switch the same as the currentSwitch value logDebug( 'watering', 'Desired state is: ' + currentSwitch ) if( currentSwitch.state == Uninitialized ){ logInfo( 'watering', 'Switch was uninitialised, setting to OFF' ) sendCommand( currentSwitch, OFF ) } if( currentSwitch.state == OFF ){ sendCommand( swWateringData, OFF ) } else { sendCommand( swWateringData, ON ) } // toggle the clock to set this value before we move onto the next valve sendCommand( swWateringClock, ON ) sendCommand( swWateringClock, OFF ) valve = valve - 1 } // turn off the Latch, makes the program take effect sendCommand( swWateringLatch, OFF ) // NoE controls whether any valves are on. Set to true if any valves are on logDebug( 'watering', 'Total of switches is: ' + WateringSwitches.state ) if( WateringSwitches.state == 0 && swWateringNoE.state == ON ){ logDebug( 'watering', 'NoE is on, turning it off' ) sendCommand( swWateringNoE, OFF ) } logDebug( 'watering', 'Turning watering update flag off') sendCommand( swWateringUpdate, OFF ) postUpdate( dtLastWateringUpdate, new DateTimeType() ) // set a timer, if nothing changes for 90 minutes, then assume someone forgot or something broke - turn everything off if( swWateringNoE.state == ON ) { logDebug( 'watering', 'Setting a timer to check that we don\'t forget to turn off') createTimer( now().plusMinutes( 91 ) ) [ | { logDebug( 'watering', 'Checking last update date to see if any changes since timer set: ' + dtLastWateringUpdate ) var DateTime lastUpdate = new DateTime( ( dtLastWateringUpdate.state as DateTimeType ).calendar.timeInMillis ) if( lastUpdate.plusMinutes( 90 ).isBefore(now) ){ logInfo ( 'watering', 'Something ran with no changes for more than 90 minutes, turning everything off' ) var int valveOff = 24 while (valveOff > 0) { var org.openhab.core.library.items.SwitchItem currentSwitch = WateringSwitches.members.filter( m | m.name == ('swWatering' + valveOff ) ).last postUpdate( currentSwitch, OFF ) valveOff = valveOff - 1 } postUpdate( swWateringUpdate, ON ) } }] } end
There’s some other bits and pieces, but that should be enough to give the idea.
September 18, 2017 at 8:45 am #47762
RayKeymasterExcellent. Thanks for sharing!
-
AuthorPosts
- You must be logged in to reply to this topic.
OpenSprinkler › Forums › Third-Party Software › OpenHab support and Integration Pathways for OpenSprinkler