diff --git a/skins/Standard/NOAA/NOAA-YYYY-MM.txt.tmpl b/skins/Standard/NOAA/NOAA-YYYY-MM.txt.tmpl
new file mode 100644
index 00000000..ee9d4a81
--- /dev/null
+++ b/skins/Standard/NOAA/NOAA-YYYY-MM.txt.tmpl
@@ -0,0 +1,39 @@
+#errorCatcher Echo
+#set $YM="%Y %m"
+#set $D=" %d"
+#set $M=" %b"
+#set $Time=" %H:%M"
+#set $NODAY=" N/A"
+#set $Temp="%6.1f"
+#set $Wind="%6.1f"
+#set $Dir="%6.0f"
+#set $Count="%6d"
+#set $NONE=" N/A"
+#if $unit.unit_type_dict.group_rain == "mm"
+#set $Rain="%6.1f"
+#else
+#set $Rain="%6.2f"
+#end if
+ MONTHLY CLIMATOLOGICAL SUMMARY for $month_name $year_name
+
+
+NAME: $station.location
+ELEV: $station.altitude LAT: $station.latitude[0]-$station.latitude[1] $station.latitude[2] LONG: $station.longitude[0]-$station.longitude[1] $station.longitude[2]
+
+
+ TEMPERATURE ($unit.label.outTemp.strip()), RAIN ($unit.label.rain.strip()), WIND SPEED ($unit.label.windSpeed.strip())
+
+ HEAT COOL AVG
+ MEAN DEG DEG WIND DOM
+DAY TEMP HIGH TIME LOW TIME DAYS DAYS RAIN SPEED HIGH TIME DIR
+---------------------------------------------------------------------------------------
+#for $day in $month.days
+#if $day.barometer.count.raw
+$day.dateTime.format($D) $day.outTemp.avg.nolabel($Temp,$NONE) $day.outTemp.max.nolabel($Temp,$NONE) $day.outTemp.maxtime.format($Time) $day.outTemp.min.nolabel($Temp,$NONE) $day.outTemp.mintime.format($Time) $day.heatdeg.sum.nolabel($Temp,$NONE) $day.cooldeg.sum.nolabel($Temp,$NONE) $day.rain.sum.nolabel($Rain,$NONE) $day.wind.avg.nolabel($Wind,$NONE) $day.wind.max.nolabel($Wind,$NONE) $day.wind.maxtime.format($Time) $day.wind.vecdir.nolabel($Dir,$NONE)
+#else
+$day.dateTime.format($D)
+#end if
+#end for
+---------------------------------------------------------------------------------------
+ $month.outTemp.avg.nolabel($Temp,$NONE) $month.outTemp.max.nolabel($Temp,$NONE) $month.outTemp.maxtime.format($D) $month.outTemp.min.nolabel($Temp,$NONE) $month.outTemp.mintime.format($D) $month.heatdeg.sum.nolabel($Temp,$NONE) $month.cooldeg.sum.nolabel($Temp,$NONE) $month.rain.sum.nolabel($Rain,$NONE) $month.wind.avg.nolabel($Wind,$NONE) $month.wind.max.nolabel($Wind,$NONE) $month.wind.maxtime.format($D) $month.wind.vecdir.nolabel($Dir)
+
diff --git a/skins/Standard/NOAA/NOAA-YYYY.txt.tmpl b/skins/Standard/NOAA/NOAA-YYYY.txt.tmpl
new file mode 100644
index 00000000..2a34cdd3
--- /dev/null
+++ b/skins/Standard/NOAA/NOAA-YYYY.txt.tmpl
@@ -0,0 +1,96 @@
+#errorCatcher Echo
+#set $YM="%Y %m"
+#set $D=" %d"
+#set $M=" %b"
+#set $NODAY=" N/A"
+#set $Temp="%6.1f"
+#set $Wind="%6.1f"
+#set $Dir="%6.0f"
+#set $Count="%6d"
+#set $NONE=" N/A"
+#if $unit.unit_type_dict.group_temperature == "degree_F"
+#set $Hot =(90.0,"degree_F")
+#set $Cold =(32.0,"degree_F")
+#set $VeryCold=(0.0, "degree_F")
+#else
+#set $Hot =(30.0,"degree_C")
+#set $Cold =(0.0,"degree_C")
+#set $VeryCold=(-20.0,"degree_C")
+#end if
+#if $unit.unit_type_dict.group_rain == "inch"
+#set $Trace =(0.01,"inch")
+#set $SomeRain =(0.1, "inch")
+#set $Soak =(1.0, "inch")
+#set $Rain="%6.2f"
+#elif $unit.unit_type_dict.group_rain == "mm"
+#set $Trace =(.3, "mm")
+#set $SomeRain =(3, "mm")
+#set $Soak =(30.0,"mm")
+#set $Rain="%6.1f"
+#else
+#set $Trace =(.03,"cm")
+#set $SomeRain =(.3, "cm")
+#set $Soak =(3.0,"cm")
+#set $Rain="%6.2f"
+#end if
+#def ShowInt($T)
+$("%6d" % $T[0])#slurp
+#end def
+#def ShowFloat($R)
+$("%6.2f" % $R[0])#slurp
+#end def
+ CLIMATOLOGICAL SUMMARY for year $year_name
+
+
+NAME: $station.location
+ELEV: $station.altitude LAT: $station.latitude[0]-$station.latitude[1] $station.latitude[2] LONG: $station.longitude[0]-$station.longitude[1] $station.longitude[2]
+
+
+ TEMPERATURE ($unit.label.outTemp.strip())
+
+ HEAT COOL MAX MAX MIN MIN
+ MEAN MEAN DEG DEG >= <= <= <=
+ YR MO MAX MIN MEAN DAYS DAYS HI DAY LOW DAY $ShowInt($Hot) $ShowInt($Cold) $ShowInt($Cold) $ShowInt($VeryCold)
+------------------------------------------------------------------------------------------------
+#for $month in $year.months
+#if $month.barometer.count.raw
+$month.dateTime.format($YM) $month.outTemp.meanmax.nolabel($Temp,$NONE) $month.outTemp.meanmin.nolabel($Temp,$NONE) $month.outTemp.avg.nolabel($Temp,$NONE) $month.heatdeg.sum.nolabel($Temp,$NONE) $month.cooldeg.sum.nolabel($Temp,$NONE) $month.outTemp.max.nolabel($Temp,$NONE) $month.outTemp.maxtime.format($D,$NODAY) $month.outTemp.min.nolabel($Temp,$NONE) $month.outTemp.mintime.format($D,$NODAY) $month.outTemp.max_ge($Hot).nolabel($Count,$NONE) $month.outTemp.max_le($Cold).nolabel($Count,$NONE) $month.outTemp.min_le($Cold).nolabel($Count,$NONE) $month.outTemp.min_le($VeryCold).nolabel($Count,$NONE)
+#else
+$month.dateTime.format($YM)
+#end if
+#end for
+------------------------------------------------------------------------------------------------
+ $year.outTemp.meanmax.nolabel($Temp,$NONE) $year.outTemp.meanmin.nolabel($Temp,$NONE) $year.outTemp.avg.nolabel($Temp,$NONE) $year.heatdeg.sum.nolabel($Temp,$NONE) $year.cooldeg.sum.nolabel($Temp,$NONE) $year.outTemp.max.nolabel($Temp,$NONE) $year.outTemp.maxtime.format($M,$NODAY) $year.outTemp.min.nolabel($Temp,$NONE) $year.outTemp.mintime.format($M,$NODAY) $year.outTemp.max_ge($Hot).nolabel($Count,$NONE) $year.outTemp.max_le($Cold).nolabel($Count,$NONE) $year.outTemp.min_le($Cold).nolabel($Count,$NONE) $year.outTemp.min_le($VeryCold).nolabel($Count,$NONE)
+
+
+ PRECIPITATION ($unit.label.rain.strip())
+
+ MAX ---DAYS OF RAIN---
+ OBS. OVER
+ YR MO TOTAL DAY DATE $ShowFloat(Trace) $ShowFloat($SomeRain) $ShowFloat($Soak)
+------------------------------------------------
+#for $month in $year.months
+#if $month.barometer.count.raw
+$month.dateTime.format($YM) $month.rain.sum.nolabel($Rain,$NONE) $month.rain.maxsum.nolabel($Rain,$NONE) $month.rain.maxsumtime.format($D,$NODAY) $month.rain.sum_ge($Trace).nolabel($Count,$NONE) $month.rain.sum_ge($SomeRain).nolabel($Count,$NONE) $month.rain.sum_ge($Soak).nolabel($Count,$NONE)
+#else
+$month.dateTime.format($YM)
+#end if
+#end for
+------------------------------------------------
+ $year.rain.sum.nolabel($Rain,$NONE) $year.rain.maxsum.nolabel($Rain,$NONE) $year.rain.maxsumtime.format($M,$NODAY) $year.rain.sum_ge($Trace).nolabel($Count,$NONE) $year.rain.sum_ge($SomeRain).nolabel($Count,$NONE) $year.rain.sum_ge($Soak).nolabel($Count,$NONE)
+
+
+ WIND SPEED ($unit.label.windSpeed.strip())
+
+ DOM
+ YR MO AVG HI DATE DIR
+-----------------------------------
+#for $month in $year.months
+#if $month.barometer.count.raw
+$month.dateTime.format($YM) $month.wind.avg.nolabel($Wind,$NONE) $month.wind.max.nolabel($Wind,$NONE) $month.wind.maxtime.format($D,$NODAY) $month.wind.vecdir.nolabel($Dir,$NONE)
+#else
+$month.dateTime.format($YM)
+#end if
+#end for
+-----------------------------------
+ $year.wind.avg.nolabel($Wind,$NONE) $year.wind.max.nolabel($Wind,$NONE) $year.wind.maxtime.format($M,$NODAY) $year.wind.vecdir.nolabel($Dir,$NONE)
diff --git a/skins/Standard/RSS/weewx_rss.xml.tmpl b/skins/Standard/RSS/weewx_rss.xml.tmpl
new file mode 100644
index 00000000..ece8e5d7
--- /dev/null
+++ b/skins/Standard/RSS/weewx_rss.xml.tmpl
@@ -0,0 +1,136 @@
+
+
+
+ $station.location, Weather Conditions
+ $station.station_url
+ Current conditions, and daily, monthly, and yearly summaries
+ en-us
+ $current.dateTime.format("%a, %d %b %Y %H:%M:%S %Z")
+
+ $current.dateTime.format("%a, %d %b %Y %H:%M:%S %Z")
+ http://blogs.law.harvard.edu/tech/rss
+ weewx $station.version
+ $current.interval.string('')
+
+
+ Weather Conditions at $current.dateTime
+ $station.station_url
+
+ Outside temperature: $current.outTemp;
+ Barometer: $current.barometer;
+ Wind: $current.windSpeed from $current.windDir;
+ Rain rate: $current.rainRate;
+ Inside temperature: $current.inTemp
+
+ $current.dateTime.format("%a, %d %b %Y %H:%M:%S %Z")
+ $station.latitude_f
+ $station.longitude_f
+
+ Time: $current.dateTime
+ Outside Temperature: $current.outTemp
+ Inside Temperature: $current.inTemp
+ Wind Chill: $current.windchill
+ Heat Index: $current.heatindex
+ Dewpoint: $current.dewpoint
+ Humidity: $current.outHumidity
+ Barometer: $current.barometer
+ Wind: $current.windSpeed from $current.windDir
+ Rain Rate: $current.rainRate
+
+ ]]>
+
+
+
+ Daily Weather Summary as of $current.dateTime
+ $station.station_url
+
+ Min outside temperature: $day.outTemp.min at $day.outTemp.mintime;
+ Max outside temperature: $day.outTemp.max at $day.outTemp.maxtime;
+ Min inside temperature: $day.inTemp.min at $day.inTemp.mintime;
+ Max inside temperature: $day.inTemp.max at $day.inTemp.maxtime;
+ Min barometer: $day.barometer.min at $day.barometer.mintime;
+ Max barometer: $day.barometer.max at $day.barometer.maxtime;
+ Max wind : $day.wind.max from $day.wind.gustdir at $day.wind.maxtime;
+ Rain today: $day.rain.sum
+
+ $current.dateTime.format("%a, %d %b %Y %H:%M:%S %Z")
+ $station.latitude_f
+ $station.longitude_f
+
+ Day: $day.dateTime.format("%d %b %Y")
+ Min Outside Temperature: $day.outTemp.min at $day.outTemp.mintime
+ Max Outside Temperature: $day.outTemp.max at $day.outTemp.maxtime
+ Min Inside Temperature: $day.inTemp.min at $day.inTemp.mintime
+ Max Inside Temperature: $day.inTemp.max at $day.inTemp.maxtime
+ Min Barometer: $day.barometer.min at $day.barometer.mintime
+ Max Barometer: $day.barometer.max at $day.barometer.maxtime
+ Max Wind : $day.wind.max from $day.wind.gustdir at $day.wind.maxtime
+ Rain today: $day.rain.sum
+
+ ]]>
+
+
+
+ Monthly Weather Summary as of $current.dateTime
+ $station.station_url/month.html
+
+ Min outside temperature: $month.outTemp.min at $month.outTemp.mintime;
+ Max outside temperature: $month.outTemp.max at $month.outTemp.maxtime;
+ Min inside temperature: $month.inTemp.min at $month.inTemp.mintime;
+ Max inside temperature: $month.inTemp.max at $month.inTemp.maxtime;
+ Min barometer: $month.barometer.min at $month.barometer.mintime;
+ Max barometer: $month.barometer.max at $month.barometer.maxtime;
+ Max wind : $month.wind.max from $month.wind.gustdir at $month.wind.maxtime;
+ Rain total for month: $month.rain.sum
+
+ $current.dateTime.format("%a, %d %b %Y %H:%M:%S %Z")
+
+ Month: $month.dateTime.format("%B %Y")
+ Max Outside Temperature: $month.outTemp.max at $month.outTemp.maxtime
+ Min Outside Temperature: $month.outTemp.min at $month.outTemp.mintime
+ Max Inside Temperature: $month.inTemp.max at $month.inTemp.maxtime
+ Min Inside Temperature: $month.inTemp.min at $month.inTemp.mintime
+ Min Barometer: $month.barometer.min at $month.barometer.mintime
+ Max Barometer: $month.barometer.max at $month.barometer.maxtime
+ Max Wind : $month.wind.max from $month.wind.gustdir at $month.wind.maxtime
+ Rain total for month: $month.rain.sum
+
+ ]]>
+
+
+
+ Yearly Weather Summary as of $current.dateTime
+ $station.station_url/year.html
+
+ Min outside temperature: $year.outTemp.min at $year.outTemp.mintime;
+ Max outside temperature: $year.outTemp.max at $year.outTemp.maxtime;
+ Min inside temperature: $year.inTemp.min at $year.inTemp.mintime;
+ Max inside temperature: $year.inTemp.max at $year.inTemp.maxtime;
+ Min barometer: $year.barometer.min at $year.barometer.mintime;
+ Max barometer: $year.barometer.max at $year.barometer.maxtime;
+ Max wind : $year.wind.max from $year.wind.gustdir at $year.wind.maxtime;
+ Rain total for year: $year.rain.sum
+
+ $current.dateTime.format("%a, %d %b %Y %H:%M:%S %Z")
+
+ Year: $year.dateTime.format("%Y")
+ Max Outside Temperature: $year.outTemp.max at $year.outTemp.maxtime
+ Min Outside Temperature: $year.outTemp.min at $year.outTemp.mintime
+ Max Inside Temperature: $year.inTemp.max at $year.inTemp.maxtime
+ Min Inside Temperature: $year.inTemp.min at $year.inTemp.mintime
+ Min Barometer: $year.barometer.min at $year.barometer.mintime
+ Max Barometer: $year.barometer.max at $year.barometer.maxtime
+ Max Wind : $year.wind.max from $year.wind.gustdir at $year.wind.maxtime
+ Rain total for year: $year.rain.sum
+
+ ]]>
+
+
+
+
diff --git a/skins/Standard/backgrounds/band.gif b/skins/Standard/backgrounds/band.gif
new file mode 100644
index 00000000..fdfd5cdb
Binary files /dev/null and b/skins/Standard/backgrounds/band.gif differ
diff --git a/skins/Standard/backgrounds/butterfly.jpg b/skins/Standard/backgrounds/butterfly.jpg
new file mode 100644
index 00000000..e33a26ff
Binary files /dev/null and b/skins/Standard/backgrounds/butterfly.jpg differ
diff --git a/skins/Standard/backgrounds/drops.gif b/skins/Standard/backgrounds/drops.gif
new file mode 100644
index 00000000..6d3814ec
Binary files /dev/null and b/skins/Standard/backgrounds/drops.gif differ
diff --git a/skins/Standard/backgrounds/flower.jpg b/skins/Standard/backgrounds/flower.jpg
new file mode 100644
index 00000000..4b33f6d3
Binary files /dev/null and b/skins/Standard/backgrounds/flower.jpg differ
diff --git a/skins/Standard/backgrounds/leaf.jpg b/skins/Standard/backgrounds/leaf.jpg
new file mode 100644
index 00000000..dd3b02c6
Binary files /dev/null and b/skins/Standard/backgrounds/leaf.jpg differ
diff --git a/skins/Standard/backgrounds/night.gif b/skins/Standard/backgrounds/night.gif
new file mode 100644
index 00000000..e6a17743
Binary files /dev/null and b/skins/Standard/backgrounds/night.gif differ
diff --git a/skins/Standard/favicon.ico b/skins/Standard/favicon.ico
new file mode 100644
index 00000000..bd0f996f
Binary files /dev/null and b/skins/Standard/favicon.ico differ
diff --git a/skins/Standard/index.html.tmpl b/skins/Standard/index.html.tmpl
new file mode 100644
index 00000000..75f890a4
--- /dev/null
+++ b/skins/Standard/index.html.tmpl
@@ -0,0 +1,527 @@
+#errorCatcher Echo
+##
+## Specifying an encoding of UTF-8 is usually safe, but if your text is
+## actually in Latin-1, then you should replace the string "UTF-8" with "latin-1"
+## If you do this, you should also change the 'Content-Type' metadata below.
+#encoding UTF-8
+##
+
+
+
+ ## This choice should match the #encoding directive above
+
+ $station.location Current Weather Conditions
+
+
+
+
+
+
+
+ This station uses a $station.hardware, controlled by
+ 'weewx', an experimental
+ weather software system written in Python. Weewx
+ was designed to be simple, fast, and easy to understand by
+ leveraging modern software concepts.
+
Weewx uptime: $station.uptime
+ Server uptime: $station.os_uptime
+ weewx v$station.version
+
+
+
+
+ Today's Almanac
+
+
+ #if $almanac.hasExtras
+ ## Extended almanac information is available. Do the full set of tables.
+ #set $sun_altitude = $almanac.sun.alt
+ #if $sun_altitude < 0
+ #set $sun_None="(Always down)"
+ #else
+ #set $sun_None="(Always up)"
+ #end if
+
+
+
Sun
+
+
Start civil twilight:
+
$almanac(horizon=-6).sun(use_center=1).rise
+
+
+
Sunrise:
+
$almanac.sun.rise.string($sun_None)
+
+
+
Transit:
+
$almanac.sun.transit
+
+
+
Sunset:
+
$almanac.sun.set.string($sun_None)
+
+
+
End civil twilight:
+
$almanac(horizon=-6).sun(use_center=1).set
+
+
+
Azimuth:
+
$("%.1f°" % $almanac.sun.az)
+
+
+
Altitude:
+
$("%.1f°" % $sun_altitude)
+
+
+
Right ascension:
+
$("%.1f°" % $almanac.sun.ra)
+
+
+
Declination:
+
$("%.1f°" % $almanac.sun.dec)
+
+ #if $almanac.next_equinox.raw < $almanac.next_solstice.raw
+ ## The equinox is before the solstice. Display them in order.
+
+
Equinox:
+
$almanac.next_equinox
+
+
+
Solstice:
+
$almanac.next_solstice
+
+ #else
+ ## The solstice is before the equinox. Display them in order.
+
+
+
+
diff --git a/skins/Standard/month.html.tmpl b/skins/Standard/month.html.tmpl
new file mode 100644
index 00000000..c2d8b298
--- /dev/null
+++ b/skins/Standard/month.html.tmpl
@@ -0,0 +1,418 @@
+#errorCatcher Echo
+##
+## Specifying an encoding of UTF-8 is usually safe, but if your text is
+## actually in Latin-1, then you should replace the string "UTF-8" with "latin-1"
+## If you do this, you should also change the 'Content-Type' metadata below.
+#encoding UTF-8
+##
+
+
+
+ ## This choice should match the #encoding directive above
+
+ $station.location Monthly weather summary
+
+
+
+
+
+
+
+
+
$station.location
+
Monthly Weather Summary
+
$current.dateTime
+
+
+
+
+
+
+ This Month
+
+
+
+
+
+
+ High Temperature
+ Low Temperature
+
+
+ $month.outTemp.max at $month.outTemp.maxtime
+ $month.outTemp.min at $month.outTemp.mintime
+
+
+
+
+ High Heat Index
+
+
+ $month.heatindex.max at $month.heatindex.maxtime
+
+
+
+
+ Low Wind Chill
+
+
+ $month.windchill.min at $month.windchill.mintime
+
+
+ ## Include the Google Analytics code if the user has supplied an ID:
+ #if $Extras.has_key('googleAnalyticsId')
+
+
+ #end if
+
+
+
diff --git a/skins/Standard/skin.conf b/skins/Standard/skin.conf
new file mode 100644
index 00000000..6684d5fa
--- /dev/null
+++ b/skins/Standard/skin.conf
@@ -0,0 +1,680 @@
+###############################################################################
+# STANDARD SKIN CONFIGURATION FILE #
+# Copyright (c) 2010 Tom Keffer #
+###############################################################################
+
+[Extras]
+ # Put any extra tags here that you want to be available in the templates
+
+ # Here's an example.
+ # This radar image would be available as $Extras.radar_img
+ #radar_img = http://radar.weather.gov/ridge/lite/N0R/RTX_loop.gif
+ # This URL will be used as the image hyperlink:
+ #radar_url = http://radar.weather.gov/ridge/radar.php?product=NCR&rid=RTX&loop=yes
+
+ # Here's another. If you have a Google Analytics ID, uncomment and edit
+ # the next line, and the analytics code will automatically be included
+ # in your generated HTML files:
+ #googleAnalyticsId = UA-12345678-1
+
+###############################################################################
+
+[Units]
+ # This section is for managing the selection and formatting of units.
+
+ [[Groups]]
+ # For each group of measurements, this section sets what units to
+ # use for it.
+ # NB: The unit is always in the singular. I.e., 'mile_per_hour',
+ # NOT 'miles_per_hour'
+
+ group_altitude = foot # Options are 'foot' or 'meter'
+ group_degree_day = degree_F_day # Options are 'degree_F_day' or 'degree_C_day'
+ group_direction = degree_compass
+ group_moisture = centibar
+ group_percent = percent
+ group_pressure = inHg # Options are 'inHg', 'mmHg', 'mbar', or 'hPa'
+ group_radiation = watt_per_meter_squared
+ group_rain = inch # Options are 'inch', 'cm', or 'mm'
+ group_rainrate = inch_per_hour # Options are 'inch_per_hour', 'cm_per_hour', or 'mm_per_hour'
+ group_speed = mile_per_hour # Options are 'mile_per_hour', 'km_per_hour', 'knot', or 'meter_per_second'
+ group_speed2 = mile_per_hour2 # Options are 'mile_per_hour2', 'km_per_hour2', 'knot2', or 'meter_per_second2'
+ group_temperature = degree_F # Options are 'degree_F' or 'degree_C'
+ group_uv = uv_index
+ group_volt = volt
+
+ # The following are used internally and should not be changed:
+ group_count = count
+ group_interval = minute
+ group_time = unix_epoch
+ group_elapsed = second
+
+ [[StringFormats]]
+ # This section sets the string formatting for each type of unit.
+
+ centibar = %.0f
+ cm = %.2f
+ cm_per_hour = %.2f
+ degree_C = %.1f
+ degree_F = %.1f
+ degree_compass = %.0f
+ foot = %.0f
+ hPa = %.1f
+ hour = %.1f
+ inHg = %.3f
+ inch = %.2f
+ inch_per_hour = %.2f
+ km_per_hour = %.0f
+ km_per_hour2 = %.1f
+ knot = %.0f
+ knot2 = %.1f
+ mbar = %.1f
+ meter = %.0f
+ meter_per_second = %.1f
+ meter_per_second2 = %.1f
+ mile_per_hour = %.0f
+ mile_per_hour2 = %.1f
+ mm = %.1f
+ mmHg = %.1f
+ mm_per_hour = %.1f
+ percent = %.0f
+ second = %.0f
+ uv_index = %.1f
+ volt = %.1f
+ watt_per_meter_squared = %.0f
+ NONE = " N/A"
+
+ [[Labels]]
+ # This section sets a label to be used for each type of unit.
+
+ centibar = " cb"
+ cm = " cm"
+ cm_per_hour = " cm/hr"
+ degree_C = °C
+ degree_F = °F
+ degree_compass = °
+ foot = " feet"
+ hPa = " hPa"
+ inHg = " inHg"
+ inch = " in"
+ inch_per_hour = " in/hr"
+ km_per_hour = " km/h"
+ km_per_hour2 = " km/h"
+ knot = " knots"
+ knot2 = " knots"
+ mbar = " mbar"
+ meter = " meters"
+ meter_per_second = " m/s"
+ meter_per_second2 = " m/s"
+ mile_per_hour = " mph"
+ mile_per_hour2 = " mph"
+ mm = " mm"
+ mmHg = " mmHg"
+ mm_per_hour = " mm/hr"
+ percent = %
+ volt = " V"
+ watt_per_meter_squared = " W/m²"
+ day = " day", " days"
+ hour = " hour", " hours"
+ minute = " minute", " minutes"
+ second = " second", " seconds"
+ NONE = ""
+
+ [[TimeFormats]]
+ # This section sets the string format to be used for each time scale.
+ # The values below will work in every locale, but may not look
+ # particularly attractive. See the Customization Guide for alternatives.
+
+ day = %X
+ week = %X (%A)
+ month = %x %X
+ year = %x %X
+ rainyear = %x %X
+ current = %x %X
+ ephem_day = %X
+ ephem_year = %x %X
+
+ [[Ordinates]]
+ # The ordinal directions. The last one should be for no wind direction
+ directions = N, NNE, NE, ENE, E, ESE, SE, SSE, S, SSW, SW, WSW, W, WNW, NW, NNW, N/A
+
+ [[DegreeDays]]
+ # This section sets the base temperatures used for the calculation
+ # of heating and cooling degree-days.
+
+ # Base temperature for heating days, with unit:
+ heating_base = 65, degree_F
+ # Base temperature for cooling days, with unit:
+ cooling_base = 65, degree_F
+
+ [[Trend]]
+ time_delta = 10800 # 3 hours
+ time_grace = 300 # 5 minutes
+
+###############################################################################
+
+[Labels]
+ # Labels used in this skin
+
+ # Set to hemisphere abbreviations suitable for your location:
+ hemispheres = N, S, E, W
+ # Formats to be used for latitude whole degrees, longitude whole degrees,
+ # and minutes:
+ latlon_formats = "%02d", "%03d", "%05.2f"
+
+ [[Generic]]
+ # Generic labels, keyed by an observation type.
+
+ barometer = Barometer
+ dewpoint = Dew Point
+ heatindex = Heat Index
+ inHumidity = Inside Humidity
+ inTemp = Inside Temperature
+ outHumidity = Outside Humidity
+ outTemp = Outside Temperature
+ radiation = Radiation
+ rain = Rain
+ rainRate = Rain Rate
+ rxCheckPercent = ISS Signal Quality
+ UV = UV Index
+ windDir = Wind Direction
+ windGust = Gust Speed
+ windGustDir = Gust Direction
+ windSpeed = Wind Speed
+ windchill = Wind Chill
+ windgustvec = Gust Vector
+ windvec = Wind Vector
+
+###############################################################################
+
+[Almanac]
+ # The labels to be used for the phases of the moon:
+ moon_phases = New, Waxing crescent, First quarter, Waxing gibbous, Full, Waning gibbous, Last quarter, Waning crescent
+
+###############################################################################
+
+[CheetahGenerator]
+ # This section is used by the generator CheetahGenerator, and specifies
+ # which files are to be generated from which template.
+
+ # Possible encodings are 'html_entities', 'utf8', or 'strict_ascii'
+ encoding = html_entities
+
+ [[SummaryByMonth]]
+ # Reports that summarize "by month"
+ [[[NOAA_month]]]
+ encoding = strict_ascii
+ template = NOAA/NOAA-YYYY-MM.txt.tmpl
+
+ [[SummaryByYear]]
+ # Reports that summarize "by year"
+ [[[NOAA_year]]]
+ encoding = strict_ascii
+ template = NOAA/NOAA-YYYY.txt.tmpl
+
+ [[ToDate]]
+ # Reports that show statistics "to date", such as day-to-date,
+ # week-to-date, month-to-date, etc.
+ [[[day]]]
+ template = index.html.tmpl
+
+ [[[week]]]
+ template = week.html.tmpl
+
+ [[[month]]]
+ template = month.html.tmpl
+
+ [[[year]]]
+ template = year.html.tmpl
+
+ [[[RSS]]]
+ template = RSS/weewx_rss.xml.tmpl
+
+ [[[Mobile]]]
+ template = mobile.html.tmpl
+
+ [[[MobileSmartphone]]]
+ template = smartphone/index.html.tmpl
+
+ [[[MobileTempOutside]]]
+ template = smartphone/temp_outside.html.tmpl
+
+ [[[MobileRain]]]
+ template = smartphone/rain.html.tmpl
+
+ [[[MobileBarometer]]]
+ template = smartphone/barometer.html.tmpl
+
+ [[[MobileWind]]]
+ template = smartphone/wind.html.tmpl
+
+ [[[MobileRadar]]]
+ template = smartphone/radar.html.tmpl
+
+###############################################################################
+
+[CopyGenerator]
+
+ # This section is used by the generator CopyGenerator
+
+ # List of files to be copied only the first time the generator runs
+ copy_once = backgrounds/*, weewx.css, mobile.css, favicon.ico, smartphone/icons/*, smartphone/custom.js
+
+ # List of files to be copied each time the generator runs
+ # copy_always =
+
+
+###############################################################################
+
+[ImageGenerator]
+
+ # This section lists all the images to be generated, what SQL types are to
+ # be included in them, along with many plotting options, such as color or
+ # font. There's a default for almost everything, if not specified below.
+ # Nevertheless, I have explicitly put in values, to make it easy to see
+ # and understand the options.
+ #
+ # Fonts can be anything accepted by the Python Imaging Library (PIL), which
+ # is currently truetype (.ttf), or PIL's own font format (.pil). See
+ # http://www.pythonware.com/library/pil/handbook/imagefont.htm for more
+ # details. Note that "font size" is only used with truetype (.ttf)
+ # fonts. For others, font size is determined by the bit-mapped size,
+ # usually encoded in the file name (e.g., courB010.pil). If a font cannot
+ # be found, then a default font will be used.
+ #
+ # Colors can be specified any of three ways:
+ # 1. Notation 0xBBGGRR;
+ # 2. Notation #RRGGBB; or
+ # 3. Using an English name, such as 'yellow', or 'blue'.
+ # So, 0xff0000, #0000ff, or 'blue' would all specify a pure blue color.
+
+ image_width = 300
+ image_height = 180
+ image_background_color = 0xf5f5f5
+
+ chart_background_color = 0xd8d8d8
+ chart_gridline_color = 0xa0a0a0
+
+ # Setting to 2 or more might give a sharper image with fewer jagged edges.
+ anti_alias = 1
+
+ top_label_font_path = /usr/share/fonts/truetype/freefont/FreeMonoBold.ttf
+ top_label_font_size = 10
+
+ unit_label_font_path = /usr/share/fonts/truetype/freefont/FreeMonoBold.ttf
+ unit_label_font_size = 10
+ unit_label_font_color = 0x000000
+
+ bottom_label_font_path = /usr/share/fonts/truetype/freefont/FreeMonoBold.ttf
+ bottom_label_font_size = 12
+ bottom_label_font_color = 0x000000
+ bottom_label_offset = 3
+
+ axis_label_font_path = /usr/share/fonts/truetype/freefont/FreeMonoBold.ttf
+ axis_label_font_size = 10
+ axis_label_font_color = 0x000000
+
+ # Options for the compass rose, used for progressive vector plots
+ rose_label = N
+ rose_label_font_path = /usr/share/fonts/truetype/freefont/FreeMonoBold.ttf
+ rose_label_font_size = 10
+ rose_label_font_color = 0x000000
+
+ # Default colors for the plot lines. These can be overridden for
+ # individual lines using option 'color'
+ chart_line_colors = 0xb48242, 0x4242b4, 0x42b442
+
+ # Type of line. Only 'solid' or 'none' is offered now
+ line_type = 'solid'
+
+ # Size of marker in pixels
+ marker_size = 8
+ # Type of marker. Pick one of 'cross', 'x', 'circle', 'box', or 'none'
+ marker_type ='none'
+
+ # Default fill colors for bar charts. These can be overridden for
+ # individual bar plots using option 'fill_color'
+ chart_fill_colors = 0xc4b272, 0x7272c4, 0x72c472
+
+ # The following option merits an explanation. The y-axis scale used for
+ # plotting can be controlled using option 'yscale'. It is a 3-way tuple,
+ # with values (ylow, yhigh, min_interval). If set to "None", a parameter is
+ # set automatically, otherwise the value is used. However, in the case of
+ # min_interval, what is set is the *minimum* y-axis tick interval.
+ yscale = None, None, None
+
+ # For progressive vector plots, you can choose to rotate the vectors.
+ # Positive is clockwise.
+ # For my area, westerlies overwhelmingly predominate, so by rotating
+ # positive 90 degrees, the average vector will point straight up.
+ vector_rotate = 90
+
+ # This defines what fraction of the difference between maximum and minimum
+ # horizontal chart bounds is considered a gap in the samples and should not
+ # be plotted.
+ line_gap_fraction = 0.01
+
+ # This controls whether day/night bands will be shown. They only look good
+ # on the day and week plots.
+ show_daynight = true
+ # These control the appearance of the bands if they are shown.
+ # Here's a monochrome scheme:
+ daynight_day_color = 0xdfdfdf
+ daynight_night_color = 0xbbbbbb
+ daynight_edge_color = 0xd0d0d0
+ # Here's an alternative, using a blue/yellow tint:
+ #daynight_day_color = 0xf8ffff
+ #daynight_night_color = 0xfff8f8
+ #daynight_edge_color = 0xf8f8ff
+
+ ## What follows is a list of subsections, each specifying a time span, such
+ ## as a day, week, month, or year. There's nothing special about them or
+ ## their names: it's just a convenient way to group plots with a time span
+ ## in common. You could add a time span [[biweek_images]] and add the
+ ## appropriate time length, aggregation strategy, etc., without changing
+ ## any code.
+ ##
+ ## Within each time span, each sub-subsection is the name of a plot to be
+ ## generated for that time span. The generated plot will be stored using
+ ## that name, in whatever directory was specified by option 'HTML_ROOT'
+ ## in weewx.conf.
+ ##
+ ## With one final nesting (four brackets!) is the sql type of each line to
+ ## be included within that plot.
+ ##
+ ## Unless overridden, leaf nodes inherit options from their parent
+
+ # Default plot and aggregation. Can get overridden at any level.
+ plot_type = line
+ aggregate_type = none
+ width = 1
+ time_length = 86400 # == 24 hours
+
+ [[day_images]]
+ x_label_format = %H:%M
+ bottom_label_format = %x %X
+ time_length = 97200 # == 27 hours
+
+ [[[daybarometer]]]
+ [[[[barometer]]]]
+
+ [[[daytempdew]]]
+ [[[[outTemp]]]]
+ [[[[dewpoint]]]]
+
+ [[[daytempchill]]]
+ [[[[windchill]]]]
+ [[[[heatindex]]]]
+
+ [[[dayhumidity]]]
+ [[[[outHumidity]]]]
+
+ [[[dayrain]]]
+ # Make sure the y-axis increment is at least 0.02 for the rain plot
+ yscale = None, None, 0.02
+ plot_type = bar
+ [[[[rain]]]]
+ aggregate_type = sum
+ aggregate_interval = 3600
+ label = Rain (hourly total)
+
+ [[[dayrx]]]
+ [[[[rxCheckPercent]]]]
+
+ [[[daywind]]]
+ [[[[windSpeed]]]]
+ [[[[windGust]]]]
+
+ [[[dayinside]]]
+ [[[[inTemp]]]]
+
+ [[[daywinddir]]]
+ # Hardwire in the y-axis scale for wind direction
+ yscale = 0.0, 360.0, 45.0
+ [[[[windDir]]]]
+
+ [[[daywindvec]]]
+ [[[[windvec]]]]
+ plot_type = vector
+
+ [[[dayradiation]]]
+ [[[[radiation]]]]
+ [[[[radiation_max]]]]
+ data_type = radiation
+ aggregate_type = max
+ aggregate_interval = 3600
+ label = max
+
+ [[[dayuv]]]
+ yscale = 0, 16, 1
+ [[[[UV]]]]
+ [[[[UV_max]]]]
+ data_type = UV
+ aggregate_type = max
+ aggregate_interval = 3600
+ label = max
+
+ [[week_images]]
+ x_label_format = %d
+ bottom_label_format = %x %X
+ time_length = 604800 # == 7 days
+ aggregate_type = avg
+ aggregate_interval = 3600
+
+ [[[weekbarometer]]]
+ [[[[barometer]]]]
+
+ [[[weektempdew]]]
+ [[[[outTemp]]]]
+ [[[[dewpoint]]]]
+
+ [[[weektempchill]]]
+ [[[[windchill]]]]
+ [[[[heatindex]]]]
+
+ [[[weekhumidity]]]
+ [[[[outHumidity]]]]
+
+ [[[weekrain]]]
+ yscale = None, None, 0.02
+ plot_type = bar
+ [[[[rain]]]]
+ aggregate_type = sum
+ aggregate_interval = 86400
+ label = Rain (daily total)
+
+ [[[weekrx]]]
+ [[[[rxCheckPercent]]]]
+
+ [[[weekwind]]]
+ [[[[windSpeed]]]]
+ [[[[windGust]]]]
+ aggregate_type = max
+
+ [[[weekinside]]]
+ [[[[inTemp]]]]
+
+ [[[weekwinddir]]]
+ yscale = 0.0, 360.0, 45.0
+ [[[[windDir]]]]
+
+ [[[weekwindvec]]]
+ [[[[windvec]]]]
+ plot_type = vector
+
+ [[[weekradiation]]]
+ [[[[radiation]]]]
+ [[[[radiation_max]]]]
+ data_type = radiation
+ aggregate_type = max
+ label = max
+
+ [[[weekuv]]]
+ yscale = 0, 16, 1
+ [[[[UV]]]]
+ [[[[UV_max]]]]
+ data_type = UV
+ aggregate_type = max
+ label = max
+
+ [[month_images]]
+ x_label_format = %d
+ bottom_label_format = %x %X
+ time_length = 2592000 # == 30 days
+ aggregate_type = avg
+ aggregate_interval = 10800 # == 3 hours
+ show_daynight = false
+
+ [[[monthbarometer]]]
+ [[[[barometer]]]]
+
+ [[[monthtempdew]]]
+ [[[[outTemp]]]]
+ [[[[dewpoint]]]]
+
+ [[[monthtempchill]]]
+ [[[[windchill]]]]
+ [[[[heatindex]]]]
+
+ [[[monthhumidity]]]
+ [[[[outHumidity]]]]
+
+ [[[monthrain]]]
+ yscale = None, None, 0.02
+ plot_type = bar
+ [[[[rain]]]]
+ aggregate_type = sum
+ aggregate_interval = 86400
+ label = Rain (daily total)
+
+ [[[monthrx]]]
+ [[[[rxCheckPercent]]]]
+
+ [[[monthwind]]]
+ [[[[windSpeed]]]]
+ [[[[windGust]]]]
+ aggregate_type = max
+
+ [[[monthinside]]]
+ [[[[inTemp]]]]
+
+ [[[monthwinddir]]]
+ yscale = 0.0, 360.0, 45.0
+ [[[[windDir]]]]
+
+ [[[monthwindvec]]]
+ [[[[windvec]]]]
+ plot_type = vector
+
+ [[[monthradiation]]]
+ [[[[radiation]]]]
+ [[[[radiation_max]]]]
+ data_type = radiation
+ aggregate_type = max
+ label = max
+
+ [[[monthuv]]]
+ yscale = 0, 16, 1
+ [[[[UV]]]]
+ [[[[UV_max]]]]
+ data_type = UV
+ aggregate_type = max
+ label = max
+
+ [[year_images]]
+ x_label_format = %m/%d
+ bottom_label_format = %x %X
+ time_length = 31536000 # == 365 days
+ aggregate_type = avg
+ aggregate_interval = 86400
+ show_daynight = false
+
+ [[[yearbarometer]]]
+ [[[[barometer]]]]
+
+
+ [[[yeartempdew]]]
+ [[[[outTemp]]]]
+ [[[[dewpoint]]]]
+
+ [[[yearhumidity]]]
+ [[[[outHumidity]]]]
+
+ # Daily high/lows:
+ [[[yearhilow]]]
+ [[[[hi]]]]
+ data_type = outTemp
+ aggregate_type = max
+ label = High
+ [[[[low]]]]
+ data_type = outTemp
+ aggregate_type = min
+ label = Low Temperature
+
+ [[[yearwind]]]
+ [[[[windSpeed]]]]
+ [[[[windGust]]]]
+ aggregate_type = max
+
+ [[[yeartempchill]]]
+ [[[[windchill]]]]
+ [[[[heatindex]]]]
+
+ [[[yearrain]]]
+ yscale = None, None, 0.02
+ plot_type = bar
+ [[[[rain]]]]
+ aggregate_type = sum
+ # aggregate_interval = 2629800 # Magic number: the length of a nominal month
+ aggregate_interval = 604800 # == 1 week
+ label = Rain (weekly total)
+
+ [[[yearrx]]]
+ [[[[rxCheckPercent]]]]
+
+ [[[yearinside]]]
+ [[[[inTemp]]]]
+
+ [[[yearwinddir]]]
+ yscale = 0.0, 360.0, 45.0
+ [[[[windDir]]]]
+
+ [[[yearwindvec]]]
+ [[[[windvec]]]]
+ plot_type = vector
+
+ [[[yearradiation]]]
+ [[[[radiation]]]]
+ [[[[radiation_max]]]]
+ data_type = radiation
+ aggregate_type = max
+ label = max
+
+ [[[yearuv]]]
+ yscale = 0, 16, 1
+ [[[[UV]]]]
+ [[[[UV_max]]]]
+ data_type = UV
+ aggregate_type = max
+ label = max
+
+ # A progressive vector plot of daily gust vectors overlayed
+ # with the daily wind average would look something like this:
+# [[[yeargustvec]]]
+# [[[[windvec]]]]
+# plot_type = vector
+# aggregate_type = avg
+# [[[[windgustvec]]]]
+# plot_type = vector
+# aggregate_type = max
+
+
+###############################################################################
+
+#
+# The list of generators that are to be run:
+#
+[Generators]
+ generator_list = weewx.cheetahgenerator.CheetahGenerator, weewx.imagegenerator.ImageGenerator, weewx.reportengine.CopyGenerator
+
+
diff --git a/skins/Standard/smartphone/barometer.html.tmpl b/skins/Standard/smartphone/barometer.html.tmpl
new file mode 100644
index 00000000..be5f0a64
--- /dev/null
+++ b/skins/Standard/smartphone/barometer.html.tmpl
@@ -0,0 +1,35 @@
+#encoding UTF-8
+
+
+
+ Barometer in $station.location
+
+
+
+
+
+
+
+
+
Barometer
+
+
+
24h barometer
+
+
+
Today's min: $day.barometer.min at $day.barometer.mintime
+
Today's max: $day.barometer.max at $day.barometer.maxtime
+
+
+
7-day barometer
+
+
+
This week's min: $week.barometer.min at $week.barometer.mintime
+
This week's max: $week.barometer.max at $week.barometer.maxtime
+
+
+
+
weewx v $station.version
+
+
+
diff --git a/skins/Standard/smartphone/custom.js b/skins/Standard/smartphone/custom.js
new file mode 100644
index 00000000..83de7c8e
--- /dev/null
+++ b/skins/Standard/smartphone/custom.js
@@ -0,0 +1,4 @@
+$(document).bind("mobileinit", function(){
+ $.mobile.defaultPageTransition = 'slide';
+ $.mobile.page.prototype.options.addBackBtn = true;
+});
\ No newline at end of file
diff --git a/skins/Standard/smartphone/humidity.html.tmpl b/skins/Standard/smartphone/humidity.html.tmpl
new file mode 100644
index 00000000..c7c961ee
--- /dev/null
+++ b/skins/Standard/smartphone/humidity.html.tmpl
@@ -0,0 +1,27 @@
+#encoding UTF-8
+
+
+
+ Humidity in $station.location
+
+
+
+
+
+
+
+
+
Humidity
+
+
+
24h humidity
+
+
+
Last 7 days
+
+
+
+
weewx v $station.version
+
+
+
diff --git a/skins/Standard/smartphone/icons/icon_ipad_x1.png b/skins/Standard/smartphone/icons/icon_ipad_x1.png
new file mode 100644
index 00000000..aec7f0dd
Binary files /dev/null and b/skins/Standard/smartphone/icons/icon_ipad_x1.png differ
diff --git a/skins/Standard/smartphone/icons/icon_ipad_x2.png b/skins/Standard/smartphone/icons/icon_ipad_x2.png
new file mode 100644
index 00000000..3dd7f78e
Binary files /dev/null and b/skins/Standard/smartphone/icons/icon_ipad_x2.png differ
diff --git a/skins/Standard/smartphone/icons/icon_iphone_x1.png b/skins/Standard/smartphone/icons/icon_iphone_x1.png
new file mode 100644
index 00000000..985337f4
Binary files /dev/null and b/skins/Standard/smartphone/icons/icon_iphone_x1.png differ
diff --git a/skins/Standard/smartphone/icons/icon_iphone_x2.png b/skins/Standard/smartphone/icons/icon_iphone_x2.png
new file mode 100644
index 00000000..e2c54aaa
Binary files /dev/null and b/skins/Standard/smartphone/icons/icon_iphone_x2.png differ
diff --git a/skins/Standard/smartphone/index.html.tmpl b/skins/Standard/smartphone/index.html.tmpl
new file mode 100644
index 00000000..fdc404ff
--- /dev/null
+++ b/skins/Standard/smartphone/index.html.tmpl
@@ -0,0 +1,42 @@
+#encoding UTF-8
+
+
+
+ $station.location Current Weather Conditions
+
+
+
+
+
+
+
+
+
+
+
+
Min rate: $day.rainRate.min at $day.rainRate.mintime
+
Max rate: $day.rainRate.max at $day.rainRate.maxtime
+
+
+
Rain last 30 days
+
+
+
+
weewx v $station.version
+
+
+
diff --git a/skins/Standard/smartphone/temp_outside.html.tmpl b/skins/Standard/smartphone/temp_outside.html.tmpl
new file mode 100644
index 00000000..5462004e
--- /dev/null
+++ b/skins/Standard/smartphone/temp_outside.html.tmpl
@@ -0,0 +1,35 @@
+#encoding UTF-8
+
+
+
+ Outside temperature in $station.location
+
+
+
+
+
+
+
+
+
Outside temperature
+
+
+
24h temperature
+
+
+
Today's min: $day.outTemp.min at $day.outTemp.mintime
+
Today's max: $day.outTemp.max at $day.outTemp.maxtime
+
+
7-day temperature
+
+
+
This week's min: $week.outTemp.min at $week.outTemp.mintime
+
This week's max: $week.outTemp.max at $week.outTemp.maxtime
+
+
+
+
weewx v$station.version
+
+
+
+
diff --git a/skins/Standard/week.html.tmpl b/skins/Standard/week.html.tmpl
new file mode 100644
index 00000000..8384a9ea
--- /dev/null
+++ b/skins/Standard/week.html.tmpl
@@ -0,0 +1,418 @@
+#errorCatcher Echo
+##
+## Specifying an encoding of UTF-8 is usually safe, but if your text is
+## actually in Latin-1, then you should replace the string "UTF-8" with "latin-1"
+## If you do this, you should also change the 'Content-Type' metadata below.
+#encoding UTF-8
+##
+
+
+
+ ## This choice should match the #encoding directive above
+
+ $station.location Weekly weather summary
+
+
+
+
+
+
+
+
+
$station.location
+
Weekly Weather Summary
+
$current.dateTime
+
+
+
+
+
+
+ This Week
+
+
+
+
+
+
+ High Temperature
+ Low Temperature
+
+
+ $week.outTemp.max at $week.outTemp.maxtime
+ $week.outTemp.min at $week.outTemp.mintime
+
+
+
+
+ High Heat Index
+
+
+ $week.heatindex.max at $week.heatindex.maxtime
+
+
+
+
+ Low Wind Chill
+
+
+ $week.windchill.min at $week.windchill.mintime
+