That relay board should work with the digispark as the optoisolator trigger means the digispark doesn't have to do much work. However, it will probably consume the same amount of power as the servo when it's not doing anything. Have you tried measuring how much current the servo actually draws when it isn't being used? As a quick test, I just checked the idle power of a random hobby servo I had, and it was drawing ~6ma with no load on it. Compared to the ~30mA the digispark as drawing... that isn't anything to worry about!
The power LED on the digispark draws between 2-3ma. So if you cut that trace, you get red of nearly 3ma of unnecessary power drain. If you use a mosfet (or a transistor as Ralf suggested) to control the servo power, you will get back whatever power your servo draws when idling, and won't have the overhead of the relay control board. If there is any weight or pressure on the servo though, it will not hold it's position.
If you use the sleep code shown below in your own code, you'll get the standby power consumption of the digispark down from 30ma down to 18ma. The rest must be due to the regulator and usb circuitry... I haven't been able to get the power consumption lower and should be able to (as the attiny85 chip on the digispark in sleep mode draws less than 1ma). My current thoughts are you would need to get away from the digispark, and design your own circuit around the attiny85, so you could get the really low power requirements. But hopefully someone else may have ideas as to get the lower levels lower. However, I haven't yet been able to get the digispark below 18ma (and that's with the power led trace cut), in sleep mode, and with the P1 led off).
For longer sleep periods like what you talking about, you would set the watchdog to it's maximum of 8 seconds, and then simply keep re-triggering the system_sleep for as many times as you need until the system should be active again. How you would do so I can't say immediately, as I don't know what your requirements are. if it is simply a matter of "eight hours after I press the button, move the servo" then you could simply use a for loop. If it was a matter of sleeping until the light reading across a light sensor reached a particular level, then it would be a bit tricker... possibly a series of sleeps (for say five minutes), and then a couple of checks of the LDR to get a stable reading and see what the light level is, and trigger the servo etc.
Can you provide more information about your requirements and setup? You've said it is only used twice a day, and for moving a servo. Is there a particular reason it needs to be powered all the time? (i.e. does it happen automatically on it's own, or do you press a button, and the servo moves? meaning you could instead be powering the digispark when you press the button, and moving the servo then?) How are you powering the digispark? (usb powerbank? battery?) If it's a USB powerbank, have you considered adding a USB solar panel to charge the powerbank?
/*
Sleepy blink code for the Digispark
*/
#define LED_PIN 1
#include <avr/sleep.h>
// Variables for the Sleep/power down modes:
volatile boolean f_wdt = 1;
// Routines to set and clear bits (used in the sleep code)
#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif
// the setup function runs once when you press reset or power the board
void setup()
{
// initialize digital pin LED_PIN as an output.
pinMode(LED_PIN, OUTPUT);
setup_watchdog(6); // approximately 1 second sleep
}
// the loop function runs over and over again forever
void loop()
{
digitalWrite(LED_PIN, HIGH); // turn the LED on (HIGH is the voltage level)
system_sleep(); // Send the unit to sleep
//delay(1000); // wait for a second
digitalWrite(LED_PIN, LOW); // turn the LED off by making the voltage LOW
system_sleep(); // Send the unit to sleep
//delay(1000); // wait for a second
}
// SLEEP CODE HELPER FUNCTIONS
// set system into the sleep state
// system wakes up when wtchdog is timed out
void system_sleep()
{
cbi(ADCSRA, ADEN); // switch Analog to Digitalconverter OFF
set_sleep_mode(SLEEP_MODE_PWR_DOWN); // sleep mode is set here
sleep_enable();
sleep_mode(); // System actually sleeps here
sleep_disable(); // System continues execution here when watchdog timed out
sbi(ADCSRA, ADEN); // switch Analog to Digitalconverter ON
}
// 0=16ms, 1=32ms,2=64ms,3=128ms,4=250ms,5=500ms
// 6=1 sec,7=2 sec, 8=4 sec, 9= 8sec
void setup_watchdog(int ii)
{
byte bb;
int ww;
if (ii > 9 ) ii = 9;
bb = ii & 7;
if (ii > 7) bb |= (1 << 5);
bb |= (1 << WDCE);
ww = bb;
MCUSR &= ~(1 << WDRF);
// start timed sequence
WDTCR |= (1 << WDCE) | (1 << WDE);
// set new watchdog timeout value
WDTCR = bb;
WDTCR |= _BV(WDIE);
}
// Watchdog Interrupt Service / is executed when watchdog timed out
ISR(WDT_vect)
{
f_wdt = 1; // set global flag
}