diff --git a/include/esp8266/driver/stdout.h b/include/esp8266/driver/stdout.h
index 5a750967214ddf9c1c0b13053469482072d9cc77..038de2e9c51bf2863414cea2051c0d0b0a27e4c4 100644
--- a/include/esp8266/driver/stdout.h
+++ b/include/esp8266/driver/stdout.h
@@ -14,6 +14,8 @@ class StandardOutput {
 		void put(char c);
 		void write(const char *s);
 		void flush() {}
+		void printf_uint8(unsigned char num);
+		void printf_float(float num);
 
 		StandardOutput & operator<<(char c);
 		StandardOutput & operator<<(unsigned char c);
diff --git a/src/arch/esp8266/driver/stdout.cc b/src/arch/esp8266/driver/stdout.cc
index 9638a815d02ec08cad989e9777a7404610603a7d..2064b38fe37636fd4b14ec81387ea5a063a15d48 100644
--- a/src/arch/esp8266/driver/stdout.cc
+++ b/src/arch/esp8266/driver/stdout.cc
@@ -141,6 +141,41 @@ void StandardOutput::setBase(uint8_t b)
 	}
 }
 
+static inline char format_hex_nibble(uint8_t num)
+{
+	if (num > 9) {
+		return 'a' + num - 10;
+	}
+	return '0' + num;
+}
+
+void StandardOutput::printf_uint8(uint8_t num)
+{
+	put(format_hex_nibble(num / 16));
+	put(format_hex_nibble(num % 16));
+}
+
+void StandardOutput::printf_float(float num)
+{
+	if (num < 0) {
+		put('-');
+		num *= -1;
+	}
+	if (num > 1000) {
+		put('0' + (((int)num % 10000) / 1000));
+	}
+	if (num > 100) {
+		put('0' + (((int)num % 1000) / 100));
+	}
+	if (num > 10) {
+		put('0' + (((int)num % 100) / 10));
+	}
+	put('0' + ((int)num % 10));
+	put('.');
+	put('0' + ((int)(num * 10) % 10));
+	put('0' + ((int)(num * 100) % 10));
+}
+
 // FLUSH
 StandardOutput & flush(StandardOutput & os)
 {