yr weather sensor parser gav fel temperatur i infobox

http://karpero.mine.nu/ha

Moderators: tom_rosenback, Daniel, Telldus

Post Reply
aryan
Posts: 84
Joined: Thu Jan 18, 2018 11:08 am

yr weather sensor parser gav fel temperatur i infobox

Post by aryan » Thu Jan 18, 2018 11:08 am

Hej

Om man använder yr.no som sensor får man fel värden som tabellen tempsensors kolumn lastreading, dvs värderna är rätt men de ligger i framtiden och när lastreading värdet t ex används i info boxen får man alltså temperaturen som yr tror att det blir inte värden som ska gälla just då.

Har försökt hitta var och hur tempsensors tabellen uppdateras så att man skulle kunna ändra men har inte hitta det så enkelt men hittade på ett hack med en scheduled event i mysql databasen som uppdaterar lastreading var 10:e minut med närmast (om 5 minuter) temperaturvärde ur temps tabellen

Code: Select all

CREATE 
	EVENT `current_temps` 
	ON SCHEDULE EVERY 10 MINUTE 
		COMMENT 'copy current values from temps.temp_c to tempsensors.last_reading.' 
		DO
		UPDATE HomeAutomation.tempsensors s,
			(SELECT sensor_serial, temp_c  FROM 
				(SELECT * FROM HomeAutomation.temps 
					WHERE DATE <= DATE_ADD(NOW(), INTERVAL 1 HOUR) AND DATE > DATE_SUB(NOW(), INTERVAL 1 HOUR)  
					ORDER BY abs(TIMEDIFF((NOW() + INTERVAL 5 MINUTE),DATE)) ) 
				AS t1 GROUP BY sensor_serial
			) AS t2
		SET s.last_reading = t2.temp_c
		WHERE t2.sensor_serial = s.serial;
Men det finns nog bättre lösningar antar jag.

/Aryan

Daniel
Posts: 313
Joined: Thu Jan 18, 2018 11:08 am

Re: yr weather sensor parser gav fel temperatur i infobox

Post by Daniel » Thu Jan 18, 2018 11:08 am

Hmmm... Funkar det om du använder någon annan extern temperaturkälla, t ex temperatur.nu? Misstänker att det kan vara så att det kan vara hämtningen av extern temperatur över huvud taget som krånglar. Jag själv har inte använt den på länge, skulle tro att samma sak gäller för Tom.

/Daniel
Senaste info och release om/av HomeAutomation hittas här http://karpero.mine.nu/ha
Latest info and release of HomeAutomation can be found here http://karpero.mine.nu/ha

aryan
Posts: 84
Joined: Thu Jan 18, 2018 11:08 am

Re: yr weather sensor parser gav fel temperatur i infobox

Post by aryan » Thu Jan 18, 2018 11:08 am

Tack för dit svar! Felet beror nog på att jag hade en egen yr parser som laddar in temperatur och väderförhållanden prognosen timme för timme. Såg nu att den standard yr parser endast hämtar aktuell temperatur ur xml filen (och även cachar den lokalt så att den inte hämtas s ofta). Därför fick jag också temperaturen från “framtiden” i infoboxen.

Eftersom jag gillar ha med prognosen i databasen vill jag jag gärna ha kvar en yr parser som gör det. Försökte förstå hur jag skulle kunna ändra koden i parser/system/yr.php funkar men fastnade på vägen
Här på rad 40

Code: Select all

						$sensorReading = array("sensor_serial" => "yr-forecast-".$sensor,
									"temp_c"	=> $value,
									"date"		=> "now");
						writeReading($sensorReading);
borde nog bli något i stil med

Code: Select all

				$sensorReading = array("sensor_serial" => $sensorserial,
										"temp_c"	=> $value,
										"date"		=> $datehour); // te x '2017-01-24 11:00:00' från xml filen
						writeReading($sensorReading);
Men det funkar inte ändå för funktion writeReading verkar ersätta värdet för date med now()?
Tror att jag hittade funktionen i system/classes/Sensors.php på rad 174
public static function writeReading($sensorId, $serial, $value, $name = "") {
………
………

Code: Select all

			$params = array(
				new dbParam(dbParamType::$STRING, "sensor_serial", $serial),
				new dbParam(dbParamType::$DOUBLE, "temp_c", $value),
				new dbParam(dbParamType::$STRING, "date", dbParam::now())
			);
Antar att den funktionen då också skulle kunna ta in date som parameter, typ så här:
function writeReading($sensorId, $serial, $value, $date="", $name = "") {
……
……
och sedan typ

Code: Select all

if($date ==''){$date = date("Y-m-d H:i:s”);}
			$params = array(
				new dbParam(dbParamType::$STRING, "sensor_serial", $serial),
				new dbParam(dbParamType::$DOUBLE, "temp_c", $value),
				new dbParam(dbParamType::$STRING, "date", $date)
			);
och sedan finns längre ner något som jag antar sätter in aktuell temp i tabellen temsensors:

Code: Select all

			$params = array(
				new dbParam(dbParamType::$DOUBLE, "last_reading", $value),
				new dbParam(dbParamType::$INTEGER, "last_reading_id", $id),
				new dbParam(dbParamType::$DOUBLE, "previous_reading", $sensorData[0]["last_reading"])
			);
			$db->save("tempsensors", $params, $sensorData[0]["id"]);
Den skulle då också behöva kompletteras vilkoret att $date == tid just nu (inom några minuter)

Men jag gav upp där och gjorde i stället en fulsnabb lösning där yr.php nu skriver in värderna i databasen direkt. Det funkar nu och med scheduled event i mysql databasen som uppdaterar lastreading som jag skrev om innan.

/Aryan

Post Reply