Tuesday, May 28, 2013

Why solar (PV) in Seattle Washington ROCKS!

I just had my 4.3kW solar array installed on my home in Seattle.  The upfront cost is a little high but I should still be able to pay off the system in less than 8 years.  This is possible thanks to Washington States amazing Solar credits.

Seattle City Light (and other Washington residence) pay amazingly low energy rates for residential our power. Even with this low rate people installing solar panels can relatively quickly get a good ROI on their panels.

  • Seattle has the lowest rate compared to the top 25 largest cities in the US.
  • The 2013 rate for SCL customers is $.0466/kWh for the first 10kWh. 
  • The national average rate is $0.129/kWh  and people in New York pay ~$0.209/kWh

How can I pay back my panels so fast?

The Washington State Solar generation incentive program.  While not the exact name it is a Performance-Based Incentive that gives the array owner a dollar amount for every kW they generate no matter if they use that power in their home or send it back to the power grid.  The current incentive is in place until June 30th  2020. 

In short this incentive give me $.54/kWh I generate on-top of my reduced power bill and any Net metering (where I sell power back to my power company).  I get the full 54 cents because my Itek Solar Panels and BlueFrog inverters are MADE IN WASHINGTON.  If you have non-Washington made components the incentive drops significantly

Many other states don't provide such an incentive nor do they give you full price on the net metering.  But Washington does!  Yet another reason why living in Seattle ROCKS. 

Other State Example:
My partner's parents have a ~7kW system at their home on Oahu Hawaii.  This system generate power for ~10 hours a day and significantly lowers their power bill.  Hawaii Power Company (HECO) current rate is ~$.32/kWh.  This is 7 times higher than the rates I pay in Seattle.  At that rate they are still expected to pay off their system in ~5 years.  This very high rate (and rebates) is the only way the $40k+ system can pay for its self in a timely fashion.




Friday, April 26, 2013

Getting 4.3kW of Solar Panels in Seattle!

I know people say it rains a lot in Seattle. Truth is that it "mists" a lot and is just gray more often than not. 

But either way the SUN is there to give everyone free energy if they want it. 

My new home finally has enough roof space for Solar Panels (PV) that will let me make the investment worth while. 

Puget Sound Solar had the best price and was able to get an install date that was before the June 30th 2013 Washington sales tax exception cut off.  Will Sumner from Puget Sound Solar came out and went up onto my roof to do his survey.  He answered all my questions and was able to point me to Puget Sound Cooperative Credit Union for my zero down low rate loan for the full project. 

My install date is currently May 14th 2013. 

I am going with the Itek 240W modules and the BlueFrog APSYC500-MIW micro inverters.  This will get me the .54 /kWh all Washington incentive and provide 4.3kW of capacity.  All parts are made in Washington!!

I expect full payback in less than 8 years!  WOOT WOOT. 

Puget Sound Solar has sent me a few forms I needed to complete and then mail a check to Seattle City Light for my production meter.  Everyone has been great and after meeting with the Project Manager Jacob Hanson today everything seems to be on track!

My Bee Hive Warning sign

I got the sign below from http://www.bbhoneyfarms.com/store/

They were cheap and have done a great job to warn people that I have a hive.

They also let people know Bees are not out to hurt anyone.  Just don't mess with their home.




Caution
No Trespassing
Honeybees

TFS 2012 how to get Last Known good build via Powershell

The following script will return the last successful build on a given build definition. 

Save the following to a .ps1 file

$project = "testproject"
[URI]$Projecturi = "http://tfsserver:8080/tfs/DefaultCollection/"
function Wait-GetLKGBuild {
 [CmdletBinding()]
 PARAM (
  [Parameter(Mandatory=$true)]
        [string]$buildDefinitionName
    )

    [void][Reflection.Assembly]::LoadWithPartialName('Microsoft.TeamFoundation.Build.Client')
    [void][Reflection.Assembly]::LoadWithPartialName('Microsoft.TeamFoundation.Client')

 $tfs = [Microsoft.TeamFoundation.Client.TeamFoundationServerFactory]::GetServer($Projecturi)
    $buildserver = $tfs.GetService([Microsoft.TeamFoundation.Build.Client.IBuildServer])
         
    $rbBuildDefinition = $buildserver.GetBuildDefinition($project, $buildDefinitionName)
 $build = $buildserver.GetBuild([Uri]($rbBuildDefinition.LastGoodBuildUri));
  New-Object PSObject -Property @{
                Buildnumber = $build.BuildNumber; 
    Requestedfor = $build.RequestedFor;
                Status = $build.Status;           
                CompilationStatus = $build.CompilationStatus;           
                Start = $build.StartTime;           
                End = $build.FinishTime;           
                DropLocation = $build.DropLocation;           
                SourceGetVersion = $build.SourceGetVersion;           
                }           
         }
}
Wait-GetLKGBuild $buildDefinitionName

My first Bee hive 2013

2013 is now the first year that I live in a house with enough room to have a bee hive.  On April 20th 2013 I picked up by bee package from the Ballard Bee Company. 

My queen and her ~10,000 followers seem to be doing well.

At day 2 I opened the hive to make sure the queen made it out of her cage by eating through the mini-marshmallow.  She made it out. 

I will open the hive again on day 7 to see if she has started laying eggs.

Here are some pictures. 



Sunday, February 5, 2012

Home Circuit Power Monitoring - Part 2

It has been about 6 months from when I installed per circuit power monitoring in my home (http://www.mikepoulson.com/2011/07/new-home-power-monitor.html).

In January 2012 I started injecting all my power data into a SQL DB (SQL Express).  This has allowed me to use Tableau (www.tableausoftware.com) to analyze the utilization.

Here is an example of that power consumption in my House. 


You can see my office plugs (where my Media Center is located) is my #1 consumer of power.  You can see that the TV and Kitchen outlets are in second place.

I used the data shown here to determine that my 1st floor lights use a lot of power.   This weekend I replaced those 400 Watts of lights with new LEDs (Phillips Ambient LED, http://www.amazon.com/Philips-409904-Dimmable-AmbientLED-12-5-Watt/dp/B004IUMGV4).

You can see from the graph below how much power I used to watch the "BIG GAME".

Based off this and a power cost of $.09/Kwh it cost ~$.24 to watch the game.
(539 watts /1000 = .539Kw * 5 hours = 2.70KwH * .09 = $.245)

This does not include the cost of beer, snacks, the cookies, steaks or stress. 

To get this to work I use tenEcmServer and tenEcmDB from http://tenholder.net/tenWare2/tenEcmServer/default.aspx.  The tenEcmDB needed a little modification to work with SQL Server.  By default it works with SQLLight.  With the tenEcm components I can monitor my BrulTech equipment and provided extensive reporting on it.

Wednesday, October 5, 2011

Not a big fan of new Microsoft Touch mouse

I upgraded from the Microsoft Touch Arch mouse to the new TouchMouse.  I must say I am not a fan.

The new mouse looks nice and all but does not work as well as I would like.


The new TouchMouse has a single button.  It utilizes touch sensors to detect if you are using the left or right finger to press down.  The problem that I have it is I rest my fingers on my mouse.  This causes the mouse to think I am using the multi-touch (two finger) to minimize or maximize windows. It also sometimes thinks I am pressing the right button when I press the left.

Tuesday, August 16, 2011

Home Automation with Insteon - New Ceiling fan

I got my first Insteon switches and setup in 2005. At the time it was an early product and still had issues and did not have the number of options that exist today.

I live in a 4 story townhome that faces southwest. Because of this the top floor can get super warm in the summer time. To help resolve this we desided to install a ceiling fan where there was just a light before.

There are 2x 3 way switches that control the light at the top of my stairs. There are also lights on the wall controlled by the same switches.


Here is how it looked before I started.



Insteon

I replaced the 2 standard decora switches with Insteon KeypadLinc Switches .  Then added 2 wire-in controllers.  1 dimming controller and 1 non-Dimming controller.

Once all that was done I installed the new fan and wired the fan load to the non-dimming controller and the lights to the dimming controller.

Here is what it looks like now.

Friday, August 5, 2011

WDS and Symbolic Links

Windows Deployment Services (WDS) is all my team and I use for OS deployments. We regularly use the $OEM$\$1 option to copy files and scripts to the target install. More on $OEM$

Recently we started updating scripts that are in a $OEM$, $$ or $1 folder. This was very time consuming because you had to update a large number (~50) different images.

The solution to this problem: Hard Links http://msdn.microsoft.com/en-us/library/aa365006(v=vs.85).aspx
We use the Mklink command to create a Hard link to a “source file”. WDS follows this link and copies the script\file to the target OS during install. This allows us to have a GOLD set of scripts that will get copied yet we only have to make a change in 1 location.

The important thing when making the link with mklink is to pass the /k argument. This will tell mklink to make a hard link not a Symbolic link. You can find more on Mklink at http://technet.microsoft.com/en-us/library/cc753194(WS.10).aspx


WDS will not work with a Symbolic link and will throw an error like:
Windows cannot copy files from \$OEM$ to C:\$WINDOWS.~LS\Sources. The files do not exist. Make sure all files required for installation are available, and restart the installation. Error code: 0x80070003]


This works on Windows Server 2008, Windows Server 2008 R2.

Wednesday, July 27, 2011

Windows Server 2008 Hyper-V Geographically Dispersed Cluster with IBM XIV Storage iSCSI

Here is a paper that I worked on at my team at Microsoft. The Enterprise Engineering Center (http://www.microsoft.com/eec) has a IBM XIV array that we used with the other array on campus.

Windows Server 2008 Hyper-V Geographically Dispersed Cluster with IBM XIV Storage iSCSI

You can find more info on the Tunnel used in this whitepaper at http://www.mikepoulson.com/2011/06/l2tpv3-performance-tweaks-for-hyperv.html

How to create differencing disk VM from template on SCVMM 2012 via powershell

This quick post will provide an example of how to create a Virtual Machine (VM) based off an VMM template that utilizes differencing disks. 

This is special because VMM does not support this natively.  So you have to contact the target HyperV host (via WMI) to create the Diff disk.  In addition to need to make sure that the HyperV host has the parent VHD already in place. 

The Powershell cmdlet below does the following
  1. Looks up the specified Hardware profile
  2. Looks up the specified template (this is used to get the parent VHD location/name)
  3. Looks up info on the specified target HyperV host (so we can find the placement drive)
  4. Checks to see if the ParentVHD already exists on the HyperV hosts Placement Drive
  5. If the VHD does not exist it copies it to the HyperV host
  6. Creates Diff Disk via WMI on hyperV host pointing to parent VHD
  7. Creates the VM via the New-SCVirtualMachine cmdlet using the UseLocalVirtualHardDisk command. (this tells VMM to allow Diff disks).
It can be downloaded from http://dl.dropbox.com/u/3275573/Create_Diff_VM_From_Template.ps1
    param($VMName,$TemplateName = "Windows Server 2008 R2 SP1 Enterprise", $HardwareProfileName = "ServerHardware", $VMMHost = "SCVMM",$targethostname = $null)
    
    $Err = 0
    
    If ($VMName -eq $null)
    {
      Write-Host "`nERROR: Incorrect arguments" -foregroundcolor red -backgroundcolor black
       Write-Host "`nREQUIRED ARGUMENTS:" -foregroundcolor cyan
       Write-Host "`n   -VMName `"Name of the VM to create`"" -foregroundcolor cyan
       Write-Host "`n   -TemplateName `"Name of the VMM Template`"" -foregroundcolor cyan
       Write-Host "`n   -HardwareProfileName `"Name of the VMM Hardware Profile to use with the template`"" -foregroundcolor cyan
       Write-Host "`n   -VMMHost `"VMM Computername`"" -foregroundcolor cyan
       Write-Host "`n   -targetHostname `"Computername of HyperV host to target`"" -foregroundcolor cyan
      Exit $Err
    }
    
    function CreateDiffDiskOnHost
    {
                    param([string]$hostComputerName, [string]$childPath, [string]$parentPath)
                    #get the image mgmt service instance for the host computer
                    $VHDService = get-wmiobject -class "Msvm_ImageManagementService" -namespace "root\virtualization" -computername $hostComputerName
                    
                    #create a differencing disk from the base disk
                    $Result = $VHDService.CreateDifferencingVirtualHardDisk($childPath, $parentPath)
    }
    function TestFileLock {
        ## Attempts to open a file and trap the resulting error if the file is already open/locked
        param ([string]$filePath )
        $filelocked = $false
        $fileInfo = New-Object System.IO.FileInfo $filePath
        trap {
            Set-Variable -name locked -value $true -scope 1
            continue
        }
        $fileStream = $fileInfo.Open( [System.IO.FileMode]::OpenOrCreate, [System.IO.FileAccess]::ReadWrite, [System.IO.FileShare]::None )
        if ($fileStream) {
            $fileStream.Close()
        }
        $obj = New-Object Object
        $obj | Add-Member Noteproperty FilePath -value $filePath
        $obj | Add-Member Noteproperty IsLocked -value $filelocked
        $obj
    }
    
    
    write-host "VMName is $VMName"
    write-host "Template is $TemplateName"
    write-host "Hardware Profile is $HardwareProfileName"
    write-host "VMMHost is $VMMHost"
    write-host "Target Host is $targethostname"
    
    $guid = [guid]::NewGuid()
    
    write-host "Lookup the base hardware Profile $HardwareProfileName"
    $HardwareProfile = Get-SCHardwareProfile -VMMServer $VMMHost  | where {$_.Name -eq $HardwareProfileName}
    if ($HardwareProfile -eq $null)
        {
            write-host "Failed to lookup HardwareProfile $HardwareProfileName"  -foregroundcolor red -backgroundcolor black
         EXIT 1
        }
    
    write-host "Getting information for template $TemplateName"
    $Template = Get-SCVMTemplate -VMMServer $VMMHost  -All | where {$_.Name -eq $TemplateName}
     if ($Template -eq $null)
        {
            write-host "Failed to lookup Template $TemplateName"  -foregroundcolor red -backgroundcolor black
         EXIT 1
        }
        
    #Get the VHD info for the template
    $VHD =  Get-SCVirtualharddisk | where {$_.Name -eq $template.VirtualDiskDrives[0].VirtualHardDisk}
    
    write-host "Template VHD Path " $VHD.SharePath
    
    if ($targethostname -eq $null)
    {
        write-host "Invalid targethostname"  -foregroundcolor red -backgroundcolor black
        exit 1
    }
    $vmhost = Get-SCVMHost $targethostname
    
    $vmHostPath = [string]$vmhost.vmpaths
    write-host "Target VMHost: "  $vmhost.name
    write-host "Target Drive: "  $vmhost.VMPaths
    
    $remotePath = "\\" + $vmhost.name + "\" + $vmHostPath.substring(0,1) + "$\" + [system.io.path]::GetFileName($VHD.SharePath)
    "Checking to see if Parent VHD exists on HV Host Drive"
    "RemotePath: $remotePath"
    
    if (Test-Path $remotePath)
    {
     "Parent VHD already exists on HV Host"
    }
    else
    {
     "$RemotePath does not exist, going to Copy"
     [System.IO.File]::Copy($VHD.SharePath,$remotePath); 
    }
    
    "Creating Diff Disk"
    $targetVHDPath = $vmHostPath + $VMName + ".vhd"
    $ParentVHDPath = $vmHostPath + [system.io.path]::GetFileName($VHD.SharePath)
    CreateDiffDiskOnHost "$vmhost" "$targetVHDPath" "$ParentVHDPath"
    Start-Sleep -s 20
    
    $targetVHDRemotePath = "\\" + $vmhost.name + "\" + $vmHostPath.substring(0,1) + "$\" + $VMName + ".vhd"
    if (Test-Path $targetVHDRemotePath)
    {
     "Diff Disk Created at:$targetVHDRemotePath"
    }
    else
    {
     "$targetVHDRemotePath does not exist yet.  Sleeping for a few"
     Start-Sleep -s 30
        if (Test-Path $targetVHDRemotePath)
        {
            "Disk was created."
        }
        else
        {
            write-host "Failed to find VHD $targetVHDRemotePath after sleep, exiting" -foregroundcolor red -backgroundcolor black
            exit 1
        }
    
    }
    #Set a random startup delay to reduce VM startup IOPs overload
    $startDelay = Get-Random -minimum 1 -maximum 30
    
    
    $lockstate = TestFileLock "$targetVHDRemotePath"
    if ($lockstate.IsLocked)
    {
        "File locked, sleeping"
        Start-Sleep -s 30
    }
    
    $mv = move-SCvirtualharddisk -Bus 0 -Lun 0 -IDE -path $targetVHDPath  -jobgroup $guid
    $description = $template.tag
    New-SCVirtualMachine -Name $vmName -VMHost $vmHost -VMTemplate $template -UseLocalVirtualHardDisk -HardwareProfile $HardwareProfile -ComputerName $vmName -path $vmHostPath -delaystartseconds $startDelay  -Description "$description" -mergeanswerfile $true -BlockDynamicOptimization $false -StartVM -JobGroup "$guid" -RunAsynchronously -StartAction "AlwaysAutoTurnOnVM" -StopAction "SaveVM"
    

    10 Years from last post

     Well world!   After the last almost 10 years I have been up to a few things in life and work.  Most recently I was working at Microsoft on ...