DS18B20 and Particle Core

This works…change your pin to D0 I think is what it was, fix the includes (use the DS18B20 lib, makes it easier) and you are done. There was no reason to convert your temp to a STRING value since you are only sending the temp in Particle.variable It is tested and reports correct values in Variable and Dashboard. Except for the first publish which I will leave to you to correct the timing on that. You can crank down the publish interval as long as you keep it above 1/second.

// This #include statement was automatically added by the Spark IDE.
#include "OneWire.h"
#include "DS18B20.h"


DS18B20 ds18b20 = DS18B20(D2); //Sets Pin D2 for Water Temp Sensor
char szInfo[64];
float pubTemp;
double celsius;
unsigned int Metric_Publish_Rate = 50000;
unsigned int MetricnextPublishTime;
unsigned int DS18B20nextSampleTime;
unsigned int DS18B20_SAMPLE_INTERVAL = 2000;

void setup() {
    pinMode(D2, INPUT);
    Particle.variable("tempHotWater", &celsius, DOUBLE);
    Serial.begin(9600);
}

void loop() {

  if (millis() > DS18B20nextSampleTime){
  getTemp();
  Serial.print("Temp is: ");
  Serial.println(celsius);
  }

  if (millis() > MetricnextPublishTime){
    Serial.println("Publishing now.");
    publishData();
  }
}

void publishData(){
  sprintf(szInfo, "%2.2f", celsius);
  Particle.publish("dsTmp", szInfo, PRIVATE);
  MetricnextPublishTime = millis() + Metric_Publish_Rate;
}

void getTemp(){
    if(!ds18b20.search()){
      ds18b20.resetsearch();
      celsius = ds18b20.getTemperature();
      DS18B20nextSampleTime = millis() + DS18B20_SAMPLE_INTERVAL;
      Serial.print(celsius);
    }
  }