From 3cb92f991069e1aabaa917fa46fa32fb5e7e0ef5 Mon Sep 17 00:00:00 2001 From: Tom Keffer Date: Mon, 8 Oct 2018 09:11:00 -0700 Subject: [PATCH] Added Standard skin back in. --- skins/Standard/NOAA/NOAA-YYYY-MM.txt.tmpl | 39 + skins/Standard/NOAA/NOAA-YYYY.txt.tmpl | 96 +++ skins/Standard/RSS/weewx_rss.xml.tmpl | 136 ++++ skins/Standard/backgrounds/band.gif | Bin 0 -> 76 bytes skins/Standard/backgrounds/butterfly.jpg | Bin 0 -> 2593 bytes skins/Standard/backgrounds/drops.gif | Bin 0 -> 1508 bytes skins/Standard/backgrounds/flower.jpg | Bin 0 -> 1386 bytes skins/Standard/backgrounds/leaf.jpg | Bin 0 -> 2277 bytes skins/Standard/backgrounds/night.gif | Bin 0 -> 8609 bytes skins/Standard/favicon.ico | Bin 0 -> 1150 bytes skins/Standard/index.html.tmpl | 527 ++++++++++++++ skins/Standard/mobile.css | 49 ++ skins/Standard/mobile.html.tmpl | 92 +++ skins/Standard/month.html.tmpl | 418 +++++++++++ skins/Standard/skin.conf | 680 ++++++++++++++++++ skins/Standard/smartphone/barometer.html.tmpl | 35 + skins/Standard/smartphone/custom.js | 4 + skins/Standard/smartphone/humidity.html.tmpl | 27 + .../smartphone/icons/icon_ipad_x1.png | Bin 0 -> 4846 bytes .../smartphone/icons/icon_ipad_x2.png | Bin 0 -> 7142 bytes .../smartphone/icons/icon_iphone_x1.png | Bin 0 -> 4421 bytes .../smartphone/icons/icon_iphone_x2.png | Bin 0 -> 6095 bytes skins/Standard/smartphone/index.html.tmpl | 42 ++ skins/Standard/smartphone/rain.html.tmpl | 34 + .../smartphone/temp_outside.html.tmpl | 35 + skins/Standard/week.html.tmpl | 418 +++++++++++ skins/Standard/weewx.css | 210 ++++++ skins/Standard/year.html.tmpl | 281 ++++++++ 28 files changed, 3123 insertions(+) create mode 100644 skins/Standard/NOAA/NOAA-YYYY-MM.txt.tmpl create mode 100644 skins/Standard/NOAA/NOAA-YYYY.txt.tmpl create mode 100644 skins/Standard/RSS/weewx_rss.xml.tmpl create mode 100644 skins/Standard/backgrounds/band.gif create mode 100644 skins/Standard/backgrounds/butterfly.jpg create mode 100644 skins/Standard/backgrounds/drops.gif create mode 100644 skins/Standard/backgrounds/flower.jpg create mode 100644 skins/Standard/backgrounds/leaf.jpg create mode 100644 skins/Standard/backgrounds/night.gif create mode 100644 skins/Standard/favicon.ico create mode 100644 skins/Standard/index.html.tmpl create mode 100644 skins/Standard/mobile.css create mode 100644 skins/Standard/mobile.html.tmpl create mode 100644 skins/Standard/month.html.tmpl create mode 100644 skins/Standard/skin.conf create mode 100644 skins/Standard/smartphone/barometer.html.tmpl create mode 100644 skins/Standard/smartphone/custom.js create mode 100644 skins/Standard/smartphone/humidity.html.tmpl create mode 100644 skins/Standard/smartphone/icons/icon_ipad_x1.png create mode 100644 skins/Standard/smartphone/icons/icon_ipad_x2.png create mode 100644 skins/Standard/smartphone/icons/icon_iphone_x1.png create mode 100644 skins/Standard/smartphone/icons/icon_iphone_x2.png create mode 100644 skins/Standard/smartphone/index.html.tmpl create mode 100644 skins/Standard/smartphone/rain.html.tmpl create mode 100644 skins/Standard/smartphone/temp_outside.html.tmpl create mode 100644 skins/Standard/week.html.tmpl create mode 100644 skins/Standard/weewx.css create mode 100644 skins/Standard/year.html.tmpl 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 0000000000000000000000000000000000000000..fdfd5cdb7f3d8d9274ae8ed95ca9b69bc5df9f22 GIT binary patch literal 76 zcmZ?wbhEHblxE;$n8?8J^5ysU@4r8N`u)?V?}|TJ7(hS=M1bTOm}KYluRQ&hpMQqP b3@`m{8-Mfb9rT#?tdi^1scq|`85pbqZ)Y9h literal 0 HcmV?d00001 diff --git a/skins/Standard/backgrounds/butterfly.jpg b/skins/Standard/backgrounds/butterfly.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e33a26ff52988b42177e465014d49c89807b6fb9 GIT binary patch literal 2593 zcmbW12T;?=9>@PFq!0)ODdN#Pr@&FAbAaK1ASE$I6B3l7ARztdddjJYf`;CtD1smm z5D-K_dhib6LWH0oN-qioln(O3EB9vJ%$s@de!IWjo!#H=em}c2zrCTokH7&tYg=mo z1OfpzyaMbE16BZd-$45fgjXRjD1>KlK0YW60Y@Sba0CL$FNi|&3-BWlC?S-9AQ~-% zMxqX24xll-F?#bto2VewswS*#8afxXUOgz zp64%kd0z|;3H>=NJR&mo*XuWK#@&ifN=`{lOV7y6dhoFDQBm>ZlG3NuHMP&`>Yq2X zwRd!OF}q*=*3W)3FvuBt`)+J}VsdJFW_E6VdF9L3)wT7F&8>Yd5CHiH)}Lhm!G+;* zfuT?c6u!>|0*CP&f`RhMX~BdooZ;sJ56Wv_MTl6^3#wX?3OabMs9O+=UrbSVOlf%^ z?eAp&8`!nKMD{1xzq#H40uT`I^B@?&9N67?5U&dSH!mgMDDW%t4x&+;y9pIWdFMzz z3CmN3byv`rel=8=82!<}pcTG3Nc2=?r#x)1zGp|U{T$>zzLu*QZ+7)^+OR}tyRC3V zOTeMDvw*K;@aqto}bRjU%dt;>FcH3#3ZUlTvY5hzP)dz@V3 zBWxG-A7cYgjT8r^uc9R;Fdp zOS`o>_t`h;M^2dQ^yUf|lC-O7Kd}bu?$IbmE6t|NGuF&*6xP>Y>t`)$oVSs)NDK1? zxf)S-9Q%{Lt&{&?FO+FQEj)I!ksud} zt<98B$eb8GsROBp?BMzw@@Hz#g*zC(_#iy=D#AzM{Rux=`qHFZ#mPiE8ZNmr^l7v? zV_7WLkKyI#ryV_!F%)oeE7nzcqp!^!j^DpUjaTrF}B1aq{1x$O6qsaRDx>otZ z@cRhovOwhdO=rtrz!QthiEUM*ove>tT`1|@GML4dOk1tG?l!%U>Oz_8KOtIuemdyG z3+yCx-F%F8-GN5P5-f39iZ*_NeKdbKX!H}l!)$~Re5qm^ug@15+dUh3_Yq|e__dBy zmxpg=M>|F@pD7IEzY+ZGtW+vna9%$rF?H&x>63^NF@8 zmIuq@E?J0^#qzuv)OSZ+^%~-en7zbZ8Od0VAp_m`=*C4mho!#h$bi7I%?RfgWgDM5 zE6L&hWR}Jh4z=>cv~k$u^eYp=g+Fq0?pzQZ^3FRLiqLEKEGJ_XUAdG7oylsQNY&K-W@7mWA zTM|CVR(6kcKP;GgSKaQe)oX`*zi@%E>fha8BrZ_U(^prn7lj%|ES|kjR*`_~lCFmH zGkI@u-P?V-dU1V=|Hz_arrEvy9K=9xyznvhp-DH!ui!*nwe>TUzdHS9akOw^sou&=x7}A&APGNP^VPcjLy!6hB&*NP?B?K%=2jT7mCYY7K5GB6f!EB-2p1 z`@#K{)RPBq!YE!zCS7bt8~Z1a^}OXTq}1J~>WAw%j`e%sg;%V)SA`2PJDmbHBhq$u$AdXVJ~dqP zHd7K|Su*lNyh_^IgzVz|+h-#MzKX88L@K9>yy)*z@~74oJ${_+Y{|$MUBb7s9�W zO305~Z>4;$+4hmrKjP)?6!(L{1BNqI8H5#a+IN_KasFIZ4WFiZn*DlbkQ(=8J2GMh zMN~2DV$tqmfrzzo?z(j&8%(xTzjQET(g9&k=DsG3)y3;BI8U?tM^B;8cy1ez%<=WF zW4y7RMknW^?WXA^2GJVK4(^WX^5y4IB8QuXvz6{?T^GNYyp;GdA%^&I4-lYixVLMa q>B#@V34NrZMGB@`ddHp5>xsOln(e5=7*>Rs^sjXMSNbb^Z~q3(iG!Q~ literal 0 HcmV?d00001 diff --git a/skins/Standard/backgrounds/drops.gif b/skins/Standard/backgrounds/drops.gif new file mode 100644 index 0000000000000000000000000000000000000000..6d3814ec668391fc6648a8bb9dc097695fd23c7f GIT binary patch literal 1508 zcmc&z`%~0a6u-iPh=zi!rTAbBl7KDo=C~N9t7y37EaEPLixx%~7AM8WjBaDf8*DU5 zcY%w<;F^rk>Ii0{Hj^lil&hnS(Bz0^8aV{U6h=B&0ob!2|@4mfqg+4Z8 z1)*ew5UHM!l1s^?q*4-92_XfSf=NN8AgalQYQGNy^*QI8A3grGtYMT?4a!I|JxaH3S8$+%!lFe(^P zqA*LjpiEFID1k<-3c>|pf>1%g3e^CEXsCoN^gs-3Km!ZQL>W>w9^;&HPLw~;qGF6Q z${A61p#n|HIHjBtxQ8gra>6*FoWLIPfJ|&74)})%ID~3|K{Qli6gof*Y#V^EsghG| zP~lO=hzb(^K#Ph}MhS9-U8q2l5y}X1MA8TVx-gEQ;TBOM56Hwe;(#U?hC`?Z7(`r?CsNaBqsGJMfTJNxSOhbEP#=fN)pKvv^qf$|?751X^#rX__hhG5J#nZb zcpNGuk7#uhj}8UwfyU>6DcuOZQRw>#m;3Dj-JSSDdL!Lg_X=6ebw>kR^yyiZ^aBv8aV9ISpK8J>$}F zit7rW?fag!<*%ZolW|*Xa!oH@yRjup=+@LZE$fG$7wJA5-BowS{(?Tewf|~%Rae(u zcXRKM`SN#*X9?Y6`-FR@9r-`74tr<$j_dbJl6NoYj=#6Lbmebp1-U-WUcvKYvI9e> zjtie|(~g!{LoJ%Tl-*ODkF0w&4Qsu&=#FMi+iyy(s?3T0rKmD~tiv3d7#rgk^nUQX zge9N-d>#f`LldSQda7WiU&y+=hE+Md`Im)`vafYC#Qz{ltdUzcb`-* z2~X0e?o6NAeDA>F0LPkKFI!}zwtkP}<_8zsE6iD4u7HtSIZX!|Ly9y8Lr(eEzxv)u z$sg3`RB9}Ska*{X`L~lFPaS^X9`A2%SoV!ixiuwt!<>ktk>!*6-EQ5HzW75Hb9>>R zt6SzQADh1Lc8mYEg(tROHI95(XlOp$YaTgeK9**Es{bRSw9XvV@bJ|6&Gz{fD+bTK zqN~ZaSZANjF%C@&3tv8^J$Tu-|F$+BYV+OKcltu+=IFqt!pM;3O<@zisJ)ow$}YBb ooV@9C-8->sU{8R}Sa5Aor{2;r(V4sHmg`R2SKA-^YRH@a0r^~xb^rhX literal 0 HcmV?d00001 diff --git a/skins/Standard/backgrounds/flower.jpg b/skins/Standard/backgrounds/flower.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4b33f6d350bee7e9cfe4fe77d59e7c8c6ac61301 GIT binary patch literal 1386 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 JA4G%V5&(H&{2~AV literal 0 HcmV?d00001 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 + + + + + + +
+
+

$station.location

+

Current Weather Conditions

+

$current.dateTime

+
+ +
+ +
+
+ Current Conditions +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #if $day.UV.has_data + + + + + #end if + #if $day.ET.has_data and $day.ET.sum.raw > 0.0 + + + + + #end if + #if $day.radiation.has_data + + + + + #end if + +
Outside Temperature$current.outTemp
Wind Chill$current.windchill
Heat Index$current.heatindex
Dewpoint$current.dewpoint
Humidity$current.outHumidity
Barometer$current.barometer
Barometer Trend ($trend.time_delta.hour.format("%.0f"))$trend.barometer
Wind$current.windSpeed from $current.windDir ($current.windDir.ordinal_compass)
Rain Rate$current.rainRate
Inside Temperature$current.inTemp
UV$current.UV
ET$current.ET
Solar Radiation$current.radiation
+
+ +

 

+ +
+
+ Since Midnight +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #if $day.UV.has_data + + + + + #end if + #if $day.ET.has_data and $day.ET.sum.raw >0.0 + + + + + #end if + #if $day.radiation.has_data + + + + + #end if + +
+ High Temperature
+ Low Temperature +
+ $day.outTemp.max at $day.outTemp.maxtime
+ $day.outTemp.min at $day.outTemp.mintime +
+ High Heat Index
+ Low Wind Chill +
+ $day.heatindex.max at $day.heatindex.maxtime
+ $day.windchill.min at $day.windchill.mintime +
+ High Humidity
+ Low Humidity +
+ $day.outHumidity.max at $day.outHumidity.maxtime
+ $day.outHumidity.min at $day.outHumidity.mintime +
+ High Dewpoint
+ Low Dewpoint +
+ $day.dewpoint.max at $day.dewpoint.maxtime
+ $day.dewpoint.min at $day.dewpoint.mintime +
+ High Barometer
+ Low Barometer +
+ $day.barometer.max at $day.barometer.maxtime
+ $day.barometer.min at $day.barometer.mintime +
Today's Rain$day.rain.sum
High Rain Rate$day.rainRate.max at $day.rainRate.maxtime
+ High Wind + + $day.wind.max from $day.wind.gustdir at $day.wind.maxtime +
+ Average Wind + + $day.wind.avg +
+ RMS Wind + + $day.wind.rms +
+ Vector Average Speed
+ Vector Average Direction +
+ $day.wind.vecavg
+ $day.wind.vecdir +
+ High Inside Temperature
+ Low Inside Temperature +
+ $day.inTemp.max at $day.inTemp.maxtime
+ $day.inTemp.min at $day.inTemp.mintime +
+ High UV
+ Low UV +
+ $day.UV.max at $day.UV.maxtime
+ $day.UV.min at $day.UV.mintime +
+ High ET
+ Low ET +
+ $day.ET.max at $day.ET.maxtime
+ $day.ET.min at $day.ET.mintime +
+ High Radiation
+ Low Radiation +
+ $day.radiation.max at $day.radiation.maxtime
+ $day.radiation.min at $day.radiation.mintime +
+
+ +

 

+ + #if $Extras.has_key('radar_img') +
+ #if $Extras.has_key('radar_url') + + #end if + Radar + #if $Extras.has_key('radar_url') + +

Click image for expanded radar loop

+ #end if +
+ #end if + +
+ +
+
+
+ About this weather station: +
+ + + + + + + + + + + + + + +
Location
Latitude:$station.latitude[0]° $station.latitude[1]' $station.latitude[2]
Longitude:$station.longitude[0]° $station.longitude[1]' $station.longitude[2]
Altitude:$station.altitude
+

+ 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. +

+

RSS feed

+

Mobile formatted

+

Smartphone formatted

+

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 +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #if $almanac.next_equinox.raw < $almanac.next_solstice.raw + ## The equinox is before the solstice. Display them in order. + + + + + + + + + #else + ## The solstice is before the equinox. Display them in order. + + + + + + + + + #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)
Equinox:$almanac.next_equinox
Solstice:$almanac.next_solstice
Solstice:$almanac.next_solstice
Equinox:$almanac.next_equinox
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #if $almanac.next_full_moon.raw < $almanac.next_new_moon.raw + + + + + + + + + #else + + + + + + + + + #end if + + + + +
Moon
Rise:$almanac.moon.rise
Transit:$almanac.moon.transit
Set:$almanac.moon.set
Azimuth:$("%.1f°" % $almanac.moon.az)
Altitude:$("%.1f°" % $almanac.moon.alt)
Right ascension:$("%.1f°" % $almanac.moon.ra)
Declination:$("%.1f°" % $almanac.moon.dec)
Full moon:$almanac.next_full_moon
New moon:$almanac.next_new_moon
New moon:$almanac.next_new_moon
Full moon:$almanac.next_full_moon
Phase:$almanac.moon_phase
($almanac.moon_fullness% full)
+
+ #else + ## No extended almanac information available. Fall back to a simple table. + + + + + + + + + + + + + +
Sunrise:$almanac.sunrise
Sunset:$almanac.sunset
Moon Phase:$almanac.moon_phase
($almanac.moon_fullness% full)
+ #end if +
+
+ +
+ temperatures + heatchill + outside humidity + rain + wind + barometer + Hi Wind + Inside + Wind Vector + #if $day.radiation.has_data + Radiation + #end if + #if $day.UV.has_data + UV Index + #end if + #if $day.rxCheckPercent.has_data + day rx percent + #end if +
+
+ + +
+ + ## Include the Google Analytics code if the user has supplied an ID: + #if $Extras.has_key('googleAnalyticsId') + + + #end if + + + + diff --git a/skins/Standard/mobile.css b/skins/Standard/mobile.css new file mode 100644 index 00000000..3d06f0a7 --- /dev/null +++ b/skins/Standard/mobile.css @@ -0,0 +1,49 @@ +/* + * weewx mobile CSS settings + */ + +/* Global */ + +body { + background-color: #75a1d0; + font-family: helvetica, arial; + text-align: center; + width: 305px; +} + +a { + text-decoration: none; + color: black; +} + +table.readings { + font-size: 13px; + width: 100%; + border: 2px solid black; + border-collapse: collapse; +} + +tr.alt { + background-color: #9bc4e2; +} + +td { + text-align: right; + font-weight: 600; + border: 1px solid black; + width: 50%; + padding: 2px; +} + +td.data { + text-align: left; + color: #990000; +} + +div.radar { +} + +img { + width: 301px; + border: 2px solid black; +} diff --git a/skins/Standard/mobile.html.tmpl b/skins/Standard/mobile.html.tmpl new file mode 100644 index 00000000..93950b0f --- /dev/null +++ b/skins/Standard/mobile.html.tmpl @@ -0,0 +1,92 @@ +#encoding UTF-8 + + + + + + + + $station.location Weather + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Temp / Dewpoint: $current.outTemp / $current.dewpoint
High Temp: $day.outTemp.max at $day.outTemp.maxtime
Low Temp: $day.outTemp.min at $day.outTemp.mintime
Heat Index / Wind Chill: $current.heatindex / $current.windchill
Humidity: $current.outHumidity
Rainfall: $day.rain.sum
High Rain Rate: $day.rainRate.max at $day.rainRate.maxtime
Wind Speed: $current.windSpeed
High Wind Speed: $day.wind.max at $day.wind.maxtime
+
+ + +#if $Extras.has_key('radar_img') +
+ #if $Extras.has_key('radar_url') + + #end if + Radar + #if $Extras.has_key('radar_url') + + #end if + +

$current.dateTime

+
+#end if + +
+ + + 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 +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #if $month.UV.has_data + + + + + #end if + #if $month.ET.has_data and $month.ET.sum.raw > 0.0 + + + + + #end if + #if $month.radiation.has_data + + + + + #end if + +
+ 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 +
+ High Humidity
+ Low Humidity +
+ $month.outHumidity.max $month.outHumidity.maxtime
+ $month.outHumidity.min $month.outHumidity.mintime +
+ High Dewpoint
+ Low Dewpoint +
+ $month.dewpoint.max $month.dewpoint.maxtime
+ $month.dewpoint.min $month.dewpoint.mintime +
+ High Barometer
+ Low Barometer +
+ $month.barometer.max at $month.barometer.maxtime
+ $month.barometer.min at $month.barometer.mintime +
+ Rain Total + + $month.rain.sum +
+ High Rain Rate + + $month.rainRate.max at $month.rainRate.maxtime +
+ High Wind Speed + + $month.wind.max from $month.wind.gustdir at $month.wind.maxtime +
+ Average Wind + + $month.wind.avg +
+ RMS Wind + + $month.wind.rms +
+ Vector Average Speed
+ Vector Average Direction +
+ $month.wind.vecavg
+ $month.wind.vecdir +
+ High Inside Temperature
+ Low Inside Temperature +
+ $month.inTemp.max at $month.inTemp.maxtime
+ $month.inTemp.min at $month.inTemp.mintime +
+ High UV
+ Low UV +
+ $month.UV.max at $month.UV.maxtime
+ $month.UV.min at $month.UV.mintime +
+ High ET
+ Low ET +
+ $month.ET.max at $month.ET.maxtime
+ $month.ET.min at $month.ET.mintime +
+ High Radiation
+ Low Radiation +
+ $month.radiation.max at $month.radiation.maxtime
+ $month.radiation.min at $month.radiation.mintime +
+
+ +

 

+ +
+
+ Calendar Year +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #if $year.UV.has_data + + + + + #end if + #if $year.ET.has_data and $year.ET.sum.raw >0.0 + + + + + #end if + #if $year.radiation.has_data + + + + + #end if + +
+ High Temperature
+ Low Temperature +
+ $year.outTemp.max at $year.outTemp.maxtime
+ $year.outTemp.min at $year.outTemp.mintime +
+ High Heat Index + + $year.heatindex.max at $year.heatindex.maxtime +
+ Low Wind Chill + + $year.windchill.min at $year.windchill.mintime +
+ High Humidity
+ Low Humidity +
+ $year.outHumidity.max at $year.outHumidity.maxtime
+ $year.outHumidity.min at $year.outHumidity.mintime +
+ High Dewpoint
+ Low Dewpoint +
+ $year.dewpoint.max at $year.dewpoint.maxtime
+ $year.dewpoint.min at $year.dewpoint.mintime +
+ High Barometer
+ Low Barometer +
+ $year.barometer.max at $year.barometer.maxtime
+ $year.barometer.min at $year.barometer.mintime +
+ Rain Total + + $year.rain.sum +
+ High Rain Rate + + $year.rainRate.max at $year.rainRate.maxtime +
+ High Wind Speed + + $year.wind.max from $year.wind.gustdir at $year.wind.maxtime +
+ Average Wind + + $year.wind.avg +
+ RMS Wind + + $year.wind.rms +
+ Vector Average Speed
+ Vector Average Direction +
+ $year.wind.vecavg
+ $year.wind.vecdir +
+ High Inside Temperature
+ Low Inside Temperature +
+ $year.inTemp.max at $year.inTemp.maxtime
+ $year.inTemp.min at $year.inTemp.mintime +
+ High UV
+ Low UV +
+ $year.UV.max at $year.UV.maxtime
+ $year.UV.min at $year.UV.mintime +
+ High ET
+ Low ET +
+ $year.ET.max at $year.ET.maxtime
+ $year.ET.min at $year.ET.mintime +
+ High Radiation
+ Low Radiation +
+ $year.radiation.max at $year.radiation.maxtime
+ $year.radiation.min at $year.radiation.mintime +
+
+ +
+ +
+ +
+

Monthly Statistics and Plots

+
+
+ temperatures + heatchill + outside humidity + rain + wind + barometer + Hi Wind + Inside + Wind Vector + #if $month.radiation.has_data + Radiation + #end if + #if $month.UV.has_data + UV Index + #end if + #if $month.rxCheckPercent.has_data + month rx percent + #end if +
+
+ + +
+ + ## 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 0000000000000000000000000000000000000000..aec7f0dd7e0c26426246ab9e6a4539dd11d77634 GIT binary patch literal 4846 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..985337f48c2e98192454cda0fc81076192820404 GIT binary patch literal 4421 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 V + + + $station.location Current Weather Conditions + + + + + + + + + + + + + + diff --git a/skins/Standard/smartphone/rain.html.tmpl b/skins/Standard/smartphone/rain.html.tmpl new file mode 100644 index 00000000..f254d085 --- /dev/null +++ b/skins/Standard/smartphone/rain.html.tmpl @@ -0,0 +1,34 @@ +#encoding UTF-8 + + + + + Rain in $station.location + + + + + + +
+
+

Rain

+
+
+

24h rain

+ +
    +
  • Today's data
  • +
  • Total: $day.rain.sum
  • +
  • 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 +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #if $week.UV.has_data + + + + + #end if + #if $week.ET.has_data and $week.ET.sum.raw > 0.0 + + + + + #end if + #if $week.radiation.has_data + + + + + #end if + +
+ 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 +
+ High Humidity
+ Low Humidity +
+ $week.outHumidity.max $week.outHumidity.maxtime
+ $week.outHumidity.min $week.outHumidity.mintime +
+ High Dewpoint
+ Low Dewpoint +
+ $week.dewpoint.max $week.dewpoint.maxtime
+ $week.dewpoint.min $week.dewpoint.mintime +
+ High Barometer
+ Low Barometer +
+ $week.barometer.max at $week.barometer.maxtime
+ $week.barometer.min at $week.barometer.mintime +
+ Rain Total + + $week.rain.sum +
+ High Rain Rate + + $week.rainRate.max at $week.rainRate.maxtime +
+ High Wind Speed + + $week.wind.max from $week.wind.gustdir at $week.wind.maxtime +
+ Average Wind + + $week.wind.avg +
+ RMS Wind + + $week.wind.rms +
+ Vector Average Speed
+ Vector Average Direction +
+ $week.wind.vecavg
+ $week.wind.vecdir +
+ High Inside Temperature
+ Low Inside Temperature +
+ $week.inTemp.max at $week.inTemp.maxtime
+ $week.inTemp.min at $week.inTemp.mintime +
+ High UV
+ Low UV +
+ $week.UV.max at $week.UV.maxtime
+ $week.UV.min at $week.UV.mintime +
+ High ET
+ Low ET +
+ $week.ET.max at $week.ET.maxtime
+ $week.ET.min at $week.ET.mintime +
+ High Radiation
+ Low Radiation +
+ $week.radiation.max at $week.radiation.maxtime
+ $week.radiation.min at $week.radiation.mintime +
+
+ +

 

+ +
+
+ This Month +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #if $month.UV.has_data + + + + + #end if + #if $month.ET.has_data and $month.ET.sum.raw >0.0 + + + + + #end if + #if $month.radiation.has_data + + + + + #end if + +
+ 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 +
+ High Humidity
+ Low Humidity +
+ $month.outHumidity.max at $month.outHumidity.maxtime
+ $month.outHumidity.min at $month.outHumidity.mintime +
+ High Dewpoint
+ Low Dewpoint +
+ $month.dewpoint.max at $month.dewpoint.maxtime
+ $month.dewpoint.min at $month.dewpoint.mintime +
+ High Barometer
+ Low Barometer +
+ $month.barometer.max at $month.barometer.maxtime
+ $month.barometer.min at $month.barometer.mintime +
+ Rain Total + + $month.rain.sum +
+ High Rain Rate + + $month.rainRate.max at $month.rainRate.maxtime +
+ High Wind Speed + + $month.wind.max from $month.wind.gustdir at $month.wind.maxtime +
+ Average Wind + + $month.wind.avg +
+ RMS Wind + + $month.wind.rms +
+ Vector Average Speed
+ Vector Average Direction +
+ $month.wind.vecavg
+ $month.wind.vecdir +
+ High Inside Temperature
+ Low Inside Temperature +
+ $month.inTemp.max at $month.inTemp.maxtime
+ $month.inTemp.min at $month.inTemp.mintime +
+ High UV
+ Low UV +
+ $month.UV.max at $month.UV.maxtime
+ $month.UV.min at $month.UV.mintime +
+ High ET
+ Low ET +
+ $month.ET.max at $month.ET.maxtime
+ $month.ET.min at $month.ET.mintime +
+ High Radiation
+ Low Radiation +
+ $month.radiation.max at $month.radiation.maxtime
+ $month.radiation.min at $month.radiation.mintime +
+
+ +
+ +
+ +
+

Weekly Statistics and Plots

+
+
+ temperatures + heatchill + outside humidity + rain + wind + barometer + Hi Wind + Inside + Wind Vector + #if $week.radiation.has_data + Radiation + #end if + #if $week.UV.has_data + UV Index + #end if + #if $week.rxCheckPercent.has_data + week rx percent + #end if +
+
+ + +
+ + ## Include the Google Analytics code if the user has supplied an ID: + #if $Extras.has_key('googleAnalyticsId') + + + #end if + + + diff --git a/skins/Standard/weewx.css b/skins/Standard/weewx.css new file mode 100644 index 00000000..1908b8ea --- /dev/null +++ b/skins/Standard/weewx.css @@ -0,0 +1,210 @@ +/* CSS for the weewx Standard skin + * + * Copyright (c) 2015 Tom Keffer + * + * See the file LICENSE.txt for your rights. + */ + +/* Global */ + +body { + margin: 0; + padding: 0; + border: 0; + font-family: Verdana, Arial, Helvetica, sans-serif; + font-size: 10pt; + background-color: #f2f2f7; + background-image: url('backgrounds/band.gif'); + background-repeat: repeat; + background-attachment: scroll; +} + +#container { + margin: 0; + padding: 0; + border: 0; +} + +/* + * This is the big header at the top of the page + */ +#masthead { + margin: 1% 1% 0 1%; + padding: 5px; + text-align: center; + border-top: 1px solid #dcdcdc; + border-right: 1px solid #a9a9a9; + border-bottom: 1px solid #808080; + border-left: 1px solid #a9a9a9; + background-color: #fafaff; +} + +#masthead h1 { + color: #3d6c87; +} +#masthead h3 { + color: #5f8ea9; +} + +/* + * This holds the statistics (daily high/low, etc.) on the left: + */ +#stats_group { + width: 30%; + min-height: 500px; + margin: 1%; + padding: 5px; + float: left; + border-top: 1px solid #dcdcdc; + border-right: 1px solid #a9a9a9; + border-bottom: 1px solid #808080; + border-left: 1px solid #a9a9a9; + background-color: #fafaff; +} + +.stats table { + border: thin solid #000000; + width: 100%; +} +.stats td { + border: thin solid #000000; + padding: 2px; +} + +.stats_header { + background-color: #000000; + color: #a8b8c8; + font-size: 14pt; + font-weight: bolder; +} + +.stats_label { + color: green; +} + +.stats_data { + color: red; +} + +/* + * This holds the "About", "Almanac", and plots on the right + */ +#content { + width: 62%; + min-height: 500px; + margin: 1%; + padding: 5px; + float: right; + border-top: 1px solid #dcdcdc; + border-right: 1px solid #a9a9a9; + border-bottom: 1px solid #808080; + border-left: 1px solid #a9a9a9; + background-color: #fafaff; + text-align: center; +} + +#content .header { + font-size: 14pt; + font-weight: bolder; + color: #3d6c87; + margin-bottom: 10px; +} + + +#content .caption { + font-weight: bold; + color: #3d6c87; +} + +#content table { + text-align: center; + width: 100%; +} + +#content td { + width: 50%; +} + +#content .label { + text-align: right; + font-style: italic; +} + +#content .data { + text-align: left; +} + +#about, #almanac { + width: 90%; + margin-left: auto; + margin-right: auto; + margin-bottom: 30px; +} + +.celestial_group { +} + +.celestial_body { + width: 48%; + vertical-align: top; + display:inline-block; +} + +#plots { + width: 90%; + display: block; + margin-left: auto; + margin-right: auto; +} + +#plots img { + border: thin solid #3d6c87; + margin: 3px; + padding: 3px; +} + +#radar_img { + width: 100%; + display: block; + margin-left: auto; + margin-right: auto; + margin: 3px; + padding: 3px; +} + +#radar_img img { + margin-left: auto; + margin-right: auto; + width: 90%; + margin: 3px; + padding: 3px; +} + +#radar_img p { + width: 90%; + font-style: italic; + font-size: smaller; + text-align: center; + margin-top: 0; +} + +/* + * Navigation bar (week, month, etc.) at the bottom + */ +#navbar { + margin: 0 1% 1% 1%; + padding: 5px; + text-align: center; + clear: both; + border-top: 1px solid #dcdcdc; + border-right: 1px solid #a9a9a9; + border-bottom: 1px solid #808080; + border-left: 1px solid #a9a9a9; + background-color: #fafaff; +} + +/*************** Global Styles ***************/ + +h2, h3, h4, h5, h6 { + color: #3d6c87; +} diff --git a/skins/Standard/year.html.tmpl b/skins/Standard/year.html.tmpl new file mode 100644 index 00000000..2476b094 --- /dev/null +++ b/skins/Standard/year.html.tmpl @@ -0,0 +1,281 @@ +#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 Yearly weather summary + + + + + + +
+
+

$station.location

+

Yearly Weather Summary

+

$current.dateTime

+
+ +
+ +
+
+ Calendar Year +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #if $year.UV.has_data + + + + + #end if + #if $year.ET.has_data and $year.ET.sum.raw >0.0 + + + + + #end if + #if $year.radiation.has_data + + + + + #end if + +
+ High Temperature
+ Low Temperature +
+ $year.outTemp.max at $year.outTemp.maxtime
+ $year.outTemp.min at $year.outTemp.mintime +
+ High Heat Index + + $year.heatindex.max at $year.heatindex.maxtime +
+ Low Wind Chill + + $year.windchill.min at $year.windchill.mintime +
+ High Humidity
+ Low Humidity +
+ $year.outHumidity.max $year.outHumidity.maxtime
+ $year.outHumidity.min $year.outHumidity.mintime +
+ High Dewpoint
+ Low Dewpoint +
+ $year.dewpoint.max $year.dewpoint.maxtime
+ $year.dewpoint.min $year.dewpoint.mintime +
+ High Barometer
+ Low Barometer +
+ $year.barometer.max at $year.barometer.maxtime
+ $year.barometer.min at $year.barometer.mintime +
+ Rain Total + + $year.rain.sum +
+ High Rain Rate + + $year.rainRate.max at $year.rainRate.maxtime +
+ High Wind Speed + + $year.wind.max from $year.wind.gustdir at $year.wind.maxtime +
+ Average Wind + + $year.wind.avg +
+ RMS Wind + + $year.wind.rms +
+ Vector Average Speed
+ Vector Average Direction +
+ $year.wind.vecavg
+ $year.wind.vecdir +
+ High Inside Temperature
+ Low Inside Temperature +
+ $year.inTemp.max at $year.inTemp.maxtime
+ $year.inTemp.min at $year.inTemp.mintime +
+ High UV
+ Low UV +
+ $year.UV.max at $year.UV.maxtime
+ $year.UV.min at $year.UV.mintime +
+ High ET
+ Low ET +
+ $year.ET.max at $year.ET.maxtime
+ $year.ET.min at $year.ET.mintime +
+ High Radiation
+ Low Radiation +
+ $year.radiation.max at $year.radiation.maxtime
+ $year.radiation.min at $year.radiation.mintime +
+
+ +

 

+ +
+
+ Rain Year (1-$station.rain_year_str start) +
+ + + + + + + + + + + + +
+ Rain Year Total + + $rainyear.rain.sum +
+ High Rain Rate + + $rainyear.rainRate.max at $rainyear.rainRate.maxtime +
+
+ +
+ +
+ +
+

Yearly Statistics and Plots

+
+
+ temperatures + heatchill + outside humidity + Daily highs and lows for the year + rain + wind + barometer + Hi Wind + Inside + Wind Vector + #if $year.radiation.has_data + Radiation + #end if + #if $year.UV.has_data + UV Index + #end if + #if $year.rxCheckPercent.has_data + year rx percent + #end if +
+
+ + +
+ + ## Include the Google Analytics code if the user has supplied an ID: + #if $Extras.has_key('googleAnalyticsId') + + + #end if + + +