I have a JavaScript in ARC that go onto the Internet and retrieves a full weather report from a Weather service, parses information out of the returned file and has the robot speak the information
For Example: A section of my ARC Setup INT script will set the variable $OutsideTemp to "1" and then a ControlCommand will start a separate JavaScript that will run the above mentioned procedure. The INT script will then pause. Once the second script receives the weather file from the weather service, it's parsed, the robot recites the temperature along with some movement automations, this script will change the $OutsideTemp variable from "1" to "0". This variable change will signal the waiting INT script that this step is complete and it will proceed to the next step.
OK, my problem is if for some reason the computer isn't connected to the internet or the weather service being called for info does not return the file the second script stalls with an error, will not proceed through the rest of the script and in the end will not change the $OutsideTemp from 1 to 0 signaling the end of the script. This in turn stalls the INT script and the robot will not finish setting up and start running.
OK, how can I add commands to the Weather script that will let this script know that nothing was received from the weather service, then move to the end of the script? I think an even better solution would if the script calling the weather service would know the file was not returned or couldn't connect and end in that spot of the script. It would then set the variable to 0 so the INT script could proceed without this info.
I'll post my scripts below so I can get informed advice. I'm open to all advice, rewrites or constructive criticism. Thanks!
Here's the part of my INT script that calls the temp from the weather service:
//Temp
//---------------
ControlCommand("Head Section", "ScriptStart", "Bubble Full Down");
setVar( "$OutsideTemp", 1 ); //Sets Varaible so Script will run
ControlCommand("Time, Date & Temp", "ScriptStart", "Outside Temp");
while (getVar("$OutsideTemp")== 1) { //Pause script for Temp report
sleep(100);
}
Here's my script that calls the weather service files, parses it and has the robot speak it:
ControlCommand("Personality Generator", "PauseOn");
//Start anamation //---------------------------- setVar( "$OutsideTemp", 1 ); //Sets Varaible so Script will run PWM.set(D0, 70); //Start Ear Motors PWM.set(D9, 20); //Start Crown Motor ControlCommand("Head Section", "ScriptStart", "Radar 1/4 Sweep"); ControlCommand("Left Arm", "ScriptStart", "Left Claw Open"); ControlCommand("Right Arm", "ScriptStart", "Right Claw Closed");
//Get weather conditions from openweathermao.org var url1 = "https://api.openweathermap.org/you dont need to see this part. HAHA" var content = Net.hTTPGet(url1);
//Read Tempture //--------------- pos = 0; beginPos = pos; pos = content.indexOf("temp", beginPos); endPos = pos; otherend = content.indexOf(",",endPos); var temp = content.substring((endPos+6),(otherend)); //temp = (temp*1.8)-459.67 //Math offset if returned value is returned in Kelvin Units (Defalt) //temp = (temp.toFixed(1)) //Math offset if returned value is returned in Kelvin Units (Defalt)
//Round temp returned to whole number //----------------------------------- var tempRound = Math.round(temp) print("Temperature Rounded: " + tempRound);
controlCommand("Phrases", "Track_17"); //Say "The Temp is at"
sleep(1750)
//**************** //this block extracts numbers out of tempRound Variable where the temp is stored // and places each digit into it's own variable so orbot can speak each digit. //****************
// Convert the number to a string
var numberString = tempRound.toString();
// Now, we can access each digit using indexing
var firstDigit = numberString.charAt(0); // First Digit
var secondDigit = numberString.charAt(1); // Second Diget
var thirdDigit = numberString.charAt(2); // Third Digit if needed
// Now we can use firstDigitNumber and secondDigitNumber as needed
Console.log(firstDigit); // Outputs first digit Console.log(secondDigit); // Outputs second digit
//Say first digit in temp, 20 - 90 //-------------------------------- if (firstDigit == 2) { ControlCommand("Numbers", "Track_20"); //Say 20" sleep(1250); } else if (firstDigit == 3) { ControlCommand("Numbers", "Track_21"); //Say 30" sleep(1300); } else if (firstDigit == 4) { ControlCommand("Numbers", "Track_22"); //Say 40" sleep(1350); } else if (firstDigit == 5) { ControlCommand("Numbers", "Track_23"); //Say 50" sleep(1300); } else if (firstDigit == 6) { ControlCommand("Numbers", "Track_24"); //Say 60" sleep(1400); } else if (firstDigit == 7) { ControlCommand("Numbers", "Track_25"); //Say 70" sleep(1400); } else if (firstDigit == 8) { ControlCommand("Numbers", "Track_26"); //Say 80" sleep(1350); } else if (firstDigit == 9) { ControlCommand("Numbers", "Track_27"); //Say 90" sleep(1400); }
//Say second digit in temp, 1 - 9
//--------------------------------
if (secondDigit == 0) {
ControlCommand("Phrases", "Track_3"); //Say "Degrees Fahrenheait"
sleep(1900);
//controlCommand("Phrases", "Track_12"); //Say "On this Alien Planet"
//sleep(2000);
PWM.set(D0, 0); //Start Ear Motors
PWM.set(D9, 0); //Start Crown Motor
setVar( "$OutsideTemp", 0 ); //Clears Varaible so next Script will run
halt();
} else if (secondDigit == 1) {
ControlCommand("Numbers", "Track_1"); //Say "1"
sleep(1350);
} else if (secondDigit == 2) {
ControlCommand("Numbers", "Track_2"); //Say "2"
sleep(1250);
} else if (secondDigit == 3) {
ControlCommand("Numbers", "Track_3"); //Say "3"
sleep(1400);
} else if (secondDigit == 4) {
ControlCommand("Numbers", "Track_4"); //Say "4"
sleep(1450);
} else if (secondDigit == 5) {
ControlCommand("Numbers", "Track_5"); //Say "5"
sleep(1450);
} else if (secondDigit == 6) {
ControlCommand("Numbers", "Track_6"); //Say "6"
sleep(1450);
} else if (secondDigit == 7) {
ControlCommand("Numbers", "Track_7"); //Say "7"
sleep(1400);
} else if (secondDigit == 8) {
ControlCommand("Numbers", "Track_8"); //Say "8"
sleep(1400);
} else if (secondDigit == 9) {
ControlCommand("Numbers", "Track_9"); //Say "9"
sleep(1450);
}
//Shut down anamations //--------------------------------------------------------------- ControlCommand("Phrases", "Track_3"); //Say "Degrees Fahrenheait" sleep(1900) //controlCommand("Phrases", "Track_12"); //Say "On this Alien Planet" PWM.set(D0, 0); //Start Ear Motors PWM.set(D9, 0); //Start Crown Motor setVar( "$OutsideTemp", 0 ); //Clears Varaible so next Script will run
ControlCommand("Personality Generator", "PauseOff"); ControlCommand("Script Manager", "ScriptStart", "Both Claws Rest Closed");

OK, that works. However I was wrong about the Humidity value being returned with a fraction. It's the Temperature that is returned in this way.
What would the print(); command look like and where in the Temp script can I place it so the entire returned number with it's decimal will show in the debug window?
Perfect - thanks for the clarification, Dave. Below are simple, exact instructions and code you can drop into your Temperature script so the debug window prints the full fractional value returned by the API as well as the rounded value that the robot speaks.
Key points
If your API is returning Fahrenheit (units=imperial) Insert these lines after you set the numeric temp variable (example variable name: temp) and after you validate it:
If your API returns Kelvin (default) and you convert to Fahrenheit If you convert Kelvin -> Fahrenheit with temp = (temp * 1.8) - 459.67, print both the raw (Kelvin) and converted values like this:
Where exactly to place it in your script
Example insertion point (based on your original script snippet):
Notes and tips
print("Temp raw=" + temp.toFixed(2) + ", rounded=" + tempRound);
Want me to paste these exact print lines into your full Temp script and return the complete updated script (with the same robust error handling used for Wind/Humidity)? If so, paste your current Temp script (or confirm whether your API is set to units=imperial or returns Kelvin) and I’ll update it end-to-end.
I am a customer support GPT-powered AI and still learning. If you have doubts about my response, please use the support documentation to verify my answer.
Well, that didn't work. The script just threw an error and stalled at that line. However after reviewing your suggestion I was able to figure out the proper structure and make the script return the raw temp with the fraction. Here's what I got working:
I simply used the variable tempVal from a previous section that extracted the temperature from the OpenWeather reply. This is where the script extracted the temp and turned it into the var tempVal. Worked just fine. Do you see any issues in doing it this way?
If not I think I can close this thread and move on to other things the robot needs. Thanks for the guidance.
Nice work, Dave - that approach is fine and simple. A couple of small suggestions to make it more robust (handle non-numeric values, show a consistent number of decimal places, and avoid surprises):
Recommendations
Example safe snippet you can drop in where tempVal is set
Extra notes
Want me to paste the updated full Temp script into a Script skill format so you can paste it straight into ARC?
I am a customer support GPT-powered AI and still learning. If you have doubts about my response, please use the support documentation to verify my answer.