Repository: userexec/Pi-Kitchen-Dashboard
Branch: master
Commit: c7f96a898259
Files: 16
Total size: 50.5 KB
Directory structure:
gitextract_mgrphg14/
├── .gitignore
├── README.md
├── bower.json
├── css/
│ └── weather-icons.css
├── font/
│ ├── SIL Open Font License.txt
│ └── WeatherIcons-Regular.otf
├── index.html
├── js/
│ ├── redirect.js
│ └── weather.js
├── package.json
├── screenOff.sh
├── screenOn.sh
└── skins/
└── default/
├── css/
│ └── style.css
├── font/
│ └── SIL Open Font License.txt
├── index.html
└── js/
└── icons.js
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
node_modules/
bower_components/
================================================
FILE: README.md
================================================
**This project is not maintained and is presented for archival purposes only**
# Pi Kitchen Dashboard
##### Because thrift store monitors still need things to do.
This project turns your monitor and Raspberry Pi into a simple, skinnable time and weather dashboard for your kitchen. Want it in your living room? **Too bad.**

* * *
+ [Items Needed](#itemsNeeded)
+ [Instructions](#instructions)
- [Cloning](#cloning)
- [Fulfilling requirements](#fulfillingRequirements)
- [Setting your location](#settingYourLocation)
- [Configuring your Pi](#configuringYourPi)
* [Disallowing screen sleep](#disallowingScreenSleep)
* [Installing Unclutter](#hidingCursor)
* [Installing Midori](#installingMidori)
* [Auto-starting Unclutter and Midori](#autoStartingMidori)
- [Scheduling screen sleep](#scheduling)
+ [Changing the skin](#changingTheSkin)
+ [Creating skins](#creatingSkins)
+ [Credit](#credit)
* * *
## <a name="itemsNeeded"></a>Items needed
+ Raspberry Pi
+ Monitor
+ Adapter to hook said Raspberry Pi to said monitor
+ Internet connection
## <a name="instructions"></a>Instructions
### <a name="cloning"></a>Cloning
Clone this repository with `git clone https://github.com/userexec/Pi-Kitchen-Dashboard.git`.
If your Pi does not currently have git, you will need to install it first with `sudo apt-get install git`.
### <a name="fulfillingRequirements"></a>Fulfilling requirements
This project is not distributed with its dependencies; however, [Bower](http://bower.io/) will automatically pull them in.
1. `sudo apt-get update && sudo apt-get upgrade` - Update your system
2. Install Node Package Manager (required for Bower)
##### Raspberry Pi A/B/B+
```
wget https://nodejs.org/dist/v4.0.0/node-v4.0.0-linux-armv6l.tar.gz
tar -xvf node-v4.0.0-linux-armv6l.tar.gz
cd node-v4.0.0-linux-armv6l
sudo cp -R * /usr/local/
```
##### Raspberry Pi 2 Model B
```
wget https://nodejs.org/dist/v4.0.0/node-v4.0.0-linux-armv7l.tar.gz
tar -xvf node-v4.0.0-linux-armv7l.tar.gz
cd node-v4.0.0-linux-armv7l
sudo cp -R * /usr/local/
```
<a href="http://blog.wia.io/installing-node-js-v4-0-0-on-a-raspberry-pi/">Node install instructions</a> by <a href="http://blog.wia.io/author/conall/">Conall Laverty</a>
3. `sudo npm install -g bower` - Install Bower
4. `cd ~/Pi-Kitchen-Dashboard` - cd into the directory of the cloned project
5. `bower install` - Install the project's dependencies
### <a name="settingYourLocation"></a>Setting your location
Open `js/weather.js` and find the following section at the top:
```javascript
// Your Yahoo WOEID code
// Find your WOEID code at http://zourbuth.com/tools/woeid/
var woeid = 23416998;
// Your temperature unit measurement
// This bit is simple, 'c' for Celcius, and 'f' for Fahrenheit
var unit = 'c';
// Yahoo! query interval (milliseconds)
// Default is every 15 minutes. Be reasonable. Don't query Yahoo every 500ms.
var waitBetweenWeatherQueriesMS = 900000;
```
Change these variables to match your location, unit measurement, and desired update interval, and your part of the coding is done!
### <a name="configuringYourPi"></a>Configuring your Pi
You will need a Raspberry Pi (although you could use anything else) with Raspbian (again, or anything else) and an internet connection. To complete the dashboard, your Pi will need disallow screen sleep and automatically start kiosk mode.
#### <a name="disallowingScreenSleep"></a>Disallowing screen sleep
Unless screen sleep is prevented, the dashboard screen will go black after a few minutes and require a mouse movement or keypress to wake up. Scheduled times for the display to turn off are covered in a [later section](#scheduling).
`sudo nano /etc/lightdm/lightdm.conf`
Add the following lines to the [SeatDefaults] section:
```bash
xserver-command=X -s 0 -dpms
```
#### <a name="hideCursor"></a>Installing Unclutter
Unclutter causes the mouse cursor to disappear when the mouse isn't being moved. This prevents the dash from having a cursor over the middle unless you plug in a mouse and move it elsewhere.
`sudo apt-get install unclutter`
#### <a name="installingMidori"></a>Installing Midori
Midori is used for its compatibility with multiple RPi generations and reasonably solid rendering. Other browsers may be used if preferred using much the same strategy.
`sudo apt-get install midori`
#### <a name="autoStartingMidori"></a>Auto-starting Unclutter and Midori
1. Create a new directory at `~/.config/autostart` if it does not exist
2. `cd ~/.config/autostart` - cd into this directory
3. `nano unclutterAuto.desktop` - Create a new .desktop file
4. Add the following lines and save. Customize the file path to where this project's index.html lives on your Pi.
```
[Desktop Entry]
Type=Application
Exec=unclutter -idle 0.1
```
5. `nano midoriAuto.desktop` - Create a new .desktop file
```
[Desktop Entry]
Type=Application
Exec=midori -e Fullscreen -a file:///home/pi/Pi-Kitchen-Dashboard/index.html
```
Your Pi should now atomatically start kiosk mode and show the dashboard full screen once your desktop loads.
If your time or date are incorrect, use `sudo raspi-config` to set your locale and timezone.
### <a name="scheduling"></a>Scheduling screen sleep
If you don't want your display to run 24/7, you can use cron jobs to fire a pair of included bash scripts: screenOff.sh and screenOn.sh. Please ensure you've completed the [Disallowing screen sleep](#disallowingScreenSleep) step above in order to keep the display always on during the times it's scheduled to be on.
1. `cd` into your Pi-Kitchen-Dashboard directory and set both scripts to executable
```bash
chmod +x screenOff.sh
chmod +x screenOn.sh
```
2. Run `crontab -e` and add cronjobs to the end using the provided scripts. If you're not comfortable writing cronjobs manually, you can use a <a href="http://cron.nmonitoring.com/cron-generator.html">crontab generator</a>. The following lines, for example, shut off the display at 11:00PM each night and turn it back on at 6:00AM. Be sure to edit the file paths if necessary.
```
0 23 * * * /home/pi/Pi-Kitchen-Dashboard/screenOff.sh
0 6 * * * /home/pi/Pi-Kitchen-Dashboard/screenOn.sh
```
## <a name="changingTheSkin"></a>Changing the skin
Skins are kept, conveniently, in the skins folder. To switch skins, edit `Pi-Kitchen-Dashboard/index.html` and insert the folder name of the skin you wish to use where the comments direct.
## <a name="creatingSkins"></a>Creating skins
Creating your own skin or a new skin for distribution is easy and only requires knowledge of HTML and CSS. Just copy the `default` folder under skins, rename it, and begin editing. Comments in the default skin will guide you through the process, but it basically boils down to 99% using your imagination and 1% placing a few IDs and classes so that time and weather data can be auto-populated.
## <a name="credit"></a>Credit
Weather icons by Lukas Bischoff and Erik Flowers https://github.com/erikflowers/weather-icons. Icons licensed under [SIL OFL 1.1](http://scripts.sil.org/OFL).
Time formatting by [Moment.js](http://momentjs.com/)
Weather data retrieved using Yahoo! Weather API.
Default skin responsiveness by [RYJASM](https://github.com/ryjasm).
Project is under [MIT license](http://choosealicense.com/licenses/mit/).
================================================
FILE: bower.json
================================================
{
"name": "kitchenDisplay",
"version": "0.0.0",
"authors": [
"Joshua Woehlke <joshua.woehlke@gmail.com>"
],
"license": "MIT",
"private": true,
"ignore": [
"**/.*",
"node_modules",
"bower_components",
"test",
"tests"
],
"dependencies": {
"jquery": "~2.1.3",
"moment": "~2.9.0"
}
}
================================================
FILE: css/weather-icons.css
================================================
/*!
* Weather Icons 1.3
* Updated November 30th, 2014
* Weather themed icons for Bootstrap
* ------------------------------------------------------------------------------
* Maintained at http://erikflowers.github.io/weather-icons
* http://twitter.com/Erik_UX
*
* License
* ------------------------------------------------------------------------------
* - Fpmt licensed under SIL OFL 1.1 -
* http://scripts.sil.org/OFL
* - CSS and LESS are licensed under MIT License -
* http://opensource.org/licenses/mit-license.html
* - Documentation licensed under CC BY 3.0 -
* http://creativecommons.org/licenses/by/3.0/
* - Inspired by and works great as a companion with Font Awesome
* "Font Awesome by Dave Gandy - http://fontawesome.io"
*
* Weather Icons Bootstrap Package Author - Erik Flowers - erik@helloerik.com
* ------------------------------------------------------------------------------
* Email: erik@helloerik.com
* Twitter: http://twitter.com/Erik_UX
*/
@font-face {
font-family: 'weathericons';
src: url('../font/weathericons-regular-webfont.eot');
src: url('../font/weathericons-regular-webfont.eot?#iefix') format('embedded-opentype'), url('../font/weathericons-regular-webfont.woff') format('woff'), url('../font/weathericons-regular-webfont.ttf') format('truetype'), url('../font/weathericons-regular-webfont.svg#weathericons-regular-webfontRg') format('svg');
font-weight: normal;
font-style: normal;
}
.wi {
display: inline-block;
font-family: 'weathericons';
font-style: normal;
font-weight: normal;
line-height: 1;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.wi-day-cloudy-gusts:before {
content: "\f000";
}
.wi-day-cloudy-windy:before {
content: "\f001";
}
.wi-day-cloudy:before {
content: "\f002";
}
.wi-day-fog:before {
content: "\f003";
}
.wi-day-hail:before {
content: "\f004";
}
.wi-day-lightning:before {
content: "\f005";
}
.wi-day-rain-mix:before {
content: "\f006";
}
.wi-day-rain-wind:before {
content: "\f007";
}
.wi-day-rain:before {
content: "\f008";
}
.wi-day-showers:before {
content: "\f009";
}
.wi-day-snow:before {
content: "\f00a";
}
.wi-day-sprinkle:before {
content: "\f00b";
}
.wi-day-sunny-overcast:before {
content: "\f00c";
}
.wi-day-sunny:before {
content: "\f00d";
}
.wi-day-storm-showers:before {
content: "\f00e";
}
.wi-day-thunderstorm:before {
content: "\f010";
}
.wi-cloudy-gusts:before {
content: "\f011";
}
.wi-cloudy-windy:before {
content: "\f012";
}
.wi-cloudy:before {
content: "\f013";
}
.wi-fog:before {
content: "\f014";
}
.wi-hail:before {
content: "\f015";
}
.wi-lightning:before {
content: "\f016";
}
.wi-rain-mix:before {
content: "\f017";
}
.wi-rain-wind:before {
content: "\f018";
}
.wi-rain:before {
content: "\f019";
}
.wi-showers:before {
content: "\f01a";
}
.wi-snow:before {
content: "\f01b";
}
.wi-sprinkle:before {
content: "\f01c";
}
.wi-storm-showers:before {
content: "\f01d";
}
.wi-thunderstorm:before {
content: "\f01e";
}
.wi-windy:before {
content: "\f021";
}
.wi-night-alt-cloudy-gusts:before {
content: "\f022";
}
.wi-night-alt-cloudy-windy:before {
content: "\f023";
}
.wi-night-alt-hail:before {
content: "\f024";
}
.wi-night-alt-lightning:before {
content: "\f025";
}
.wi-night-alt-rain-mix:before {
content: "\f026";
}
.wi-night-alt-rain-wind:before {
content: "\f027";
}
.wi-night-alt-rain:before {
content: "\f028";
}
.wi-night-alt-showers:before {
content: "\f029";
}
.wi-night-alt-snow:before {
content: "\f02a";
}
.wi-night-alt-sprinkle:before {
content: "\f02b";
}
.wi-night-alt-storm-showers:before {
content: "\f02c";
}
.wi-night-alt-thunderstorm:before {
content: "\f02d";
}
.wi-night-clear:before {
content: "\f02e";
}
.wi-night-cloudy-gusts:before {
content: "\f02f";
}
.wi-night-cloudy-windy:before {
content: "\f030";
}
.wi-night-cloudy:before {
content: "\f031";
}
.wi-night-hail:before {
content: "\f032";
}
.wi-night-lightning:before {
content: "\f033";
}
.wi-night-rain-mix:before {
content: "\f034";
}
.wi-night-rain-wind:before {
content: "\f035";
}
.wi-night-rain:before {
content: "\f036";
}
.wi-night-showers:before {
content: "\f037";
}
.wi-night-snow:before {
content: "\f038";
}
.wi-night-sprinkle:before {
content: "\f039";
}
.wi-night-storm-showers:before {
content: "\f03a";
}
.wi-night-thunderstorm:before {
content: "\f03b";
}
.wi-celsius:before {
content: "\f03c";
}
.wi-cloud-down:before {
content: "\f03d";
}
.wi-cloud-refresh:before {
content: "\f03e";
}
.wi-cloud-up:before {
content: "\f040";
}
.wi-cloud:before {
content: "\f041";
}
.wi-degrees:before {
content: "\f042";
}
.wi-down-left:before {
content: "\f043";
}
.wi-down:before {
content: "\f044";
}
.wi-fahrenheit:before {
content: "\f045";
}
.wi-horizon-alt:before {
content: "\f046";
}
.wi-horizon:before {
content: "\f047";
}
.wi-left:before {
content: "\f048";
}
.wi-lightning:before {
content: "\f016";
}
.wi-night-fog:before {
content: "\f04a";
}
.wi-refresh-alt:before {
content: "\f04b";
}
.wi-refresh:before {
content: "\f04c";
}
.wi-right:before {
content: "\f04d";
}
.wi-sprinkles:before {
content: "\f04e";
}
.wi-strong-wind:before {
content: "\f050";
}
.wi-sunrise:before {
content: "\f051";
}
.wi-sunset:before {
content: "\f052";
}
.wi-thermometer-exterior:before {
content: "\f053";
}
.wi-thermometer-internal:before {
content: "\f054";
}
.wi-thermometer:before {
content: "\f055";
}
.wi-tornado:before {
content: "\f056";
}
.wi-up-right:before {
content: "\f057";
}
.wi-up:before {
content: "\f058";
}
.wi-wind-west:before {
content: "\f059";
}
.wi-wind-south-west:before {
content: "\f05a";
}
.wi-wind-south-east:before {
content: "\f05b";
}
.wi-wind-south:before {
content: "\f05c";
}
.wi-wind-north-west:before {
content: "\f05d";
}
.wi-wind-north-east:before {
content: "\f05e";
}
.wi-wind-north:before {
content: "\f060";
}
.wi-wind-east:before {
content: "\f061";
}
.wi-smoke:before {
content: "\f062";
}
.wi-dust:before {
content: "\f063";
}
.wi-snow-wind:before {
content: "\f064";
}
.wi-day-snow-wind:before {
content: "\f065";
}
.wi-night-snow-wind:before {
content: "\f066";
}
.wi-night-alt-snow-wind:before {
content: "\f067";
}
.wi-day-sleet-storm:before {
content: "\f068";
}
.wi-night-sleet-storm:before {
content: "\f069";
}
.wi-night-alt-sleet-storm:before {
content: "\f06a";
}
.wi-day-snow-thunderstorm:before {
content: "\f06b";
}
.wi-night-snow-thunderstorm:before {
content: "\f06c";
}
.wi-night-alt-snow-thunderstorm:before {
content: "\f06d";
}
.wi-solar-eclipse:before {
content: "\f06e";
}
.wi-lunar-eclipse:before {
content: "\f070";
}
.wi-meteor:before {
content: "\f071";
}
.wi-hot:before {
content: "\f072";
}
.wi-hurricane:before {
content: "\f073";
}
.wi-smog:before {
content: "\f074";
}
.wi-alien:before {
content: "\f075";
}
.wi-snowflake-cold:before {
content: "\f076";
}
.wi-stars:before {
content: "\f077";
}
.wi-night-partly-cloudy:before {
content: "\f083";
}
.wi-umbrella:before {
content: "\f084";
}
.wi-day-windy:before {
content: "\f085";
}
.wi-night-alt-cloudy:before {
content: "\f086";
}
.wi-up-left:before {
content: "\f087";
}
.wi-down-right:before {
content: "\f088";
}
.wi-time-12:before {
content: "\f089";
}
.wi-time-1:before {
content: "\f08a";
}
.wi-time-2:before {
content: "\f08b";
}
.wi-time-3:before {
content: "\f08c";
}
.wi-time-4:before {
content: "\f08d";
}
.wi-time-5:before {
content: "\f08e";
}
.wi-time-6:before {
content: "\f08f";
}
.wi-time-7:before {
content: "\f090";
}
.wi-time-8:before {
content: "\f091";
}
.wi-time-9:before {
content: "\f092";
}
.wi-time-10:before {
content: "\f093";
}
.wi-time-11:before {
content: "\f094";
}
.wi-day-sleet:before {
content: "\f0b2";
}
.wi-night-sleet:before {
content: "\f0b3";
}
.wi-night-alt-sleet:before {
content: "\f0b4";
}
.wi-sleet:before {
content: "\f0b5";
}
.wi-day-haze:before {
content: "\f0b6";
}
.wi-beafort-0:before {
content: "\f0b7";
}
.wi-beafort-1:before {
content: "\f0b8";
}
.wi-beafort-2:before {
content: "\f0b9";
}
.wi-beafort-3:before {
content: "\f0ba";
}
.wi-beafort-4:before {
content: "\f0bb";
}
.wi-beafort-5:before {
content: "\f0bc";
}
.wi-beafort-6:before {
content: "\f0bd";
}
.wi-beafort-7:before {
content: "\f0be";
}
.wi-beafort-8:before {
content: "\f0bf";
}
.wi-beafort-9:before {
content: "\f0c0";
}
.wi-beafort-10:before {
content: "\f0c1";
}
.wi-beafort-11:before {
content: "\f0c2";
}
.wi-beafort-12:before {
content: "\f0c3";
}
.wi-wind-default:before {
content: "\f0b1";
}
.wi-wind-default._0-deg {
-webkit-transform: rotate(0deg);
-moz-transform: rotate(0deg);
-ms-transform: rotate(0deg);
-o-transform: rotate(0deg);
transform: rotate(0deg);
}
.wi-wind-default._15-deg {
-webkit-transform: rotate(15deg);
-moz-transform: rotate(15deg);
-ms-transform: rotate(15deg);
-o-transform: rotate(15deg);
transform: rotate(15deg);
}
.wi-wind-default._30-deg {
-webkit-transform: rotate(30deg);
-moz-transform: rotate(30deg);
-ms-transform: rotate(30deg);
-o-transform: rotate(30deg);
transform: rotate(30deg);
}
.wi-wind-default._45-deg {
-webkit-transform: rotate(45deg);
-moz-transform: rotate(45deg);
-ms-transform: rotate(45deg);
-o-transform: rotate(45deg);
transform: rotate(45deg);
}
.wi-wind-default._60-deg {
-webkit-transform: rotate(60deg);
-moz-transform: rotate(60deg);
-ms-transform: rotate(60deg);
-o-transform: rotate(60deg);
transform: rotate(60deg);
}
.wi-wind-default._75-deg {
-webkit-transform: rotate(75deg);
-moz-transform: rotate(75deg);
-ms-transform: rotate(75deg);
-o-transform: rotate(75deg);
transform: rotate(75deg);
}
.wi-wind-default._90-deg {
-webkit-transform: rotate(90deg);
-moz-transform: rotate(90deg);
-ms-transform: rotate(90deg);
-o-transform: rotate(90deg);
transform: rotate(90deg);
}
.wi-wind-default._105-deg {
-webkit-transform: rotate(105deg);
-moz-transform: rotate(105deg);
-ms-transform: rotate(105deg);
-o-transform: rotate(105deg);
transform: rotate(105deg);
}
.wi-wind-default._120-deg {
-webkit-transform: rotate(120deg);
-moz-transform: rotate(120deg);
-ms-transform: rotate(120deg);
-o-transform: rotate(120deg);
transform: rotate(120deg);
}
.wi-wind-default._135-deg {
-webkit-transform: rotate(135deg);
-moz-transform: rotate(135deg);
-ms-transform: rotate(135deg);
-o-transform: rotate(135deg);
transform: rotate(135deg);
}
.wi-wind-default._150-deg {
-webkit-transform: rotate(150deg);
-moz-transform: rotate(150deg);
-ms-transform: rotate(150deg);
-o-transform: rotate(150deg);
transform: rotate(150deg);
}
.wi-wind-default._165-deg {
-webkit-transform: rotate(165deg);
-moz-transform: rotate(165deg);
-ms-transform: rotate(165deg);
-o-transform: rotate(165deg);
transform: rotate(165deg);
}
.wi-wind-default._180-deg {
-webkit-transform: rotate(180deg);
-moz-transform: rotate(180deg);
-ms-transform: rotate(180deg);
-o-transform: rotate(180deg);
transform: rotate(180deg);
}
.wi-wind-default._195-deg {
-webkit-transform: rotate(195deg);
-moz-transform: rotate(195deg);
-ms-transform: rotate(195deg);
-o-transform: rotate(195deg);
transform: rotate(195deg);
}
.wi-wind-default._210-deg {
-webkit-transform: rotate(210deg);
-moz-transform: rotate(210deg);
-ms-transform: rotate(210deg);
-o-transform: rotate(210deg);
transform: rotate(210deg);
}
.wi-wind-default._225-deg {
-webkit-transform: rotate(225deg);
-moz-transform: rotate(225deg);
-ms-transform: rotate(225deg);
-o-transform: rotate(225deg);
transform: rotate(225deg);
}
.wi-wind-default._240-deg {
-webkit-transform: rotate(240deg);
-moz-transform: rotate(240deg);
-ms-transform: rotate(240deg);
-o-transform: rotate(240deg);
transform: rotate(240deg);
}
.wi-wind-default._255-deg {
-webkit-transform: rotate(255deg);
-moz-transform: rotate(255deg);
-ms-transform: rotate(255deg);
-o-transform: rotate(255deg);
transform: rotate(255deg);
}
.wi-wind-default._270-deg {
-webkit-transform: rotate(270deg);
-moz-transform: rotate(270deg);
-ms-transform: rotate(270deg);
-o-transform: rotate(270deg);
transform: rotate(270deg);
}
.wi-wind-default._285-deg {
-webkit-transform: rotate(295deg);
-moz-transform: rotate(295deg);
-ms-transform: rotate(295deg);
-o-transform: rotate(295deg);
transform: rotate(295deg);
}
.wi-wind-default._300-deg {
-webkit-transform: rotate(300deg);
-moz-transform: rotate(300deg);
-ms-transform: rotate(300deg);
-o-transform: rotate(300deg);
transform: rotate(300deg);
}
.wi-wind-default._315-deg {
-webkit-transform: rotate(315deg);
-moz-transform: rotate(315deg);
-ms-transform: rotate(315deg);
-o-transform: rotate(315deg);
transform: rotate(315deg);
}
.wi-wind-default._330-deg {
-webkit-transform: rotate(330deg);
-moz-transform: rotate(330deg);
-ms-transform: rotate(330deg);
-o-transform: rotate(330deg);
transform: rotate(330deg);
}
.wi-wind-default._345-deg {
-webkit-transform: rotate(345deg);
-moz-transform: rotate(345deg);
-ms-transform: rotate(345deg);
-o-transform: rotate(345deg);
transform: rotate(345deg);
}
.wi-moon-new:before {
content: "\f095";
}
.wi-moon-waxing-cresent-1:before {
content: "\f096";
}
.wi-moon-waxing-cresent-2:before {
content: "\f097";
}
.wi-moon-waxing-cresent-3:before {
content: "\f098";
}
.wi-moon-waxing-cresent-4:before {
content: "\f099";
}
.wi-moon-waxing-cresent-5:before {
content: "\f09a";
}
.wi-moon-waxing-cresent-6:before {
content: "\f09b";
}
.wi-moon-first-quarter:before {
content: "\f09c";
}
.wi-moon-waxing-gibbous-1:before {
content: "\f09d";
}
.wi-moon-waxing-gibbous-2:before {
content: "\f09e";
}
.wi-moon-waxing-gibbous-3:before {
content: "\f09f";
}
.wi-moon-waxing-gibbous-4:before {
content: "\f0a0";
}
.wi-moon-waxing-gibbous-5:before {
content: "\f0a1";
}
.wi-moon-waxing-gibbous-6:before {
content: "\f0a2";
}
.wi-moon-full:before {
content: "\f0a3";
}
.wi-moon-waning-gibbous-1:before {
content: "\f0a4";
}
.wi-moon-waning-gibbous-2:before {
content: "\f0a5";
}
.wi-moon-waning-gibbous-3:before {
content: "\f0a6";
}
.wi-moon-waning-gibbous-4:before {
content: "\f0a7";
}
.wi-moon-waning-gibbous-5:before {
content: "\f0a8";
}
.wi-moon-waning-gibbous-6:before {
content: "\f0a9";
}
.wi-moon-3rd-quarter:before {
content: "\f0aa";
}
.wi-moon-waning-crescent-1:before {
content: "\f0ab";
}
.wi-moon-waning-crescent-2:before {
content: "\f0ac";
}
.wi-moon-waning-crescent-3:before {
content: "\f0ad";
}
.wi-moon-waning-crescent-4:before {
content: "\f0ae";
}
.wi-moon-waning-crescent-5:before {
content: "\f0af";
}
.wi-moon-waning-crescent-6:before {
content: "\f0b0";
}
================================================
FILE: font/SIL Open Font License.txt
================================================
This Font Software is licensed under the SIL Open Font License, Version 1.1.
This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL
-----------------------------------------------------------
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
-----------------------------------------------------------
PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide development of collaborative font projects, to support the font creation efforts of academic and linguistic communities, and to provide a free and open framework in which fonts may be shared and improved in partnership with others.
The OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided that any reserved names are not used by derivative works. The fonts and derivatives, however, cannot be released under any other type of license. The requirement for fonts to remain under this license does not apply to any document created using the fonts or their derivatives.
DEFINITIONS
"Font Software" refers to the set of files released by the Copyright Holder(s) under this license and clearly marked as such. This may include source files, build scripts and documentation.
"Reserved Font Name" refers to any names specified as such after the copyright statement(s).
"Original Version" refers to the collection of Font Software components as distributed by the Copyright Holder(s).
"Modified Version" refers to any derivative made by adding to, deleting, or substituting -- in part or in whole -- any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment.
"Author" refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software.
PERMISSION & CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions:
1) Neither the Font Software nor any of its individual components, in Original or Modified Versions, may be sold by itself.
2) Original or Modified Versions of the Font Software may be bundled, redistributed and/or sold with any software, provided that each copy contains the above copyright notice and this license. These can be included either as stand-alone text files, human-readable headers or in the appropriate machine-readable metadata fields within text or binary files as long as those fields can be easily viewed by the user.
3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written permission is granted by the corresponding Copyright Holder. This restriction only applies to the primary font name as presented to the users.
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall not be used to promote, endorse or advertise any Modified Version, except to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with their explicit written permission.
5) The Font Software, modified or unmodified, in part or in whole, must be distributed entirely under this license, and must not be distributed under any other license. The requirement for fonts to remain under this license does not apply to any document created using the Font Software.
TERMINATION
This license becomes null and void if any of the above conditions are not met.
DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.
================================================
FILE: index.html
================================================
<!doctype html>
<html>
<head>
<meta charset="utf-8"/>
<title>Redirect to skin...</title>
</head>
<body>
<script>
/* Change your active skin by setting skinName to the folder name
* of the desired skin.
*/
var skinName = 'default';
</script>
<script type="text/javascript" src="js/redirect.js"></script>
</body>
</html>
================================================
FILE: js/redirect.js
================================================
// Redirect the loaded page to the selected skin's index
(function() {
var href = window.location.href;
var index = href.indexOf('index.html');
href = href.slice(0, index);
window.location = href + 'skins/' + skinName + '/index.html';
}());
================================================
FILE: js/weather.js
================================================
(function() {
'use strict';
/*global $, moment*/
/*************************************************************************/
/*****************************************************/
/*********************************/
// USER EDITABLE LINES - Change these to match your location and preferences!
// Your Openweathermap city code
// Find your id code at http://bulk.openweathermap.org/sample/
var zip_code = '10023,US'; //NYC as an example. Country code needed for countries other than US.
var api_key = 'YOUR API KEY HERE';
// Your temperature unit measurement
// This bit is simple, 'metric' for Celcius, and 'imperial' for Fahrenheit
var metric = 'imperial';
// Format for date and time
var formatTime = 'h:mm:ss a'
var formatDate = 'dddd, MMMM Do'
// Yahoo! query interval (milliseconds)
// Default is every 15 minutes. Be reasonable. Don't query Yahoo every 500ms.
var waitBetweenWeatherQueriesMS = 900000;
// You're done!
/*********************************/
/*****************************************************/
/*************************************************************************/
function resolveTemp(temp) {
temp = Math.round(temp);
temp += '°'
return temp;
}
function fillCurrently(currently) {
var icon = $('#currently .icon');
var desc = $('#currently .desc');
var temp = $('#currently .temp');
// Insert the current details. Icons may be changed by editing the icons array.
if (icon.length) {
icon.html(icons[currently.weather[0].id]);
}
if (desc.length) {
desc.html(currently.weather[0].description);
}
if (temp.length) {
temp.html(resolveTemp(currently.main.temp));
}
}
function fillForecast(day, forecast) {
// Choose one of the five forecast cells to fill
var forecastCell = '#forecast' + day + ' ';
var day = $(forecastCell + '.day');
var icon = $(forecastCell + '.icon');
var desc = $(forecastCell + '.desc');
var high = $(forecastCell + '.high');
var low = $(forecastCell + '.low');
// If this is the first cell, call it "Today" instead of the day of the week
if (day.length) {
if (day === 1) {
day.html('Today');
} else {
day.html(new Date(forecast.dt*1000).toDateString());
}
}
// Insert the forecast details. Icons may be changed by editing the icons array.
if (icon.length) {
icon.html(icons[forecast.weather[0].id]);
}
if (desc.length) {
desc.html(forecast.weather[0].description);
}
if (high.length) {
high.html(resolveTemp(forecast.main.temp_max));
}
if (low.length) {
low.html(resolveTemp(forecast.main.temp_min));
}
}
function queryOpenWeatherMap() {
$.ajax({
type: 'GET',
url: 'https://api.openweathermap.org/data/2.5/weather?zip=' + zip_code + '&appid=' + api_key + '&units=' + metric,
dataType: 'json'
}).done(function (result) {
// Drill down into the returned data to find the relevant weather information
fillCurrently(result);
fillForecast(0, result);
});
$.ajax({
type: 'GET',
url: 'https://api.openweathermap.org/data/2.5/forecast?zip=' + zip_code + '&appid=' + api_key + '&units=' + metric,
dataType: 'json'
}).done(function (result) {
// Drill down into the returned data to find the relevant weather information
result = result.list;
var fill = 1;
var count = 0;
for( var res of result){
// find tomorrow day
if(res.dt_txt.indexOf('00:00:00') > 0){
var low = 200.0;
var high = -200.0;
for(var i=0; i<8; i++){
if(i+count >= result.length){
continue;
}
if(result[count+i].main.temp_max > high){
high = result[count+i].main.temp_max;
}
if(result[count+i].main.temp_min < low){
low = result[count+i].main.temp_min;
}
}
var res_copy = result[Math.min(count + 5, count)]; // 3pm or last possible
res_copy.main.temp_max = (high>-200?high:res_copy.main.temp_max);
res_copy.main.temp_min = (low<200?low:res_copy.main.temp_min);
fillForecast(fill, res);
fill++;
}
count++;
}
});
}
// Fallback icons - Do not edit. Icons should be edited in your current skin.
// Fallback icons are from the weather icons pack on github at https://github.com/erikflowers/weather-icons
// Position in array corresponds to Yahoo! Weather's condition code, which are commented below in plain English
if (!icons) {
$(document).ready(function() {
$('head').append('<link rel="stylesheet" type="text/css" href="../../css/weather-icons.css" />');
});
var icons = {
'01d': '<i class="wi wi-day-sunny"></i>', //sunny,
'01n': '<i class="wi wi-night-clear"></i>', //clear (night)
'02d': '<i class="wi wi-day-cloudy"></i>', //partly cloudy (day)
'02n': '<i class="wi wi-night-cloudy"></i>', //partly cloudy (night)
'03d': '<i class="wi wi-day-cloudy"></i>', //mostly cloudy (day)
'03n': '<i class="wi wi-night-cloudy"></i>', //mostly cloudy (night)
'04d': '<i class="wi wi-day-cloudy"></i>',
'04n': '<i class="wi wi-day-cloudy"></i>',
'09d': '<i class="wi wi-showers"></i>', //scattered showers
'09n': '<i class="wi wi-showers"></i>', //scattered showers
'10d': '<i class="wi wi-rain"></i>', //showers
'10n': '<i class="wi wi-rain"></i>', //showers
'11d': '<i class="wi wi-thunderstorm"></i>', //thunderstorms
'11n': '<i class="wi wi-thunderstorm"></i>', //thunderstorms
'13d': '<i class="wi wi-snow"></i>', //snow
'13n': '<i class="wi wi-snow"></i>', //snow
'50d': '<i class="wi wi-day-haze"></i>', //haze
'50n': '<i class="wi wi-day-haze"></i>', //haze
'200': '<i class="wi wi-thunderstorm"></i>', //thunderstorms
'201': '<i class="wi wi-thunderstorm"></i>', //thunderstorms
'202': '<i class="wi wi-thunderstorm"></i>', //thunderstorms
'210': '<i class="wi wi-thunderstorm"></i>', //thunderstorms
'211': '<i class="wi wi-thunderstorm"></i>', //thunderstorms
'212': '<i class="wi wi-thunderstorm"></i>', //thunderstorms
'221': '<i class="wi wi-thunderstorm"></i>', //thunderstorms
'230': '<i class="wi wi-thunderstorm"></i>', //thunderstorms
'231': '<i class="wi wi-thunderstorm"></i>', //thunderstorms
'232': '<i class="wi wi-thunderstorm"></i>', //thunderstorms
'300': '<i class="wi wi-rain"></i>', //showers
'301': '<i class="wi wi-rain"></i>', //showers
'302': '<i class="wi wi-rain"></i>', //showers
'310': '<i class="wi wi-rain"></i>', //showers
'311': '<i class="wi wi-rain"></i>', //showers
'312': '<i class="wi wi-rain"></i>', //showers
'313': '<i class="wi wi-rain"></i>', //showers
'314': '<i class="wi wi-rain"></i>', //showers
'321': '<i class="wi wi-rain"></i>', //showers
'500': '<i class="wi wi-rain"></i>', //showers
'501': '<i class="wi wi-rain"></i>', //showers
'502': '<i class="wi wi-rain-wind"></i>', //tropical storm
'503': '<i class="wi wi-rain-wind"></i>', //tropical storm
'504': '<i class="wi wi-rain-wind"></i>', //tropical storm
'511': '<i class="wi wi-rain-mix"></i>', //mixed rain and snow
'520': '<i class="wi wi-rain"></i>', //showers
'521': '<i class="wi wi-rain"></i>', //showers
'522': '<i class="wi wi-rain"></i>', //showers
'531': '<i class="wi wi-rain"></i>', //showers
'600': '<i class="wi wi-snow"></i>', //snow showers
'601': '<i class="wi wi-snow"></i>', //snow showers
'602': '<i class="wi wi-snow"></i>', //snow showers
'611': '<i class="wi wi-rain-mix"></i>', //mixed rain and snow
'612': '<i class="wi wi-rain-mix"></i>', //mixed rain and snow
'615': '<i class="wi wi-rain-mix"></i>', //mixed rain and snow
'616': '<i class="wi wi-rain-mix"></i>', //mixed rain and snow
'620': '<i class="wi wi-rain-mix"></i>', //mixed rain and snow
'621': '<i class="wi wi-rain-mix"></i>', //mixed rain and snow
'622': '<i class="wi wi-rain-mix"></i>', //mixed rain and snow
'701': '<i class="wi wi-fog"></i>', //foggy
'711': '<i class="wi wi-smoke"></i>', //smoky
'721': '<i class="wi wi-fog"></i>', //foggy
'731': '<i class="wi wi-smoke"></i>', //smoky
'741': '<i class="wi wi-fog"></i>', //foggy
'751': '<i class="wi wi-dust"></i>', //dust
'761': '<i class="wi wi-dust"></i>', //dust
'762': '<i class="wi wi-dust"></i>', //dust
'771': '<i class="wi wi-snowflake-cold"></i>', //cold
'781': '<i class="wi wi-tornado"></i>', //tornado
'800': '<i class="wi wi-day-sunny"></i>', //sunny,
'801': '<i class="wi wi-day-cloudy"></i>', //partly cloudy (day)
'802': '<i class="wi wi-day-cloudy"></i>', //partly cloudy (day)
'803': '<i class="wi wi-day-cloudy"></i>', //partly cloudy (day)
'804': '<i class="wi wi-day-cloudy"></i>', //partly cloudy (day)
};
}
$(window).load(function() {
// Fetch the weather data for right now
queryOpenWeatherMap();
// Query Yahoo! at the requested interval for new weather data
setInterval(function() {
queryOpenWeatherMap();
}, waitBetweenWeatherQueriesMS);
// Set the current time and date on the clock
if ($('#time').length) {
$('#time').html(moment().format(formatTime));
}
if ($('#date').length) {
$('#date').html(moment().format(formatDate));
}
// Refresh the time and date every second
setInterval(function(){
if ($('#time').length) {
$('#time').html(moment().format(formatTime));
}
if ($('#date').length) {
$('#date').html(moment().format(formatDate));
}
}, 1000);
});
}());
================================================
FILE: package.json
================================================
{
"name": "kitchenDisplay",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"devDependencies": {
"bower": "^1.3.12"
}
}
================================================
FILE: screenOff.sh
================================================
#!/bin/sh
tvservice --off > /dev/null
================================================
FILE: screenOn.sh
================================================
#!/bin/sh
export DISPLAY=:0
tvservice -p
fbset -depth 8; fbset -depth 16; xrefresh
================================================
FILE: skins/default/css/style.css
================================================
@font-face {
font-family: OSP-DIN;
src: url(../font/OSP-DIN.ttf);
}
body {
text-align: center;
background: gray;
color: white;
font-family: 'OSP-DIN', Arial, sans-serif;
margin: 0px;
padding: 0px;
}
a {
color: inherit;
text-decoration: inherit;
}
#wrapper {
position: fixed;
width: 100%;
height: 100%;
}
#attribution {
position: absolute;
top: 0px;
right: 0px;
}
#display {
width: 100%;
height: 100%;
text-align: center;
background: black;
}
.forecast {
width: 20%;
}
#forecast1 {
color: #FFFFFF;
}
#forecast2 {
color: #CCCCCC;
}
#forecast3 {
color: #999999;
}
#forecast4 {
color: #777777;
}
#forecast5 {
color: #777777;
}
.wi {
font-size: 14vmin;
line-height: 19vmin !important;
}
#currently {
height: 56vh;
}
#currently .wi {
font-size: 18vmin;
}
#forecastHeading {
height: 100px;
}
#forecast {
font-size: 15vmin;
margin-bottom: 4vmin;
}
.day {
font-size: 3.5vmin;
margin-bottom: 1.5vmin;
}
.desc {
font-size: 3.5vmin;
margin-top: 2.5vmin;
margin-bottom: 0.5vmin;
}
.highTemp {
font-size: 3vmin;
}
.lowTemp {
font-size: 3vmin;
}
.currentTemp {
font-size: 3.5vmin;
}
.temp {
font-size: 15vmin;
}
#currentlyHeading {
font-size: 5vmin;
}
#currently .desc {
font-size: 8vmin;
margin-bottom: 0.5vmin;
}
#currently .tvminp {
font-size: 2.5vmin;
}
#time {
font-size: 15vmin;
}
#date {
font-size: 5vmin;
color: #CCCCCC;
}
#currentlyWrapper {
display: inline-block;
height: 100%;
width: 100%;
background: rgba(255,255,255,0.2);
padding-top: 4vh;
}
================================================
FILE: skins/default/font/SIL Open Font License.txt
================================================
This Font Software is licensed under the SIL Open Font License, Version 1.1.
This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL
-----------------------------------------------------------
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
-----------------------------------------------------------
PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide development of collaborative font projects, to support the font creation efforts of academic and linguistic communities, and to provide a free and open framework in which fonts may be shared and improved in partnership with others.
The OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided that any reserved names are not used by derivative works. The fonts and derivatives, however, cannot be released under any other type of license. The requirement for fonts to remain under this license does not apply to any document created using the fonts or their derivatives.
DEFINITIONS
"Font Software" refers to the set of files released by the Copyright Holder(s) under this license and clearly marked as such. This may include source files, build scripts and documentation.
"Reserved Font Name" refers to any names specified as such after the copyright statement(s).
"Original Version" refers to the collection of Font Software components as distributed by the Copyright Holder(s).
"Modified Version" refers to any derivative made by adding to, deleting, or substituting -- in part or in whole -- any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment.
"Author" refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software.
PERMISSION & CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions:
1) Neither the Font Software nor any of its individual components, in Original or Modified Versions, may be sold by itself.
2) Original or Modified Versions of the Font Software may be bundled, redistributed and/or sold with any software, provided that each copy contains the above copyright notice and this license. These can be included either as stand-alone text files, human-readable headers or in the appropriate machine-readable metadata fields within text or binary files as long as those fields can be easily viewed by the user.
3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written permission is granted by the corresponding Copyright Holder. This restriction only applies to the primary font name as presented to the users.
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall not be used to promote, endorse or advertise any Modified Version, except to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with their explicit written permission.
5) The Font Software, modified or unmodified, in part or in whole, must be distributed entirely under this license, and must not be distributed under any other license. The requirement for fonts to remain under this license does not apply to any document created using the Font Software.
TERMINATION
This license becomes null and void if any of the above conditions are not met.
DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.
================================================
FILE: skins/default/index.html
================================================
<!doctype html>
<html>
<head>
<meta charset="utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<meta name="application-name" content="Pi Kitchen Dashboard"/>
<title>Pi Kitchen Dashboard Default</title>
<meta name="description" content="Pi Kitchen Dashboard default template"/>
<meta name="author" content="Joshua Woehlke"/>
<meta name="designer" content="Joshua Woehlke, Ryan Smith"/>
<!-- Template-specific styles -->
<link rel="stylesheet" type="text/css" href="css/style.css" />
</head>
<body>
<!--
Skinning the Pi Kitchen Dashboard is easy. Simply create an HTML
page, ensure that the two sections marked REQUIRED appear,
and place elements onto the page to be auto-populated. The rest
is limited only by your imagination.
Required auto-populated IDs for skin design:
You will need to include some elements in your skin so that the
weather and time updates may be auto-populated onto the page.
The classes indented beneath the IDs indicate that elements with
these classes should be found nested somewhere inside the element
with that ID.
#currently
.icon - Current condition icon (customize icons in your skin's js)
.desc - Plain text condition
.temp - Current temperature
#forecast1 ... #forecast5
.day - Plain text day of the week
.icon - Forecast condition icon
.desc - Plain text forecast condition
.high - Forecasted high temperature
.low - Forecasted low temperature
#time - Time value provided by moment.js
#date - Date value provided by moment.js
a.yahooLink - Required for Yahoo! Weather API usage. Any
weather data must link to its source on Yahoo.
The appropriate href will be populated into any
link with this class.
Changing weather icons:
By default, the included Weather Icons font will be used in your
skin; however, if you'd like to use custom icons, define a JS array
called icons and specify the HTML you'd like to use for each
condition code. An example of this array can be found in the
default skin in the js/ folder. Plese not that this script must
be loaded before weather.js.
-->
<div id="wrapper">
<table id="display">
<tbody>
<tr>
<td id="currently" colspan="2">
<!-- Current weather information -->
<a class="yahooLink" href="#" target="_blank">
<div id="currentlyWrapper">
<div class="icon"></div>
<div class="desc"></div>
<div class="currentTemp">Temperature:<br /><span class="temp"></span></div>
</div>
</a>
</td>
<td colspan="3">
<!-- Current date and time information -->
<div id="time"></div>
<div id="date"></div>
</td>
</tr>
<tr>
<!-- Upcoming forecasts -->
<td class="forecast" id="forecast1">
<a class="yahooLink" href="#" target="_blank">
<div class="day"></div>
<div class="icon"></div>
<div class="desc"></div>
<div class="highTemp">High: <span class="high"></span></div>
<div class="lowTemp">Low: <span class="low"></span></div>
</a>
</td>
<td class="forecast" id="forecast2">
<a class="yahooLink" href="#" target="_blank">
<div class="day"></div>
<div class="icon"></div>
<div class="desc"></div>
<div class="highTemp">High: <span class="high"></span></div>
<div class="lowTemp">Low: <span class="low"></span></div>
</a>
</td>
<td class="forecast" id="forecast3">
<a class="yahooLink" href="#" target="_blank">
<div class="day"></div>
<div class="icon"></div>
<div class="desc"></div>
<div class="highTemp">High: <span class="high"></span></div>
<div class="lowTemp">Low: <span class="low"></span></div>
</a>
</td>
<td class="forecast" id="forecast4">
<a class="yahooLink" href="#" target="_blank">
<div class="day"></div>
<div class="icon"></div>
<div class="desc"></div>
<div class="highTemp">High: <span class="high"></span></div>
<div class="lowTemp">Low: <span class="low"></span></div>
</a>
</td>
<td class="forecast" id="forecast5">
<a class="yahooLink" href="#" target="_blank">
<div class="day"></div>
<div class="icon"></div>
<div class="desc"></div>
<div class="highTemp">High: <span class="high"></span></div>
<div class="lowTemp">Low: <span class="low"></span></div>
</a>
</td>
</tr>
</tbody>
</table>
</div>
<!-- OPTIONAL custom icons -->
<!-- --> <!--<script src="js/icons.js"></script>-->
<!-- OPTIONAL custom icons -->
<!-- REQUIRED template files -->
<!-- --> <script src="../../bower_components/jquery/dist/jquery.min.js"></script>
<!-- --> <script src="../../bower_components/moment/min/moment.min.js"></script>
<!-- --> <script src="../../js/weather.js"></script>
<!-- REQUIRED template files -->
</body>
</html>
================================================
FILE: skins/default/js/icons.js
================================================
/* Icons are from the weather icons pack on github at
* https://github.com/erikflowers/weather-icons. Change any of the icons by
* editing the following array. Position in array corresponds to Yahoo!
* Weather's condition code, which are commented below in plain English.
*
* Note that the original values here and the accompanying Weather Icons
* stylesheet are loaded by default by weather.js if this file is not
* explicitly included in your HTML before weather.js. In the default skin,
* the script tag linking to this file is commented out to demonstrate this
* behavior; therefore, this file is only a placeholder for what your icons.js
* should look like should you choose to use alternate icons/images/HTML.
*/
var icons = [
'<i class="wi wi-tornado"></i>', //tornado
'<i class="wi wi-rain-wind"></i>', //tropical storm
'<i class="wi wi-tornado"></i>', //hurricane
'<i class="wi wi-thunderstorm"></i>', //severe thunderstorms
'<i class="wi wi-thunderstorm"></i>', //thunderstorms
'<i class="wi wi-rain-mix"></i>', //mixed rain and snow
'<i class="wi wi-rain-mix"></i>', //mixed rain and sleet
'<i class="wi wi-rain-mix"></i>', //mixed snow and sleet
'<i class="wi wi-rain-mix"></i>', //freezing drizzle
'<i class="wi wi-cloudy"></i>', //drizzle
'<i class="wi wi-rain"></i>', //freezing rain
'<i class="wi wi-rain"></i>', //showers
'<i class="wi wi-rain"></i>', //showers
'<i class="wi wi-snow"></i>', //snow flurries
'<i class="wi wi-snow"></i>', //light snow showers
'<i class="wi wi-showers"></i>', //blowing snow
'<i class="wi wi-snow"></i>', //snow
'<i class="wi wi-hail"></i>', //hail
'<i class="wi wi-rain-mix"></i>', //sleet
'<i class="wi wi-dust"></i>', //dust
'<i class="wi wi-fog"></i>', //foggy
'<i class="wi wi-day-haze"></i>', //haze
'<i class="wi wi-smoke"></i>', //smoky
'<i class="wi wi-strong-wind"></i>', //blustery
'<i class="wi wi-strong-wind"></i>', //windy
'<i class="wi wi-snowflake-cold"></i>', //cold
'<i class="wi wi-cloudy"></i>', //cloudy
'<i class="wi wi-night-cloudy"></i>', //mostly cloudy (night)
'<i class="wi wi-day-cloudy"></i>', //mostly cloudy (day)
'<i class="wi wi-night-cloudy"></i>', //partly cloudy (night)
'<i class="wi wi-day-cloudy"></i>', //partly cloudy (day)
'<i class="wi wi-night-clear"></i>', //clear (night)
'<i class="wi wi-day-sunny"></i>', //sunny
'<i class="wi wi-night-clear"></i>', //fair (night)
'<i class="wi wi-day-sunny"></i>', //fair (day)
'<i class="wi wi-hail"></i>', //mixed rain and hail
'<i class="wi wi-hot"></i>', //hot
'<i class="wi wi-storm-showers"></i>', //isolated thunderstorms
'<i class="wi wi-storm-showers"></i>', //scattered thunderstorms
'<i class="wi wi-storm-showers"></i>', //scattered thunderstorms
'<i class="wi wi-showers"></i>', //scattered showers
'<i class="wi wi-sleet"></i>', //heavy snow
'<i class="wi wi-snow"></i>', //scattered snow showers
'<i class="wi wi-sleet"></i>', //heavy snow
'<i class="wi wi-cloudy"></i>', //partly cloudy
'<i class="wi wi-storm-showers"></i>', //thundershowers
'<i class="wi wi-snow"></i>', //snow showers
'<i class="wi wi-storm-showers"></i>' //isolated thundershowers
];
gitextract_mgrphg14/
├── .gitignore
├── README.md
├── bower.json
├── css/
│ └── weather-icons.css
├── font/
│ ├── SIL Open Font License.txt
│ └── WeatherIcons-Regular.otf
├── index.html
├── js/
│ ├── redirect.js
│ └── weather.js
├── package.json
├── screenOff.sh
├── screenOn.sh
└── skins/
└── default/
├── css/
│ └── style.css
├── font/
│ └── SIL Open Font License.txt
├── index.html
└── js/
└── icons.js
SYMBOL INDEX (4 symbols across 1 files)
FILE: js/weather.js
function resolveTemp (line 32) | function resolveTemp(temp) {
function fillCurrently (line 38) | function fillCurrently(currently) {
function fillForecast (line 55) | function fillForecast(day, forecast) {
function queryOpenWeatherMap (line 88) | function queryOpenWeatherMap() {
Condensed preview — 16 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (57K chars).
[
{
"path": ".gitignore",
"chars": 31,
"preview": "node_modules/\nbower_components/"
},
{
"path": "README.md",
"chars": 7522,
"preview": "**This project is not maintained and is presented for archival purposes only**\n\n# Pi Kitchen Dashboard\n##### Because thr"
},
{
"path": "bower.json",
"chars": 332,
"preview": "{\n \"name\": \"kitchenDisplay\",\n \"version\": \"0.0.0\",\n \"authors\": [\n \"Joshua Woehlke <joshua.woehlke@gmail.com>\"\n ],\n"
},
{
"path": "css/weather-icons.css",
"chars": 14928,
"preview": "/*!\n * Weather Icons 1.3\n * Updated November 30th, 2014\n * Weather themed icons for Bootstrap\n * -------------------"
},
{
"path": "font/SIL Open Font License.txt",
"chars": 4299,
"preview": "This Font Software is licensed under the SIL Open Font License, Version 1.1.\nThis license is copied below, and is also a"
},
{
"path": "index.html",
"chars": 347,
"preview": "<!doctype html>\n<html>\n\t<head>\n\t\t<meta charset=\"utf-8\"/>\n\t\t<title>Redirect to skin...</title>\n\t</head>\n\t<body>\n\t\t<script"
},
{
"path": "js/redirect.js",
"chars": 246,
"preview": "// Redirect the loaded page to the selected skin's index\n\n(function() {\n\tvar href = window.location.href;\n\tvar index = h"
},
{
"path": "js/weather.js",
"chars": 9525,
"preview": "(function() {\n\t'use strict';\n\t/*global $, moment*/\n\n\t/******************************************************************"
},
{
"path": "package.json",
"chars": 261,
"preview": "{\n \"name\": \"kitchenDisplay\",\n \"version\": \"1.0.0\",\n \"description\": \"\",\n \"main\": \"index.js\",\n \"scripts\": {\n \"test\""
},
{
"path": "screenOff.sh",
"chars": 37,
"preview": "#!/bin/sh\ntvservice --off > /dev/null"
},
{
"path": "screenOn.sh",
"chars": 82,
"preview": "#!/bin/sh\nexport DISPLAY=:0\ntvservice -p\nfbset -depth 8; fbset -depth 16; xrefresh"
},
{
"path": "skins/default/css/style.css",
"chars": 1464,
"preview": "@font-face {\n font-family: OSP-DIN;\n src: url(../font/OSP-DIN.ttf);\n}\n\nbody {\ntext-align: center;\nbackground: gray;\n"
},
{
"path": "skins/default/font/SIL Open Font License.txt",
"chars": 4299,
"preview": "This Font Software is licensed under the SIL Open Font License, Version 1.1.\nThis license is copied below, and is also a"
},
{
"path": "skins/default/index.html",
"chars": 5111,
"preview": "<!doctype html>\n<html>\n\t<head>\n\t\t<meta charset=\"utf-8\"/>\n\t\t<meta name=\"viewport\" content=\"width=device-width, initial-sc"
},
{
"path": "skins/default/js/icons.js",
"chars": 3263,
"preview": "/* Icons are from the weather icons pack on github at\n * https://github.com/erikflowers/weather-icons. Change any of the"
}
]
// ... and 1 more files (download for full content)
About this extraction
This page contains the full source code of the userexec/Pi-Kitchen-Dashboard GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 16 files (50.5 KB), approximately 15.5k tokens, and a symbol index with 4 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.