March 4, 2021 at 8:06 am #69352
I hope this is something others will recognise. I’ve tried following the instructions here about how to compile the OpenSprinkler firmware from source. I’d really like to have a try at custom coding a workaround to the rare-but-persistent tendency to drop off a wifi network and never rejoin it.
Beyond those instructions, I did the following:
– substituted esp8266_2.7.4 for 2.5.2 throughout, since 2.7.4 is what is referenced in make.lin32
– changed the “SSD1306” path in make.lin32 to “esp8266-oled-ssd1306” (since that’s what actually gets cloned from the links provided
At that point, it seems to start building very nicely, listing dozens of .cpp files, right up to the point where it throws the following errors:
In file included from OpenSprinkler.h:38:0, from OpenSprinkler.cpp:24: /Volumes/Cloudjumper/Users/robin/Arduino/libraries/UIPEthernet/UIPEthernet.h: In static member function 'static void OpenSprinkler::yield_nicely()': /Volumes/Cloudjumper/Users/robin/Arduino/libraries/UIPEthernet/UIPEthernet.h:124:15: error: 'static void UIPEthernetClass::tick()' is private static void tick(); ^ OpenSprinkler.cpp:2354:24: error: within this context if(m_server) Ethernet.tick(); ^ In file included from OpenSprinkler.h:38:0, from OpenSprinkler.cpp:24: /Volumes/Cloudjumper/Users/robin/Arduino/libraries/UIPEthernet/UIPEthernet.h:124:15: error: 'static void UIPEthernetClass::tick()' is private static void tick(); ^ OpenSprinkler.cpp:2354:29: error: within this context if(m_server) Ethernet.tick(); ^ make: *** [/tmp/mainArduino/mainArduino_generic/OpenSprinkler.cpp.o] Error 1
Any ideas how I can get past that error? Google isn’t terribly helpful so far.March 4, 2021 at 8:13 am #69353
Further to the above, I’ve found that commenting out the one line in OpenSprinkler.cpp where Ethernet.tick() is called, seems to allow it all to build without errors… but I feel like that’s not a good way to do things, if tick() is supposed to do something important in the yield_nicely function.March 4, 2021 at 9:04 am #69354
The build instructions were outdated and I just updated them. Two things:
1. using esp8266 core 2.7.4 is fine as the firmware has been verified to compile with 2.7.4 (though 2.5.2 should also work fine)
2. for the UIPEthernet library, use the one that we’ve modified (it contains some dhcp fixes and customization). This is available in the OpenSprinkler github repository, and here is the direct download link:
https://github.com/OpenSprinkler/UIPEthernet/archive/fixes/dhcp.zipMarch 4, 2021 at 9:08 am #69355
Thanks for that. On going through the code, I’ve discovered that (I think) the function in which the Ethernet.tick() function is attempted to be called is not, itself, ever called… so I’m pretty sure it can be safely either commented out (which would break things if I’m wrong), or replaced with Ethernet.maintain() (which should be safer if I’m wrong).March 4, 2021 at 3:44 pm #69360
Please note that tick() is called inside the maintain() function:
you can certainly change the call to tick() to maintain() but maintain() is heavier weight than tick().March 5, 2021 at 5:27 am #69363
Yes – I noticed that tick() was called inside maintain()… but the difference is that maintain() is a public function (as opposed to tick() which is private in the stock version of UIPEthernet), so I figured I can put it in that place in OpenSprinkler.cpp without causing a fatal error during build. Of course, if the customised version of the library makes tick() public, that would fix the error too.
And it still doesn’t appear to matter, since I’m pretty sure delay_nicely is not called at all in the current version of OpenSprinkler.cppMarch 5, 2021 at 9:26 am #69362
I wrote a script that does the download and necessary fixups.
Make a build directory and run this script from there.
Here it is:
# This script downloads all of the source code necessary to build
# the OpenSprinkler binary for the 3.0 hardware.
# The script fixes a few places in the source downloads that are
# needed before it will compile cleanly.
# Finally it runs the make command.
# This can be run in any directory and will set a local $HOME
# This runs in Linux.
# Remove any previous installation. You may or may not want to do this!
rm -rf Arduino esp8266_2.5.2 OpenSprinkler-Firmware
# Create a local $HOME foe installation and build.
# Get the OpenSprinkler code.
# Puts it in ~/OpenSprinkler-Firmware
git clone https://github.com/OpenSprinkler/OpenSprinkler-Firmware.git
# Get the Arduino code.
# Puts it in ~/esp8266_2.5.2
git clone https://github.com/esp8266/Arduino.git esp8266_2.5.2
# Go into esp8266_2.5.2 and checkout the correct version.
git checkout tags/2.5.2
# If necessary, install Python.
# sudo apt install python
# This Perl script installs the xtensa compiler and tools.
# Go back up the base level.
# Install necessary libraries, including SSD1306, RCSwitch, and UIPEthernet.
# Download and unzip or git clone these into Arduino/libraries folder.
mkdir -p ~/Arduino/libraries
# Get the library for the OLED display.
git clone https://github.com/ThingPulse/esp8266-oled-ssd1306.git
# The latest version of the OLED code is not compatable, backup to 4.1.0
git checkout tags/4.1.0
# Remove tests directory as it will not compile but is unnecessary.
rm -rf ~/Arduino/libraries/pubsubclient/tests
# Go into the actual build location
# There is an fixup needed in make.lin32:
# This changes the OLED library to the correct one.
sed -i s+Arduino/libraries/SSD1306+Arduino/libraries/esp8266-oled-ssd1306+ make.lin32
# And finally build the final OpenSprinkler binary.
make -f make.lin32
echo ‘To build in a directory other than your normal $HOME directory’
echo ‘run this command to set a local $HOME directory to your current directory:’
echo ‘ export HOME=
echo “Next go into the build directory.”
echo ” cd ~/OpenSprinkler-Firmware”
echo “Then run this command to build the binary:”
echo ” make -f make.lin32″
echo “**********************************************************”March 5, 2021 at 11:04 am #69365
I see that my script is out of date!
The lines with esp8266_2.5.2 need to be edited to pick up the 2.7.4 version.
The issue with tick() must also be dealt with.May 23, 2021 at 10:58 am #70191
I’ve compiled the OpenSprinkler firmware 2.1.9(7) using the build instructions given in https://openthings.freshdesk.com/support/solutions/articles/5000165132-how-to-compile-opensprinkler-firmware.
Besides using the modified UIPEthernet library, available in the OpenSprinkler github repository: https://github.com/OpenSprinkler/UIPEthernet/archive/fixes/dhcp.zip, some changes described by the script given above need to be made:
– Rename the library “UIPEthernet-fixes-dhcp” to “UIPEthernet”
– Get the library for the OLED display from https://github.com/ThingPulse/esp8266-oled-ssd1306.git, but backup to 4.1.0 as the latest version of the OLED code isn’t compatible:
cd ~/Arduino/libraries/esp8266-oled-ssd1306, git checkout tags/4.1.0
– Rename the library “esp8266-oled-ssd1306” to “SSD1306”.
– Get the library for the MQTT Arduino Client for MQTT from: https://github.com/knolleary/pubsubclient.git and remove the tests directory as it will not compile but is unnecessary: rm -rf ~/Arduino/libraries/pubsubclient/tests
With these changes the compilation was successful. The Ubuntu based Linux-Distribution Linux Mint 20.1 (Codename Ulyssa) with its Cinnamon Edition was used to perform the compilation. VirtualBox 6.1.22 was installed to run Linux.May 30, 2021 at 9:21 am #70261
I have taken your fixes and updated my script.
This script downloads all of the source and applies the necessary
fixed to build the latest binary. This is currently: Firmware 2.1.9 (7)
If this script is run in a new subdirectory it creates it’s own environment
to build the binary. This allows you to have multiple build trees with
their own build root.
I have attached my script. I use Ubuntu 20.04 for development.
- You must be logged in to reply to this topic.