{"id":23187209,"url":"https://github.com/mrjones-plip/yanpiws","last_synced_at":"2026-01-22T02:26:04.425Z","repository":{"id":49935501,"uuid":"85908813","full_name":"mrjones-plip/YANPIWS","owner":"mrjones-plip","description":"Yet Another Pi Weather Station (YANPIWS) - Use wireless sensors and Pirate Weather to show local temperatures and forecast","archived":false,"fork":false,"pushed_at":"2024-11-10T18:53:32.000Z","size":5489,"stargazers_count":5,"open_issues_count":9,"forks_count":4,"subscribers_count":3,"default_branch":"main","last_synced_at":"2024-11-10T19:43:20.983Z","etag":null,"topics":["bme280","forecast","php","rasberry-pi","rtl","rtl433","weather-station"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mrjones-plip.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"license.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-03-23T05:00:18.000Z","updated_at":"2024-11-10T18:53:36.000Z","dependencies_parsed_at":"2022-08-30T01:10:29.987Z","dependency_job_id":"cb0270e6-feff-4632-a50f-96f497258022","html_url":"https://github.com/mrjones-plip/YANPIWS","commit_stats":null,"previous_names":[],"tags_count":21,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mrjones-plip%2FYANPIWS","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mrjones-plip%2FYANPIWS/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mrjones-plip%2FYANPIWS/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mrjones-plip%2FYANPIWS/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mrjones-plip","download_url":"https://codeload.github.com/mrjones-plip/YANPIWS/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":230252772,"owners_count":18197285,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bme280","forecast","php","rasberry-pi","rtl","rtl433","weather-station"],"created_at":"2024-12-18T10:18:53.351Z","updated_at":"2026-01-22T02:26:04.419Z","avatar_url":"https://github.com/mrjones-plip.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# YANPIWS\nYet Another Pi Weather Station (YANPIWS) - My explorations in getting a Rasberry Pi \nshowing local time and weather:\n\n![](./images/YANPIWS.gif)\n\n## Overview\n\nFor a while I've had a [wireless weather station](http://amzn.to/2nAxo3L).  And for as long as I've \nhad it, it's never quite worked right.  Certainly the part about \n\"Equipped with an atomic clock, time is set automatically via radio\" has *never* worked.  As \nwell, maybe the sunset/sunrise times were accurate once or twice.  The only thing \nthat worked pretty well was the indoor and outdoor temperatures.  I stumbled upon the\n[rtl_433](https://github.com/merbanan/rtl_433) project and I was super stoked\nto DIY a weather station.  \n\nGoals for this project are:\n\n* Use cheap hardware (e.g. Rasberry Pi from 2017)\n* Show live weather from local, wireless sensors\n* Show time\n* Show today's sunset/sunrise times\n* Show weather forecast from a forecast API ([Dark Sky](https://darksky.net/dev/) or  [Pirate Weather](pirateweather.net/))\n\n## Hardware\n\nHere's the parts I used and prices at time of publishing (March 2017):\n\n* $20 - [433 MHz SDR USB dongle](http://amzn.to/2nc5MhX)\n* $13 - [Wireless Temperature sensor](http://amzn.to/2lVdhJ6)\n* $40 - [5\" 800x480 screen](http://amzn.to/2mRjWYT)\n* $43 - [Rasberry Pi 3 Model B and Power Adapter](http://amzn.to/2nklto3)\n* $11 - [8GB Micro SD card](http://amzn.to/2nRE9Pt)\n\nTotal for this is $127, so, erm, not _that_ cheap.  Ideally you'd have a lot of \nparts around you could re-use for this project. As well, you could reduce the price by going with a \n3.5\" screen ([only $17](http://amzn.to/2mCIxlg)) and Pi B+ ([only $30](http://amzn.to/2n5nioJ))\n. For the B+ you'd have to use ethernet or bring your own USB WiFi \nadapter.  I knew I'd have use for a 5\" HDMI monitor, so I was happy to pay the premium.\n\nCaveat Emptor - You'd probably be better off spending even more (ok, not so cheap here any more ;)\non a less janky wireless setup like [z-wave](http://amzn.to/2n3RFLn). I found out the hard way that\nthe IDs of the $13 sensors change every time the sensor batteries die/are changed. ~~As well, the Pi WiFi \nseems to interfere with the USB SDR (I'm inspiring confidence, yeah?!)~~ Turns out I just needed to move\nthe antenna further away from the Pi! Finally, I coded the HTML\nand CSS to work in an 800x480 screen or greater. If you use the cheaper, \nlower resolution screen (480x320), YANPIWS just works thanks to ``@media`` sensing.  \nAs well, it works on mobile devices and desktop devices as well.  All be it, mobile \nworks best in landscape.\n\nIf you want to use the BME/BMP 280 I2C chip instead, this is now supported! So instead of \ngetting the SDR USB dongle and Wireless Temperature Sensora above, instead get \n(prices as of Sep 2019):\n\n* $13 - [BME280 Digital 5V Temperature Humidity Sensor](https://amzn.to/2ZL42yZ)\n* $5.80 - [Breadboard Jumper Wires](https://amzn.to/2Lesc15)\n\nWhile this reduces costs, it also changes how the set up works.  You'll only be able to run one \nsensor on the I2C bus and you'll have to know how to solder.  Finally, check out the alternate\ninstall steps below.\n\n## Install steps\n\nThese steps assume you already have \n[downloaded Buster with Desktop](https://www.raspberrypi.org/downloads/raspbian/) \nto your Pi and it's\n[installed and booting](https://www.raspberrypi.org/documentation/installation/installing-images/README.md),\n [online](https://www.raspberrypi.org/documentation/configuration/wireless/README.md) \n and [accessible via SSH](https://www.raspberrypi.org/documentation/remote-access/ssh/README.md). Further\n be sure your [timezone is correct](https://www.raspberrypi.org/documentation/configuration/raspi-config.md)!\n I recommend using a normal monitor for the install instead of the 5\". It's easier this way. \n \nSpeaking of monitors - this install also assumes you have your 5\" display (or 3.5\" if you \nwent that way (or what ever display you want!)) already working. \n \nThese steps also assume you're using the SDR dongle and wireless temp sensors.  See below for\nBME280 sensors.\n \nAll steps are done as the *Pi User* - be sure you've changed this user's password\nfrom \"raspberry\" ;)\n\n1. Ensure your Pi is current;\n    ```\n    sudo apt update\u0026\u0026 sudo apt dist-upgrade\n    ```\n1. Install rtl, git, apache, php, chrome and chrome utils for doing \nfull screen (some of which may be installed already):\n\n   ```\n   sudo apt-get install -y curl git chromium-browser apache2 php php-curl php-xml unclutter sed rtl-433\n   ```\n   **RTL Note:** If your distro doesn't have the `rtl_433` package available via `apt`, follow these compile/download steps: Download, compile and install [rtl_433](https://github.com/merbanan/rtl_433) or use the faster method cited on [tech.borpin.co.uk](https://tech.borpin.co.uk/2019/12/17/install-a-package-from-the-testing-repository/) which involves adding a testing apt repo.  Note that the last apt call should be `apt install rtl-433` with a dash not an underscore.  Also on that page note that `/etc/apt/preferences` should be `/etc/apt/preferences.d/`. \n1. With your wireless temp sensor(s) powered up and the USB Dongle attached, make sure your \nsensors are read with `rtl_433`. Let it run for a while an note the IDs returned for the later step\nof creating your own config file.  Here we see ID 231:\n    ```\n    pi@raspberrypi:~ $ rtl_433\n    rtl_433 version unknown inputs file rtl_tcp RTL-SDR SoapySDR\n    [SNIP]\n    Sample rate set to 250000 S/s.\n    Tuner gain set to Auto.\n    Tuned to 433.920MHz.\n    Allocating 15 zero-copy buffers\n    _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n    time      : 2020-05-11 00:55:17\n    model     : Fineoffset-WH2                         ID        : 231\n    Temperature: 35.5 C      Humidity  : 1 %           Integrity : CRC\n    _\n    ```\n   If you get an error `usb_open error -3` or `usb_claim_interface error -6`, unplug and \n   replug the USB dongle, that should fix it.\n1. Clone this repo, symlink `html` into `www` and create your own `config.csv`:\n   ```\n   cd\n   git clone https://github.com/Ths2-9Y-LqJt6/YANPIWS.git \n   cd YANPIWS\n   cp config.dist.csv config.csv\n   sudo rm -rf /var/www/html\n   sudo ln -s /home/pi/YANPIWS/html /var/www/html\n   sudo chown -R pi:www-data data\n   sudo chmod -R 775 data\n   ``` \n1. Edit your newly created `config.csv` to have the correct values. \nSpecifically, your latitude (`lat`),\nlongitude (`lon`) and labels which you \ngot in the step above running `rtl_433`. As well, you'll need to sign up for an API key\non [Dark Sky](https://darksky.net/dev/register) or [Pirate Weather](pirateweather.net/) and put that in for the `forecast_api` value below. \nIf you want static icons instead of\nanimated ones, set 'animate' to `false` instead of `true` like below. Here's a sample:\n    ```\n    # edit these two to be your location.  Use one of these if\n    # you need help! https://duckduckgo.com/?q=what's+my+lat+long+finder\n    lat,31.775554\n    lon,-81.822436\n    \n    # check https://www.php.net/manual/en/timezones.php for available timezones\n    timezone,America/Los_Angeles\n    \n    # set your forecast API token from either Dark Sky or Pirate Weather\n    forecast_api_token,aabbccddeeffgghhiijj112233445566\n    \n    # set your provider for forecasts (must end in an:\n    #   pirate weather: https://api.pirateweather.net\n    #   dark sky: https://api.darksky.net\n    forecast_api_url,https://api.pirateweather.net\n    \n    # should we show animated icons for forecast? should be \"true\" or \"false\"\n    animate,true\n    \n    # label ID map to human name. Format is \"labels_\" + ID + \",\" + NAME\n    labels_211,In\n    labels_109,Out\n    \n    # How many temperatures to show on the screen (tested with 1, 2 or 3 - watch out if you do more!)\n    temp_count,2\n    \n    # CSS font sizes\n    font_time_date_wind,35\n    font_temp,50\n    font_temp_label,25\n    \n    # set dark or light theme. if unset or unrecognized, defaults to dark\n    theme,dark\n    \n    # likely this won't need to change if you're following default install instructions.\n    dataPath,/home/pi/YANPIWS/data/\n    \n    # there's only one of these, so likely this won't change\n    moondata_api_URL,https://aa.usno.navy.mil/api/rstt/oneday\n    \n    # unless you're deploying a lot of nodes reporting back to a central server, don't touch these ;)\n    # api_password very likely should match servers_0_password unless, again, you know what you're doing ;)\n    api_password,boxcar-spinning-problem-rockslide-scored\n    servers_0_url,http://127.0.0.1\n    servers_0_password,boxcar-spinning-problem-rockslide-scored\n    ```\n1. Run these commands to copy the `kiosk.sh` script into systemd and enable the service. This \nwill  to auto start Chromium in kiosk mode on the Pi's web server every time you boot:\n\n   ```\n   cd ~pi/YANPIWS\n   sudo cp scripts/kiosk.service /lib/systemd/system/kiosk.service\n   sudo systemctl daemon-reload\n   sudo systemctl start kiosk.service\n   sudo systemctl enable kiosk.service\n   ```\n   Thanks to [Py My Life Up](https://pimylifeup.com/raspberry-pi-kiosk/) pages for the howto\n1. Reboot your Pi so confirm the browser starts loading the configured YANPIWS app.\n1. [Add a cronjob](https://www.raspberrypi.org/documentation/linux/usage/cron.md) \nfor the Pi user to run every 5 minutes to ensure temperature collection is happening:\n    ```\n    */5 * * * * /home/pi/YANPIWS/scripts/start.sh \u003e\u003e /home/pi/YANPIWS/data/cron.log\n\n    ```\n    This step will need some improvement as the ``rtl_433`` process can die and your temps will stop\n    being updated :( Stay tuned!\n\nWhew that's it!  Enjoy your new weather station. Let me know which awesome case you\n build for it and report any bugs here!\n \n \n![](./images/product.jpg)\n\n### Alternate install steps for attached I2C sensor\n\nFollow the exact same steps as above, but don't do the last step with the cron job.  Instead,\nyou'll need to:\n\n1. Make sure I2C is enabled by running `sudo raspi-config` -\u003e \"Interfacing Options\" -\u003e I2C -\u003e \"Yes\" -\u003e Reboot\n1. Ensure that your BME280 sensor is attached correctly. \n [Raspberry Pi Spy](https://www.raspberrypi-spy.co.uk/2016/07/using-bme280-i2c-temperature-pressure-sensor-in-python/) \nprovided [this great schematic](./images/BME280-Module-Setup.png).\n1. Assuming you installed in `/home/pi/YANPIWS/`, run `python /home/pi/YANPIWS/scripts/bme280.py` and \nensure you see good data.  This looks like this for me:\n    ```bash\n    {\"time\" : \"2019-09-05 14:05:00\", \"model\" : \"BMP280\", \"id\" : 96, \"temperature_F\" : 80.456, \"humidity\" : 40.54}\n    ```\n1. If that all looks good, as the `pi` user, set up a cron job to run once a minute and generate the stats:\n    ```bash\n    */1 * * * * cd /home/pi/YANPIWS/html/php;/usr/bin/python /home/pi/YANPIWS/scripts/bme280.py | /usr/bin/php -f read_and_post.php\n    ``` \n   \n### Multiple Sensor Nodes\n\nIf you have a lot of places you want to run temperature sensors, as of version 0.9.2, YANPIWS now\nsupports a server/client deployment. This means you have the ability to run an install that does \nnothing but send it's data to another YANPIWS instance.\nTo set that up, go ahead and deploy the 2nd (Nth!!) instance based on the steps above.  Make sure everything\nis working.  Then, follow these steps:\n\n1. Get the IP address of where you want to send the data to.  See `ifconfig` if you need help (this\ncommand may work, but is likely fragile, `ifconfig|grep -i inet|grep broadc|cut -d ' ' -f10`). We'll\npretend you got the ip `192.168.4.199` back. But use the real IP!\n1. One the remote node, edit the `config.csv` file and in the bottom section after the `$YANPIWS['servers'][]`\nline, do one of the following:\n   * change the URL line `url` to be: `'url' =\u003e 'http://192.168.4.199',`. Remember, this should be the IP you \n   got in the \n   prior step. This will cause the data to not be stored locally on the node at all.  It will only\n   be sent to the remote server. The final result should look like this:\n   \n       ```php\n        $YANPIWS['servers'][] = array(\n           'url' =\u003e 'http://192.168.4.199',  // no trailing slash please ;)\n           'password' =\u003e 'boxcar-spinning-problem-rockslide-scored', // should match password above\n        );\n     \n   OR\n   * add 4 new lines with your new IP. The final result  will look like this:\n   \n       ```php\n        $YANPIWS['servers'][] = array(\n            'url' =\u003e 'http://127.0.0.1',  // no trailing slash please ;)\n            'password' =\u003e 'boxcar-spinning-problem-rockslide-scored', // should match password above\n        );\n        $YANPIWS['servers'][] = array(\n           'url' =\u003e 'http://192.168.4.199',  // no trailing slash please ;)\n           'password' =\u003e 'boxcar-spinning-problem-rockslide-scored', // should match password above\n        );\n        ``` \n     \n     This will cause the client to write to BOTH the local and remote YANPIWS instances\n1. If your using the BME280 chip on both your server and your client(s), you'll need to edit the `bme280.py`.\nThis is because all of the BME280 chips have the same ID and your server won't know which sensor is which.\nTo fix this, change line 165 from this:\n\n    ```python\n    json = '{\"time\" : \"' + str(rightnow) + '\", \"model\" : \"BMP280\", \"id\" : ' + str(chip_id) + ', \"temperature_F\" \n    ```   \n        \n     To this:\n\n    ```python\n    json = '{\"time\" : \"' + str(rightnow) + '\", \"model\" : \"BMP280\", \"id\" : \"44\", \"temperature_F\" \n    ```  \n        \n     What this does is hard code this sensor to ID `44`.  For each new node you deploy, you'll need to change this \n     to it's own unique value.\n1. On your server update the `$YANPIWS['labels']` to have an entry for your new sensor.  In the case of our\n`44` example above, along with default `96` that the BME280 uses, that would look like this:\n\n    ```php\n    $YANPIWS['labels'] = array(\n        '96' =\u003e 'In',\n        '44' =\u003e 'Out',\n    );\n    ```\n\n### API calls\n\nYANPIWS, as of version 0.9.2, now has an HTTP API that you can use to send data.  This means\nthat anything that can do a `POST` to the IP of your YANPIWS server instance, can send it temp data!\nThe following fields are required:\n* `id` - (int) the ID you want to write to the DB\n* `time` - (string) the time of of the data, must be in Y-M-D H:M:S format like `2019-09-18 23:59:02`\n* `temperature_F` - (float) of the temperature in ferinheight \n* `password` - (string) must match what you have in your `config.csv` file under `api_password`. \nThe default value is `boxcar-spinning-problem-rockslide-scored`.\n\nOptionally you may pass:\n* `humidity` - (float) of the humidity\n\nYou should use the following URL for your `POST`, replace `IP_ADDRESS` with your real \nIP address of your server:\n\n* `http://IP_ADDRESS/parse_and_save.php`\n\n## Development\n\nCheck out this repo, `cd` into the `html` directory and start a web server:\n\n```\nphp -S  localhost:8000\n```\n\nThe rtl_433 works great on Ubuntu for desktop/laptop development.  Manually kick off the input \nscript and leave it running while you code to gather live temps:\n\n```\ncd html/php\nrtl_433 -f 433820000 -C customary -F json -q | php -f read_and_post.php\n```\n\nIf you don't want to deal with running the rtl-433 script, copy the sample data \n``example.data`` to today's date (YEAR-MONTH-DAY) into the ``data`` directory.  It has IDs 211 \nand 109 which are the ones already in config.dist.csv.\n\nAs well, if you want to simulate individual inputs via the HTTP POSTs, you can use this `curl` command.\nNote that we're using the default password, you may need to change this if you've changed it in your \ndeployment:\n\n```bash\ncurl --data \"password=boxcar-spinning-problem-rockslide-scored\u0026temperature_F=44.08\u0026id=2\u0026time=2019-09-18 23:59:02\" http://localhost:8000/php/parse_and_save.php\n```\n\nAs the `bme280.py` script outputs JSON, if you want to more closely similate the cron job that's run, incluidng using\nthe config vars and a real `POST`, you can use this:\n\n```bash\ncd html/php\necho '{\"temperature_F\":\"44.08\",\"id\":\"2\",\"time\":\"2019-09-18 23:59:02\"}' | php read_and_post.php\n```\n\nConversely, if you want to use the now deprecated `STDIN` method, you can use `echo` to pipe in JSON: \n\n```bash\ncd html/php\necho '{\"temperature_F\":\"44.08\",\"id\":\"2\",\"time\":\"2019-09-18 23:59:02\"}' | php parse_and_save.php\n```\n\nUse your IDE of choice to edit and point your browser at ``localhost:8000`` \n(or the IP of your Pi) and away you go.\n\nPRs and Issues welcome!\n\n## Version History\n* 0.13.1 - Jan 21 2026\n  * Fix Graph per #122 \n* 0.13.0 - Jun 4, 2025\n  * add new I2C screen per #116\n  * clean up moon info  per #120\n* 0.12.0 - Nov 15, 2024\n  * adds phases of moon and set and rise times for same per #114\n  * also fixed a bunch of error handling that was failing, also in #114\n* 0.11.2 - Dec 29,2023\n  * fixes temps not updating per #112\n* 0.11.1 - Dec 28,2023\n  * fixes 404s per #108\n* 0.11.0 - Dec 28,2023\n  * Adds a static page feature per #106\n  * Does some general cleanup like fixing variable name typos, var -\u003e let etc\n  * allows user to pick between light or dark mode in config\n  * refactors directories in HTML to be hierarchical\n  * adds favicons\n* 0.10.3 - Nov 4,2023\n    * Fix dupe day per #104\n* 0.10.2 - Sep 3,2023\n  * Fix API string length per #102\n* 0.10.1 - Sep 3,2023\n  * Fix pirate weather overage per #100\n* 0.10.0 - Apr 3,2023\n  * Support Pirate Weather by default #69\n  * Move to SemVer versioning (MAJOR.MINOR.PATCH)\n* 0.9.10 - Jul 20,2020\n  * Convert to more JSON, less HTML over AJAX calls #89\n  * Allow big clock mode by clicking time #82\n* 0.9.9 - Jul 20,2020\n  * Add user configurable font sizes #80\n  * Better temp layouts #83\n* 0.9.8 - May 11,2020\n  * Organize files into directories, update readme accordingly #73\n* 0.9.7 - May 10, 2020 \n  * Updated readme, kiosk steps, rtl_433 install steps #70\n* 0.9.6 - Nov 20, 2019\n  * Add config for 1, 2 or 3 temps on screen #64\n  * Update health check logic #61\n* 0.9.5 - Nov 12, 2019\n  * Improve all python scripts to take arguments instead of being edited #54\n  * Fix empty bad time format from #51 per #56\n  * add info on how to use systemd to update mini display with python scripts #58\n  * add info on how to use systemd to update mini display with python scripts #59\n  * put last updated file for every AJAX call #61\n* 0.9.4 - Oct 10, 2019 - tidy up python scripts per #50 and #51\n* 0.9.3 - Oct 1, 2019 - merge old PR #20 with:\n  * add stats dashboard per #17\n  * adds AJAX reloads per #19\n  * add windspeed per #16\n  * remove GMT from config per #23\n  * offer animated or static icons per #25\n  * Fix labels per #24\n  * natively support both 5\" and 3.5\" screens per #13\n  * all functions documented and commented per #32\n  * make title text yellow if caches are older than 10 minutes per #37\n  * don't cache invalid dark sky data #36\n* 0.9.2 - Sep 19, 2019 - add support for, and default, to http POST for \ndata gathering. Fix typo \u0026 fix minor bug with use of `rand()`. Update docs for same. \n* 0.9.1 - Sep 9, 2019 - implement support for BME280 I2C sensors\n* 0.9 - Mar 26, 2017 - get feedback from [@jamcole](https://github.com/jamcole) (thanks!), \nadd developer section, add getConfigOrDie(), \nsimplify index.php, add better logging for debugging\n* 0.8 - Mar 26, 2017 - Use cron to ensure temperature collection happens, omg - pgrep where have you been\nall my life?!\n* 0.7 - Mar 25, 2017 - Add Install Steps, tweak sun icon, full path in config, \nbetter handle empty config file\n* 0.6 - Mar 25, 2017 - horizontal layout, moon and sun icons instead of text, bigger forecast icons\n* 0.5 - Mar 24, 2017 - simplified layout, improve readme, better error handling of missing config.php\n* 0.4 - Mar 24, 2017 - cache darksky API calls, implement layout for 800x480 screen\n* 0.3 - Mar 23, 2017 - forecast if you have a darksky API\n* 0.2 - Mar 23, 2017 - reading CSV, super basic HTML output\n* 0.1 - Mar 22, 2017 - parsing data, writing to CSV, crude readme, no html output\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmrjones-plip%2Fyanpiws","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmrjones-plip%2Fyanpiws","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmrjones-plip%2Fyanpiws/lists"}