diff --git a/dbus/dbusconfiguration.cpp b/dbus/dbusconfiguration.cpp
index 9d62643..78cc4e4 100644
--- a/dbus/dbusconfiguration.cpp
+++ b/dbus/dbusconfiguration.cpp
@@ -294,9 +294,9 @@
 
             auto& details = zoneDetailsConfig[index];
             details.minthermalrpm = variant_ns::apply_visitor(
-                VariantToFloatVisitor(), zone.at("MinThermalRpm"));
+                VariantToDoubleVisitor(), zone.at("MinThermalRpm"));
             details.failsafepercent = variant_ns::apply_visitor(
-                VariantToFloatVisitor(), zone.at("FailSafePercent"));
+                VariantToDoubleVisitor(), zone.at("FailSafePercent"));
         }
         auto findBase = configuration.second.find(pidConfigurationInterface);
         if (findBase != configuration.second.end())
@@ -402,29 +402,29 @@
                 else
                 {
                     info.setpoint = variant_ns::apply_visitor(
-                        VariantToFloatVisitor(), base.at("SetPoint"));
+                        VariantToDoubleVisitor(), base.at("SetPoint"));
                 }
                 info.pidInfo.ts = 1.0; // currently unused
                 info.pidInfo.p_c = variant_ns::apply_visitor(
-                    VariantToFloatVisitor(), base.at("PCoefficient"));
+                    VariantToDoubleVisitor(), base.at("PCoefficient"));
                 info.pidInfo.i_c = variant_ns::apply_visitor(
-                    VariantToFloatVisitor(), base.at("ICoefficient"));
+                    VariantToDoubleVisitor(), base.at("ICoefficient"));
                 info.pidInfo.ff_off = variant_ns::apply_visitor(
-                    VariantToFloatVisitor(), base.at("FFOffCoefficient"));
+                    VariantToDoubleVisitor(), base.at("FFOffCoefficient"));
                 info.pidInfo.ff_gain = variant_ns::apply_visitor(
-                    VariantToFloatVisitor(), base.at("FFGainCoefficient"));
+                    VariantToDoubleVisitor(), base.at("FFGainCoefficient"));
                 info.pidInfo.i_lim.max = variant_ns::apply_visitor(
-                    VariantToFloatVisitor(), base.at("ILimitMax"));
+                    VariantToDoubleVisitor(), base.at("ILimitMax"));
                 info.pidInfo.i_lim.min = variant_ns::apply_visitor(
-                    VariantToFloatVisitor(), base.at("ILimitMin"));
+                    VariantToDoubleVisitor(), base.at("ILimitMin"));
                 info.pidInfo.out_lim.max = variant_ns::apply_visitor(
-                    VariantToFloatVisitor(), base.at("OutLimitMax"));
+                    VariantToDoubleVisitor(), base.at("OutLimitMax"));
                 info.pidInfo.out_lim.min = variant_ns::apply_visitor(
-                    VariantToFloatVisitor(), base.at("OutLimitMin"));
+                    VariantToDoubleVisitor(), base.at("OutLimitMin"));
                 info.pidInfo.slew_neg = variant_ns::apply_visitor(
-                    VariantToFloatVisitor(), base.at("SlewNeg"));
+                    VariantToDoubleVisitor(), base.at("SlewNeg"));
                 info.pidInfo.slew_pos = variant_ns::apply_visitor(
-                    VariantToFloatVisitor(), base.at("SlewPos"));
+                    VariantToDoubleVisitor(), base.at("SlewPos"));
             }
         }
         auto findStepwise =
@@ -494,13 +494,13 @@
                 if (findPosHyst != base.end())
                 {
                     info.stepwiseInfo.positiveHysteresis =
-                        variant_ns::apply_visitor(VariantToFloatVisitor(),
+                        variant_ns::apply_visitor(VariantToDoubleVisitor(),
                                                   findPosHyst->second);
                 }
                 if (findNegHyst != base.end())
                 {
                     info.stepwiseInfo.positiveHysteresis =
-                        variant_ns::apply_visitor(VariantToFloatVisitor(),
+                        variant_ns::apply_visitor(VariantToDoubleVisitor(),
                                                   findNegHyst->second);
                 }
                 std::vector<double> readings =
@@ -519,7 +519,7 @@
                 if (readings.size() < ec::maxStepwisePoints)
                 {
                     info.stepwiseInfo.reading[readings.size()] =
-                        std::numeric_limits<float>::quiet_NaN();
+                        std::numeric_limits<double>::quiet_NaN();
                 }
                 std::vector<double> outputs =
                     variant_ns::get<std::vector<double>>(base.at("Output"));
@@ -533,7 +533,7 @@
                 if (outputs.size() < ec::maxStepwisePoints)
                 {
                     info.stepwiseInfo.output[outputs.size()] =
-                        std::numeric_limits<float>::quiet_NaN();
+                        std::numeric_limits<double>::quiet_NaN();
                 }
             }
         }
diff --git a/dbus/dbuswrite.cpp b/dbus/dbuswrite.cpp
index fab9b4a..dff11d6 100644
--- a/dbus/dbuswrite.cpp
+++ b/dbus/dbuswrite.cpp
@@ -61,12 +61,12 @@
 
 void DbusWritePercent::write(double value)
 {
-    float minimum = getMin();
-    float maximum = getMax();
+    double minimum = getMin();
+    double maximum = getMax();
 
-    float range = maximum - minimum;
-    float offset = range * value;
-    float ovalue = offset + minimum;
+    double range = maximum - minimum;
+    double offset = range * value;
+    double ovalue = offset + minimum;
 
     if (oldValue == static_cast<int64_t>(ovalue))
     {
diff --git a/dbus/util.hpp b/dbus/util.hpp
index 1b3a95b..719bb1d 100644
--- a/dbus/util.hpp
+++ b/dbus/util.hpp
@@ -85,23 +85,6 @@
 std::string getMatch(const std::string& type, const std::string& id);
 bool validType(const std::string& type);
 
-struct VariantToFloatVisitor
-{
-    template <typename T>
-    std::enable_if_t<std::is_arithmetic<T>::value, float>
-        operator()(const T& t) const
-    {
-        return static_cast<float>(t);
-    }
-
-    template <typename T>
-    std::enable_if_t<!std::is_arithmetic<T>::value, float>
-        operator()(const T& t) const
-    {
-        throw std::invalid_argument("Cannot translate type to float");
-    }
-};
-
 struct VariantToDoubleVisitor
 {
     template <typename T>
