SetTemperature command with Fahrenheit - google-smart-home

We implemented the TemperatureControl trait to change the SetPointTemperature on an oven.
Is there a way to set the temperature in Fahrenheit instead of Celsius? The trait settings and states are all in Celsius, but isn't there a way to convert the Fahrenheit value to Celsius before sending it to the fulfillment URL?
We're also not sure what the temperatureStepCelsius attribute applies to, as we were able to set the temperature to 31 degrees even though we had a stepsize of 5 degrees.
Could you please assist us with that?
Best,
Frank

The underlying data format for the TemperatureControl trait uses Celsius universally regardless of language and locale.
Keep in mind that this is the underlying data format. When someone says "Set the temperature to 450", depending on their locale, the number will be interpreted as Fahrenheit and converted for you to Celsius. On your end you're guaranteed to get the temperature as Celsius, and can convert it back if necessary.
If they say "Set the temperature to 31 degrees", then it should be expected to work as long as the number is within the temperatureRange attribute. If you are unable to be that specific, you can take the 31 and do whatever stepping is necessary on your end. The temperatureStepCelsius is more for relative commands like "turn up the oven", where "up" is not a number.

Related

Formatting float inputs in C

I am quite new to C programming. Currently doing this CS50 course where the get_float function ensures that my user input is a float.
I use a do while loop to ensure that the input is not negative and if it is, I re-prompt the user for an input.
My question is, is there a way I can reject the users input if the user's input is greater than two decimal places and then re-prompt them for an input.
Thanks in advance.
get_float is a CS50 only term. There is no way to limit the length after the decimal.
Eventually you will switch to scanf which is the real way to get input in c but wait until you reach pointers to worry about that.
Use %.2f when you print the number it will drop off any other decimals.
ex. printf("Your change is %.2f", change)
This would show .02 even if the number was .029
If you need to round up use round(change)
ex. printf("Your change is %.2f", round(change))
this would show .30
you would need to include <math.h> header to use round function.

Floating point convert method

I tried to convert Unsigned 16 type floating point number but I couldn't find which functions or conversation method do I have to use for this.
For example I have 3 decimal numbers and these numbers have came with these hex value
BD97 >>>>>>> 38.84
3098 >>>>>>> 38.96
8497 >>>>>>>> 38.79
I belive these are half precision floating point but couldn't understand how can I convert them.
Is there any body help on this matter?
Update
:
I'm sorry I think I couln't explain clearly. The values I wrote above comes from a kind of serial bus but these values also printed on display. Value from serial bus coming Unsigned16(I think this is special 16bit data type).
For example when I read 0xBD97 from bus, machine display shows 38.84
or when I read 0x3098, display shows 38.96.
The interesting thing is, these hex value which I get from bus seems irrelevant to the data shown on display. So, I thought this data was half precision data but I couldn't find how to convert it.
Thanks
The data being read from the bus does not seem to use a floating-point format. Based on the two data items provided, it seems to be an integer scaled by a factor of 1000. We observe that 8497 = 0x9784 = 38788 → 38.79, and that 3098 = 0x9830 = 38960 → 38.96.

How to convert unsigned magnometer data to Degrees

I know there are a lot of topics in different forums in the web, I understand the differnce between atan and atan2 and how to solve this problem with signed data.
I am using the digilent CMPS2 module which uses the Memsic MMC34160PJ magnetometer.
In the datasheet of chip CMPS2 there is a formula with actan(x/y)*180/pi
It‘s clear that I only get values between 0 and 90 degrees because the sensor delivers only unsigned values.
When I use atan2 I get values between 0 and 180 degrees.
I know it would be easier if I had signed data. But unfortunately the sensor delivers only unsigned values.
How is such a conversion form of unsigned magnometer data 0 to 360 degrees possible?
I haven't used that particular magnetometer myself, but there are a lot of sensors that work in similar ways.
The magnetometer datasheet, page 2, states that the "Null field output" value (that means, the output when there's no magnetic field) is not zero.
Let's say you use 14-bit resolution mode, the null field output value is 8192. That means 8192 is your reference point for zero value, everything above that value is positive, and everything below that value is negative. You should subtract this null field value from each measurement, and you should be ready to go.

Real to Float conversion with no loss of data

I had a table with two columns for coordinates stored in. These columns were REAL datatype, and I noticed that from my application it was only showing 5 decimals for coordinates, and positions were not accurate enough.
I decided to change datatype to FLOAT, so I could use more decimals. It was for my pleasant surprise that when I changed the column data type, the decimals suddenly appeared without me having to store all the coordinates again.
Anyone can tell me why this happens? What happens with the decimal precision on REAL datatype?. Isn´t the data rounded and truncated when inserted? Why when I changed the datatype the precision came up with no loss of data?..
You want to use a Decimal data-type.
Floating point values are caluclated by a value and an exponenent. This allows you have store huge number representations in small amounts of memory. This also means that you don't always get exactly the number you're looking for, just very very close. This is why when you compare floating point values, you compare them within a certain tolerance.
It was for my pleasant surprise that when I changed the column data type, the decimals suddenly appeared without me having to store all the coordinates again.
Be careful, this doesn't mean that the value that was filled in is the accurate value of what you're looking for. If you truncated your original calculation, you need to get those numbers again without cutting off any precision. The values that it autofills when you convert from Real to Float aren't the rest of what you truncated, they are entirely new values which result from adding more precision to the calculation used to populate your Real value.
Here is a good thread that explains the difference in data-types in SQL:
Difference between numeric, float and decimal in SQL Server
Another helpful link:
Bad habits to kick : choosing the wrong data type

Best way to remove integer part of float number

To remove integer part of float numbers i use:
update ACTIVITIES set TIME = TIME - FLOOR(TIME) --TIME is float
this works anyway in the calculation there is some errors due to floating point calculation.
EDIT: I cannot modify the schema, TIME must stay float.
The reason i need to do this is that because of a bug the float numbers become > 1 even if the decimal part is still ok. So i need to remove the integer part.
I cannot reproduce it now, but i remember i had something like:
1.6666666667 becomes 0.6666542534, while it should be 0.6666666667.
Please note that this is legacy code so TIME is a float number, while if i'd write this from scratch i would use a TIME datatype.
So my question is: is this correct or can it be improved?
update ACTIVITIES set TIME = TIME - FLOOR(TIME)

Resources