Sida 3 av 8

Re: Arduino - Anropa hemsida

Postat: 7 april 2018, 02:30:10
av GeekJoan
Funkar bra! :tumupp:

Re: Arduino - Anropa hemsida

Postat: 7 april 2018, 05:33:33
av GeekJoan
Snabbis fråga:
Försöker modifiera din kod för att passa ett annat json anrop, men jag får inte ut ett skit. Har jag inte med [0] så blir det massa errors. Men antar att det är där felet är. ?

http://api.sr.se/api/v2/traffic/message ... me=uppland

Kod: Markera allt

<?php
$json = file_get_contents('http://api.sr.se/api/v2/traffic/messages?format=json&trafficareaname=uppland');
   $bussar = json_decode($json,true);
   
   	$antal_bussar = count($bussar["messages"][0]["id"]);
    for ($i =0; $i < $antal_bussar; $i++)
   {
			echo " " . $bussar["messages"][0]["id"][$i]["title"] . " ";
			echo " " . $bussar["messages"][0]["id"][$i]["description"] . " ";			
   		}
?>

Re: Arduino - Anropa hemsida

Postat: 7 april 2018, 10:09:12
av Mickecarlsson
Den sidan på SR var så bra att jag skrev om koden, om du studerar den kan du se hur det parsas.

Kod: Markera allt

<?php
/*
* Exempelkod skriven av Mikael Carlsson för att parsa JSON från API levererad av Sveriges Radio
* Jag skrev denna kod till geekjoan på Elektronikforumet och insåg att den fungerar så bra att 
* jag kommer att använda den i min egen miljö här hemma för att se trafiken innan jag kör till jobb
* Licens: public domain
*/
   // Kategorierna och prioriteterna kommer från SR's hemsida:
   // http://sverigesradio.se/api/documentation/v2/metoder/trafik.html
   $kategorier = array("Vägtrafik", "Kollektivtrafik", "Planerad störning", "Övrigt");
   $prioritet = array("Mycket allvarlig händelse", "Stor händelse", "Störning", "Information", "Mindre störning");
   // Hämta trafikinformation från Sveriges Radio API-sida
   $json = file_get_contents('http://api.sr.se/api/v2/traffic/messages?format=json&trafficareaname=uppland');
   // Dekoda det som en array
   $trafik = json_decode($json,true);
   // Ta bort denna remark för att dumpa ut det i råformat, hjälper vid debug
   //var_dump($trafik);

   // Det är SR som har Copyrighten, visa den
   echo $trafik["copyright"] . "\n\n";
   // Leta upp hur många meddelanden det finns i strängen från SR
   $antal_meddelanden = count($trafik["messages"]);
   echo "Antal meddelanden: " . $antal_meddelanden . "\n";
   // Loopa igenom alla meddelanden
   for ($i =0; $i < $antal_meddelanden; $i++)
      {
      // Skriv ut id
   	echo "ID: " . $trafik["messages"][$i]["id"] . "\n";
      // Skriv ut prioriteten i klartext
   	echo "Prioritet: " . $prioritet[$trafik["messages"][$i]["priority"]] . "\n";
      // Skriv ut titeln, är synonymt med orten i anropet ovan
   	echo "Titel: " . $trafik["messages"][$i]["title"] . "\n";
      // Bearbeta datumsträngen för att rätta till formatet, därav preg_match
      preg_match( "#/Date\((\d{10})\d{3}(.*?)\)/#", $trafik["messages"][$i]["createddate"], $tiden );
      // Skriv ut datum och tid i RFC 2822 format, ändra enligt php date() för att få annat format
      echo "Datum: " . date( "r", $tiden[1] ) . "\n";
      // Skriv ut koordinaterna, jag hade en färdig rutin för detta, ser snyggare ut :-)
   	echo "Koordinater: ";
      print_DDDMMMMM($trafik["messages"][$i]["latitude"], $trafik["messages"][$i]["longitude"]);
      // Skriv ut trafikstörningen
      echo "Beskrivning: " . $trafik["messages"][$i]["description"] . "\n";
      // Skriv ut vilken kategori det är (i klartext)
      echo "Kategori: " . $kategorier[$trafik["messages"][$i]["category"]] . "\n";
      // Här kommer vad som orsakar störningen
      echo "Orsak: " . $trafik["messages"][$i]["subcategory"] . "\n";
      echo "\n";
      }

/*************************************************************************
* Function name: print_DDDMMMMM()                                        *
* Purpose: Convert and print DDD MM.MMM coordinates                      *
* Parameters: lat and lon                                     *
* Returns: Nothing                                                       *
*************************************************************************/
   function print_DDDMMMMM($lat, $lon) {
   $dec_degrees_lat = intval($lat);
   $dec_degrees_lon = intval($lon);
   $dec_minutes_lat = $lat - $dec_degrees_lat;
   $dec_minutes_lon = $lon - $dec_degrees_lon;
   $minutes_lat = $dec_minutes_lat * 60;
   $minutes_lon = $dec_minutes_lon * 60;

   echo "N".$dec_degrees_lat;
   echo " ";
   printf ("%2.3f",$minutes_lat);
   echo " ";
   echo "E".$dec_degrees_lon;
   echo " ";
   printf ("%2.3f",$minutes_lon);
   echo "\n";
}
?>

Re: Arduino - Anropa hemsida

Postat: 7 april 2018, 10:15:06
av Mickecarlsson
Och givetvis stöds inte skåne :evil:
http://api.sr.se/api/v2/traffic/areas
Norrbotten
Västerbotten
Västernorrland
Jämtland
Gävleborg
Dalarna
Uppland
Västmanland
Örebro
Värmland

Re: Arduino - Anropa hemsida

Postat: 7 april 2018, 15:54:41
av GeekJoan

Re: Arduino - Anropa hemsida

Postat: 7 april 2018, 16:05:53
av GeekJoan
Funderar på en grej. Du använder /n som jag använder <br>. Men på min server så blir det inga radbrytningar. Har det med någon inställning att göra eller tänker jag fel?
php.png

Re: Arduino - Anropa hemsida

Postat: 7 april 2018, 17:20:10
av GeekJoan
Tyckte det var konstigt att det inte var mer info om Stockholm än det var. Så såg jag i botten att det är flera sidor. Fick lägga till pagination=false för att få allt på samma sida:
http://api.sr.se/api/v2/traffic/message ... tion=false

Re: Arduino - Anropa hemsida

Postat: 7 april 2018, 17:27:29
av GeekJoan
Går det att skriva flera trafficareaname=Stockholm i samma sökning? Typ:
trafficareaname=Stockholm,Uppland eller
trafficareaname=Stockholm&trafficareaname=Uppland?

Re: Arduino - Anropa hemsida

Postat: 8 april 2018, 05:31:37
av Maalobs
GeekJoan skrev:Funderar på en grej. Du använder /n som jag använder <br>. Men på min server så blir det inga radbrytningar. Har det med någon inställning att göra eller tänker jag fel?
Han kanske kör scriptet direkt från kommandoraden, medan du kör det från en webläsare.
Radmatningar filtreras bort i webläsarens presentation, så du måste använda <br> istället, eller så wrappar du hela din output inom <pre> och </pre>, då kommer din webläsare att släppa igenom radmatningarna.

Re: Arduino - Anropa hemsida

Postat: 8 april 2018, 08:52:13
av Mickecarlsson
Stämmer, jag kör skriptet i shell, går snabbare att testa då :D
Här är koden omgjord för html, jag har testat från en webserver att det funkar.

Kod: Markera allt

<?php
/*
* Exempelkod skriven av Mikael Carlsson för att parsa JSON från API levererad av Sveriges Radio
* Jag skrev denna kod till geekjoan på Elektronikforumet och insåg att den fungerar så bra att 
* jag kommer att använda den i min egen miljö här hemma för att se trafiken innan jag kör till jobb
* Licens: public domain
* Version 0.1 - första release
* Version 0.2 - gjorde om till html
*/
   // Sätt UTF-8 som teckentabell sidan ska presenteras, fixar till åäö
   // OBS! Måste skickas först, annars skickar webservern ut egna headers
   header('Content-Type: text/html; charset=utf-8');

   // Kategorierna och prioriteterna kommer från SR's hemsida:
   // http://sverigesradio.se/api/documentation/v2/metoder/trafik.html
   $kategorier = array("Vägtrafik", "Kollektivtrafik", "Planerad störning", "Övrigt");
   $prioritet = array("Mycket allvarlig händelse", "Stor händelse", "Störning", "Information", "Mindre störning");
   // Hämta trafikinformation från Sveriges Radio API-sida
   $json = file_get_contents('http://api.sr.se/api/v2/traffic/messages?format=json&trafficareaname=uppland');
   // Dekoda det som en array
   $trafik = json_decode($json,true);
   // Ta bort denna remark för att dumpa ut det i råformat, hjälper vid debug
   //var_dump($trafik);

   // Det är SR som har Copyrighten, visa den
   echo "<h4>" . $trafik["copyright"] . "</h4></br></br>";
   // Leta upp hur många meddelanden det finns i strängen från SR
   $antal_meddelanden = count($trafik["messages"]);
   echo "<b>Antal meddelanden: </b>" . $antal_meddelanden . "</br>";
   // Loopa igenom alla meddelanden
   for ($i =0; $i < $antal_meddelanden; $i++)
      {
      // Skriv ut id
   	echo "<b>ID: </b>" . $trafik["messages"][$i]["id"] . "</br>";
      // Skriv ut prioriteten i klartext
   	echo "<b>Prioritet: </b>" . $prioritet[$trafik["messages"][$i]["priority"]] . "</br>";
      // Skriv ut titeln, är synonymt med orten i anropet ovan
   	echo "<b>Titel: </b>" . $trafik["messages"][$i]["title"] . "</br>";
      // Bearbeta datumsträngen för att rätta till formatet, därav preg_match
      preg_match( "#/Date\((\d{10})\d{3}(.*?)\)/#", $trafik["messages"][$i]["createddate"], $tiden );
      // Skriv ut datum och tid i RFC 2822 format, ändra enligt php date() för att få annat format
      echo "<b>Datum: </b>" . date( "r", $tiden[1] ) . "</br>";
      // Skriv ut koordinaterna, jag hade en färdig rutin för detta, ser snyggare ut :-)
   	echo "<b>Koordinater: </b>";
      print_DDDMMMMM($trafik["messages"][$i]["latitude"], $trafik["messages"][$i]["longitude"]);
      // Skriv ut trafikstörningen
      echo "<b>Beskrivning: </b>" . $trafik["messages"][$i]["description"] . "</br>";
      // Skriv ut vilken kategori det är (i klartext)
      echo "<b>Kategori: </b>" . $kategorier[$trafik["messages"][$i]["category"]] . "</br>";
      // Här kommer vad som orsakar störningen
      echo "<b>Orsak: </b>" . $trafik["messages"][$i]["subcategory"] . "</br>";
      echo "</br>";
      }

/******************************************************
* Function name: print_DDDMMMMM()                     *
* Purpose: Convert and print DDD MM.MMM coordinates   *
* Parameters: lat and lon                             *
* Returns: Nothing                                    *
*******************************************************/
   function print_DDDMMMMM($lat, $lon) {
      $dec_degrees_lat = intval($lat);
      $dec_degrees_lon = intval($lon);
      $dec_minutes_lat = $lat - $dec_degrees_lat;
      $dec_minutes_lon = $lon - $dec_degrees_lon;
      $minutes_lat = $dec_minutes_lat * 60;
      $minutes_lon = $dec_minutes_lon * 60;

      echo "N".$dec_degrees_lat;
      echo " ";
      printf ("%2.3f",$minutes_lat);
      echo " ";
      echo "E".$dec_degrees_lon;
      echo " ";
      printf ("%2.3f",$minutes_lon);
      echo "</br>";
   } 
?>



Re: Arduino - Anropa hemsida

Postat: 8 april 2018, 09:09:30
av Mickecarlsson
GeekJoan skrev:Går det att skriva flera trafficareaname=Stockholm i samma sökning? Typ:
trafficareaname=Stockholm,Uppland eller
trafficareaname=Stockholm&trafficareaname=Uppland?
Jodå, fixade till det, du lägger bara in de orter du vill kolla i arrayn $orter

Kod: Markera allt

<?php
/*
* Exempelkod skriven av Mikael Carlsson för att parsa JSON från API levererad av Sveriges Radio
* Jag skrev denna kod till geekjoan på Elektronikforumet och insåg att den fungerar så bra att 
* jag kommer att använda den i min egen miljö här hemma för att se trafiken innan jag kör till jobb
* Licens: public domain
* Version 0.1 - första release
* Version 0.2 - gjorde om till html
* version 0.3 - fler orter
*/
   // Sätt UTF-8 som teckentabell sidan ska presenteras, fixar till åäö
   // OBS! Måste skickas först, annars skickar webservern ut egna headers
   header('Content-Type: text/html; charset=utf-8');
   // Orter som ska kollas
   $orter = array("uppland", "stockholm");
   // Kategorierna och prioriteterna kommer från SR's hemsida:
   // http://sverigesradio.se/api/documentation/v2/metoder/trafik.html
   $kategorier = array("Vägtrafik", "Kollektivtrafik", "Planerad störning", "Övrigt");
   $prioritet = array("Mycket allvarlig händelse", "Stor händelse", "Störning", "Information", "Mindre störning");
   // Hämta trafikinformation från Sveriges Radio API-sida
   $antal_orter = count($orter);
   for ($o = 0; $o < $antal_orter; $o++)
      {
      $json = file_get_contents('http://api.sr.se/api/v2/traffic/messages?format=json&trafficareaname=' . $orter[$o]);
      // Dekoda det som en array
      $trafik = json_decode($json,true);
      // Ta bort denna remark för att dumpa ut det i råformat, hjälper vid debug
      //var_dump($trafik);

      // Det är SR som har Copyrighten, visa den
      echo "<h4>" . $trafik["copyright"] . "</h4>";
      // Skriv ut orten
      echo "<b>Ort: </b>" . $orter[$o] . "</br>";
      // Leta upp hur många meddelanden det finns i strängen från SR
      $antal_meddelanden = count($trafik["messages"]);
      echo "<b>Antal meddelanden: </b>" . $antal_meddelanden . "</br>";
      // Loopa igenom alla meddelanden
      for ($i =0; $i < $antal_meddelanden; $i++)
         {
         // Skriv ut id
   	   echo "<b>ID: </b>" . $trafik["messages"][$i]["id"] . "</br>";
         // Skriv ut prioriteten i klartext
   	   echo "<b>Prioritet: </b>" . $prioritet[$trafik["messages"][$i]["priority"]] . "</br>";
         // Skriv ut titeln, är synonymt med orten i anropet ovan
   	   echo "<b>Titel: </b>" . $trafik["messages"][$i]["title"] . "</br>";
         // Bearbeta datumsträngen för att rätta till formatet, därav preg_match
         preg_match( "#/Date\((\d{10})\d{3}(.*?)\)/#", $trafik["messages"][$i]["createddate"], $tiden );
         // Skriv ut datum och tid i RFC 2822 format, ändra enligt php date() för att få annat format
         echo "<b>Datum: </b>" . date( "r", $tiden[1] ) . "</br>";
         // Skriv ut koordinaterna, jag hade en färdig rutin för detta, ser snyggare ut :-)
         echo "<b>Koordinater: </b>";
         print_DDDMMMMM($trafik["messages"][$i]["latitude"], $trafik["messages"][$i]["longitude"]);
         // Skriv ut trafikstörningen
         echo "<b>Beskrivning: </b>" . $trafik["messages"][$i]["description"] . "</br>";
         // Skriv ut vilken kategori det är (i klartext)
         echo "<b>Kategori: </b>" . $kategorier[$trafik["messages"][$i]["category"]] . "</br>";
         // Här kommer vad som orsakar störningen
         echo "<b>Orsak: </b>" . $trafik["messages"][$i]["subcategory"] . "</br>";
         echo "</br>";
      } // for $antal_meddelanden
   } // for antal_orter

/******************************************************
* Function name: print_DDDMMMMM()                     *
* Purpose: Convert and print DDD MM.MMM coordinates   *
* Parameters: lat and lon                             *
* Returns: Nothing                                    *
*******************************************************/
   function print_DDDMMMMM($lat, $lon) {
      $dec_degrees_lat = intval($lat);
      $dec_degrees_lon = intval($lon);
      $dec_minutes_lat = $lat - $dec_degrees_lat;
      $dec_minutes_lon = $lon - $dec_degrees_lon;
      $minutes_lat = $dec_minutes_lat * 60;
      $minutes_lon = $dec_minutes_lon * 60;

      echo "N".$dec_degrees_lat;
      echo " ";
      printf ("%2.3f",$minutes_lat);
      echo " ";
      echo "E".$dec_degrees_lon;
      echo " ";
      printf ("%2.3f",$minutes_lon);
      echo "</br>";
   } 
?>

Re: Arduino - Anropa hemsida

Postat: 8 april 2018, 17:31:47
av GeekJoan
Funkar fint.

Fråga: Hur formateras tiden med denna:

Kod: Markera allt

preg_match( "#/Date\((\d{10})\d{3}(.*?)\)/#", $trafik["messages"][$i]["createddate"], $tiden );
echo "Datum: " . date( "r", $tiden[1] ) . " ";
Resultat:
Datum: Wed, 24 Jan 2018 15:15:06 +0100


Känns som man skulle vilja ha den lite kortare typ:
Datum: 24 Jan 15:15
Eller
Datum: 24/01 15:15

Re: Arduino - Anropa hemsida

Postat: 8 april 2018, 20:49:36
av Kulla
Du skulle kunna skriva så här kanske

Kod: Markera allt

echo "Datum: " . date( "d/m H:i", $tiden[1] ) . " ";

Re: Arduino - Anropa hemsida

Postat: 8 april 2018, 22:43:23
av GeekJoan
Det duger.
Jag hade ju tänkt att använda den data som kommer ut till Arduinon, men jag inser att det är för mycket text för att kunna presentera det på ett snyggt sätt. Så jag får göra det till en websida istället och använda en raspberry pi för att presentera resultatet på en vanlig skärm.

MEN.... Då kommer ju ett problem som jag inser att jag inte fixar.
Hur skriver man in phpkoden i html blocken? Dom ingår ju i en loop.
Eller är det lättare att få phpkoden att skriva ut html blocken runt den redan existerande koden?
trafik.png

Re: Arduino - Anropa hemsida

Postat: 8 april 2018, 23:31:20
av Kulla
Inget stoppar dig att göra blandning av den, men fil måste vara .php för att den ska parsas av servern och inte webbläsare

Du kan skriva den echo delen ner i html koden, bara anropa den med <?php echo '<td>något här</td>'; ?> så du kan göra blandning på rätt sätt.

Du kan också använda php loop där, osv.