diff --git a/include/arch.h b/include/arch.h
index 70bc41c271148385503d381ff7ec4e5524b96748..a053b585d415a096025d074c2a6548564c84a2c4 100644
--- a/include/arch.h
+++ b/include/arch.h
@@ -9,6 +9,7 @@ class Arch {
 		Arch () {}
 		void setup();
 		void idle_loop();
+		void idle();
 		void delay_us(unsigned char const us);
 };
 
diff --git a/src/arch/arduino-nano/arch.cc b/src/arch/arduino-nano/arch.cc
index 16d09fb33708701c3678ba7b930e836ed9835e27..fda518c54f9ff7d1d74f31c55ce76f130e73f888 100644
--- a/src/arch/arduino-nano/arch.cc
+++ b/src/arch/arduino-nano/arch.cc
@@ -55,6 +55,14 @@ void Arch::idle_loop(void)
 	}
 }
 
+void Arch::idle(void)
+{
+	SMCR = _BV(SE);
+	asm("sleep");
+	SMCR = 0;
+	asm("wdr");
+}
+
 void Arch::delay_us(unsigned char const us)
 {
 	__builtin_avr_delay_cycles(1600);
diff --git a/src/arch/esp8266/arch.cc b/src/arch/esp8266/arch.cc
index f5d1c91f83da3bfa474e860e11ef60867bee1615..3490ffe67e7d450fdcbec01721dee572bb608d80 100644
--- a/src/arch/esp8266/arch.cc
+++ b/src/arch/esp8266/arch.cc
@@ -57,6 +57,10 @@ void Arch::idle_loop(void)
 {
 }
 
+void ArcH::idle(void)
+{
+}
+
 extern "C" void user_init(void)
 {
 	system_init_done_cb(jump_to_main);
diff --git a/src/arch/msp430fr5969lp/arch.cc b/src/arch/msp430fr5969lp/arch.cc
index aee46f30934b6f2f608fb9adfcc3de598f920c76..301684252d8a04436b62ccb7853ae6fa1302e9df 100644
--- a/src/arch/msp430fr5969lp/arch.cc
+++ b/src/arch/msp430fr5969lp/arch.cc
@@ -91,6 +91,17 @@ void Arch::idle_loop(void)
 	}
 }
 
+void Arch::idle(void)
+{
+	__eint();
+	asm volatile("nop");
+	__bis_SR_register(LPM2_bits);
+	asm volatile("nop");
+#ifdef WITH_WAKEUP
+		wakeup();
+#endif
+}
+
 Arch arch;
 
 #if defined(WITH_LOOP) || defined(TIMER_S)
diff --git a/src/arch/posix/arch.cc b/src/arch/posix/arch.cc
index efcf90e94aaff708a3c07fba24325974958e4b4e..54ee8e11341b18b7a7711335eaf3c4874d0da443 100644
--- a/src/arch/posix/arch.cc
+++ b/src/arch/posix/arch.cc
@@ -10,4 +10,8 @@ void Arch::idle_loop(void)
 	}
 }
 
+void Arch::idle(void)
+{
+}
+
 Arch arch;