Arduino - Anropa hemsida

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
GeekJoan
Admin
Inlägg: 10642
Blev medlem: 26 maj 2003, 15:59:27
Ort: Solna

Re: Arduino - Anropa hemsida

Inlägg av GeekJoan »

Funkar bra! :tumupp:
Användarvisningsbild
GeekJoan
Admin
Inlägg: 10642
Blev medlem: 26 maj 2003, 15:59:27
Ort: Solna

Re: Arduino - Anropa hemsida

Inlägg 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"] . " ";			
   		}
?>
Användarvisningsbild
Mickecarlsson
EF Sponsor
Inlägg: 3746
Blev medlem: 15 april 2017, 18:06:15
Ort: Malmö
Kontakt:

Re: Arduino - Anropa hemsida

Inlägg 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";
}
?>
Senast redigerad av Mickecarlsson 7 april 2018, 10:16:11, redigerad totalt 1 gång.
Användarvisningsbild
Mickecarlsson
EF Sponsor
Inlägg: 3746
Blev medlem: 15 april 2017, 18:06:15
Ort: Malmö
Kontakt:

Re: Arduino - Anropa hemsida

Inlägg 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
Användarvisningsbild
GeekJoan
Admin
Inlägg: 10642
Blev medlem: 26 maj 2003, 15:59:27
Ort: Solna

Re: Arduino - Anropa hemsida

Inlägg av GeekJoan »

Användarvisningsbild
GeekJoan
Admin
Inlägg: 10642
Blev medlem: 26 maj 2003, 15:59:27
Ort: Solna

Re: Arduino - Anropa hemsida

Inlägg 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
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
GeekJoan
Admin
Inlägg: 10642
Blev medlem: 26 maj 2003, 15:59:27
Ort: Solna

Re: Arduino - Anropa hemsida

Inlägg 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
Användarvisningsbild
GeekJoan
Admin
Inlägg: 10642
Blev medlem: 26 maj 2003, 15:59:27
Ort: Solna

Re: Arduino - Anropa hemsida

Inlägg av GeekJoan »

Går det att skriva flera trafficareaname=Stockholm i samma sökning? Typ:
trafficareaname=Stockholm,Uppland eller
trafficareaname=Stockholm&trafficareaname=Uppland?
Maalobs
Inlägg: 1299
Blev medlem: 3 februari 2005, 14:35:15
Ort: Stockholm

Re: Arduino - Anropa hemsida

Inlägg 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.
Användarvisningsbild
Mickecarlsson
EF Sponsor
Inlägg: 3746
Blev medlem: 15 april 2017, 18:06:15
Ort: Malmö
Kontakt:

Re: Arduino - Anropa hemsida

Inlägg 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>";
   } 
?>


Senast redigerad av Mickecarlsson 9 april 2018, 06:41:47, redigerad totalt 1 gång.
Användarvisningsbild
Mickecarlsson
EF Sponsor
Inlägg: 3746
Blev medlem: 15 april 2017, 18:06:15
Ort: Malmö
Kontakt:

Re: Arduino - Anropa hemsida

Inlägg 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>";
   } 
?>
Senast redigerad av Mickecarlsson 9 april 2018, 06:42:14, redigerad totalt 1 gång.
Användarvisningsbild
GeekJoan
Admin
Inlägg: 10642
Blev medlem: 26 maj 2003, 15:59:27
Ort: Solna

Re: Arduino - Anropa hemsida

Inlägg 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
Kulla
Inlägg: 1264
Blev medlem: 7 januari 2010, 10:06:11
Ort: Sandared
Kontakt:

Re: Arduino - Anropa hemsida

Inlägg av Kulla »

Du skulle kunna skriva så här kanske

Kod: Markera allt

echo "Datum: " . date( "d/m H:i", $tiden[1] ) . " ";
Användarvisningsbild
GeekJoan
Admin
Inlägg: 10642
Blev medlem: 26 maj 2003, 15:59:27
Ort: Solna

Re: Arduino - Anropa hemsida

Inlägg 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
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Kulla
Inlägg: 1264
Blev medlem: 7 januari 2010, 10:06:11
Ort: Sandared
Kontakt:

Re: Arduino - Anropa hemsida

Inlägg 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.
Skriv svar