kegdatajson.ps1

$Global:kegdata = "C:\Plaato\data"

function load-kegs {
    if (Test-Path -PathType Leaf -Path $($Global:kegdata + "\kegs.json")) {
        [array]$data = Get-Content -Path $($Global:kegdata + "\kegs.json") | convertfrom-json
    }
    else {
        $data = $null
    }
    return [array]$data
}   
function new-keg {
    param(
        [string]$Token = "No Sync",
        [Parameter(Mandatory = $true)]
        [string]$Name
    )

    [array]$kegs = load-kegs
    $nextkegid = (($kegs.id | Measure-Object -Maximum).Maximum) + 1

    $newkegdata = @{
        "ID"             = $($nextkegid)
        "KegName"        = $($Name)
        "ABV"            = $null
        "Active"         = "1"
        "beerleftunit"   = $null
        "BeerStyle"      = $null
        "EmptyKegWeight" = $null
        "FG"             = $null
        "fwversion"      = $null
        "KegDate"        = $null
        "massunit"       = $null
        "maxkegvolume"   = $null
        "maxtemp"        = $null
        "measureunit"    = $null
        "mintemp"        = $null
        "Mode"           = $null
        "OG"             = $null
        "Scalesensi"     = $null
        "Token"          = $($token)
        "UnitType"       = $null
        "volumeunit"     = $null
    }
    $kegs += $newkegdata
    $kegs | ConvertTo-Json | Set-Content -Path $($Global:kegdata + "\kegs.json")
}
function get-keg {
    param(
        [int]$KegID,
        [switch]$includedeactivated
    )
    if (-not $PSBoundParameters.ContainsKey("KegID")) {
        $kegidfilter = "*"
    }
    else {
        $kegidfilter = $kegID
    }
    
    if (-not $PSBoundParameters.ContainsKey("includedeactivated")) {
        $active = "1"
    }
    else {
        $active = "*"
    }
    
    $kegs = load-kegs | Where-Object { $_.id -like $($kegidfilter) -and $_.active -like $($active) }
    if (!$kegs.count) {
        if (!$global:kegdata) {
            Write-Host "`$global:kegdata is not defined. Should contain path to data folder :`$global:kegdata = 'C:\Powershell\Plaato\data'"
        }
        else {
            Write-Host "No kegs defined, use 'new-keg' to define your first"
        }
    }
    return $kegs
}
function set-keg {
    param(
        [int]$kegid,
        [string]$newname,
        [Bool]$Active,
        [string]$NewToken
    )
    $kegs = load-kegs
    $pos = $kegs.id.IndexOf($kegid)
    if (-not $newname) { $newname = $kegs[$pos].kegname }
    if ($PSBoundParameters.ContainsKey("Active")) {
        if ($Active) { $kegstate = 1 }else { $kegstate = 0 }
    }
    else {
        $kegstate = $($kegs[$pos].active)
    }
    if (-not $NewToken) { $NewToken = $kegs[$pos].token }

    $kegs[$pos].token = $newtoken
    $kegs[$pos].kegname = $newname
    $kegs[$pos].active = $kegstate

    $kegs | convertto-json | Set-Content $($global:kegdata + "\kegs.json")
}
function update-keg {
    param(
        [int]$kegid
    )
    if (-not $kegid) { $kegfilter = "*" }else { $kegfilter = $kegid }
    $kegs = load-kegs

    foreach ($keg in $kegs) {
        if ($keg.active -and $keg.id -like $kegfilter -and $keg.token.length -gt 10) {
            Write-Host "Updating KegID:$($keg.id)"
            $token = $keg.token 
            $url = "http://plaato.blynk.cc/"
            $method = "/get/"
            $setupcommands = @{
                "v62" = 'empty keg weight Return the empty keg weight String "4.500"'
                "v64" = 'beer Style Name of the beer given in the app String "Stout"'
                "v65" = 'original Gravity OG set in the app String "1062"'
                "v66" = 'final Gravity FG set in the app String "1010"'
                "v67" = 'keg Date Keg date set in the app String "10/09/19"'
                "v68" = 'abv Calulated ABV% based on OG and FG,String "5.644"'
                "v71" = 'unit type Returns a number for the chosen unit type String "1" Metric, "2" US'
                "v73" = 'mass unit Mass unit based on the chosen unit type String "lbs"'
                "v74" = 'beer left unit Returns the unit based on the chosen unit type and measurement unit String "kg"'
                "v75" = 'measure unit Returns a number for the chosen measurement type String "1" Weight, "2" Volume'
                "v76" = 'max keg volume Max keg volume String "20.000"'
                "v82" = 'volume unit Volume unit based on the chosen unit type String "litre"'
                "v86" = 'min temperature Minimum temperature set in the app String "-10"'
                "v87" = 'max temperature Maximum tempature set in the app String "35"'
                "v88" = 'beer/co2 Mode Returns a number based on the mode the app is in String "1" Beer, "2" Co2'
                "v89" = 'scale sensitivity Returns a number based on the scale sensitivity String "1" Low, "2" Medium, "3" High'
                "v93" = 'firmware version Firmware version of the device String "2.0.8"'
            }
            $session = $null
 
            $kegdata = @{ }
            foreach ($setupcommand in $setupcommands.Keys) {
                $pin = $setupcommand
                $uri = $url + $token + $method + $pin
                if (-not $session) {
                    $lastpour = Invoke-RestMethod -Uri $uri -Method Get -SessionVariable session
                }
                else {
                    $lastpour = Invoke-RestMethod -Uri $uri -Method Get -WebSession $session
                }
                $kegdata.Add($pin, $lastpour)
            }
            $keg.EmptyKegWeight = $($kegdata.V62)
            $keg.BeerStyle = $($kegdata.V64)
            $keg.OG = $($kegdata.V65)
            $keg.FG = $($kegdata.V66)
            $keg.KegDate = $($kegdata.V67)
            $keg.ABV = $($kegdata.V68)
            $keg.UnitType = $($kegdata.V71)
            $keg.massunit = $($kegdata.V73)
            $keg.beerleftunit = $($kegdata.V74)
            $keg.measureunit = $($kegdata.V75)
            $keg.maxkegvolume = $($kegdata.V76)
            $keg.volumeunit = $($kegdata.V82)
            $keg.mintemp = $($kegdata.V86)
            $keg.maxtemp = $($kegdata.V87)
            $keg.Mode = $($kegdata.V88)
            $keg.Scalesensi = $($kegdata.V89)
            $keg.fwversion = $($kegdata.V93)
        }
    }
    $kegs | convertto-json | Set-Content $($global:kegdata + "\kegs.json")
}
function load-keglog {
    param (
        [string]$Filename
    )
    if (Test-Path -PathType Leaf -Path $($Filename)) {
        [array]$log = get-content -Path $Filename -encoding unicode | convertfrom-json
    }
    else {
        $log = $null
    }
    return [array]$log    
}
function update-keglog {
    param(
        [int]$KegID
    )
    if (-not $kegid) { $kegfilter = "*" }else { $kegfilter = $kegid }
    $kegs = load-kegs
    $filenamepart1 = "\KegID-"# "\$(get-date -format MM)$(Get-Date -format yyyy)"
    foreach ($keg in $kegs) {
        if ($keg.active -and $keg.id -like $kegfilter -and $keg.token.length -gt 10) {
            Write-Host "Updating KegID:$($keg.id)"
            $logfile = $global:kegdata + $filenamepart1 + "$($keg.id).json"
            [array]$keglog = load-keglog -Filename $logfile
            $token = $keg.token 
            $url = "http://plaato.blynk.cc/"
            $method = "/get/"
            $synccommands = @{
                "v47" = 'last pour unit.Last pour volume with unit type,String "0.51L"'
                "v48" = 'percent beer left Percent of beer left Number 22.55'
                "v49" = 'pouring Tells you if there is pouring String "0" or "255"'
                "v51" = 'beer left Amount of beer left based on the unit chosen String "12.40"'
                "v56" = 'raw temperature Temperature of the device without unit,String "30.125"'
                "v59" = 'last pour Last pour volume String "0.784"'
                "v69" = 'temperature with unit Temperature with unit String "30.37°C"'
                "v92" = 'device core temperature Core temperature of the device String "59.44°C"'
                "v83" = 'leak detected Returns 0 if leak not detected, 1 if leak detected String "1"'
                "v81" = 'wifi strength WiFi Strength String "94"'
            }
            $session = $null
 
            $keglogdata = @{ }
            foreach ($synccommand in $synccommands.Keys) {
                $pin = $synccommand
                $uri = $url + $token + $method + $pin
                Write-Host $uri
                if (-not $session) {
                    $lastpour = Invoke-RestMethod -Uri $uri -Method Get -SessionVariable session
                }
                else {
                    $lastpour = Invoke-RestMethod -Uri $uri -Method Get -WebSession $session
                }
                $keglogdata.Add($pin, $lastpour)
            }
            $newlogentry = @{
                "KegID"    = $($Keg.id)
                "DateTime" = $(get-date)
                "v47"      = $keglogdata.V47
                "v48"      = $keglogdata.V48
                "v49"      = $keglogdata.V49
                "v51"      = $keglogdata.V51
                "v56"      = $keglogdata.V56
                "v59"      = $keglogdata.V59
                "v69"      = $keglogdata.V69
                "v92"      = $keglogdata.V92
                "v83"      = $keglogdata.V83
                "v81"      = $keglogdata.V81           
            }   
            $keglog += $newlogentry
            $keglog | convertto-json | Set-Content $($logfile) -encoding unicode
        }
    }
}
function get-keglog {
    param(
        [int]$KegID 
    )
    $filenamepart1 = "\KegID-"           
    if ($kegid) {
        $logfile = $global:kegdata + $filenamepart1 + "$($kegid).json"
        [array]$keglog = load-keglog -Filename $logfile
    }
    else {
        #Get logfiles for all kegs.
        $allfiles = Get-ChildItem -Path $($global:kegdata + "\KegID-*.json")
        foreach ($file in $allfiles) {
            [array]$keglog += (load-keglog -Filename $file.fullname)

        } 
    }
    $keglog = $keglog | Select-Object -Property `
    @{name = "KegID"        ; Expression = { $_.KegID } } `
        , @{name = "Date"         ; Expression = { [datetime]$_.DateTime.value } } `
        , @{name = "LastPourUnit" ; Expression = { $_.v47 } } `
        , @{name = "% beer left"  ; Expression = { $_.v48 } } `
        , @{name = "Pouring"      ; Expression = { $_.v49 } } `
        , @{name = "Beer left"    ; Expression = { $_.v51 } } `
        , @{name = "Temp(raw)"    ; Expression = { $_.v56 } } `
        , @{name = "Last pour vol"; Expression = { $_.v59 } } `
        , @{name = "TempWUnit"    ; Expression = { $_.v69 } } `
        , @{name = "Device Temp"  ; Expression = { $_.v92 } } `
        , @{name = "Leak"         ; Expression = { $_.v83 } } `
        , @{name = "Wifi"         ; Expression = { $_.v81 } } `

    return $keglog

}
function graph-keg {
    param(
        [int]$kegid = 1,
        [ValidateRange(1, 12)]
        [int]$month = (get-date).month,
        [ValidateRange(2020, 2050)]
        [int]$year = (get-date).year
    )

    $k = get-keglog -KegID $kegid | Where-Object { $_.date.month -eq $month -and $_.date.year -eq $year }
    $dim = [datetime]::daysinmonth($year, $month)
    $gd = (1..($dim))

    for ($d = 0; $d -lt $dim; $d++) {
        $at = $k | Where-Object { $_.date.day -eq ($d + 1) }  
        $gd[$d] = [Math]::Round(($at.'% beer left' | Measure-Object -Minimum).Minimum)
    }
    # Plot it.

    $lines = @("", "", "", "", "", "", "", "", "", "", "")
    $footer = "01"
    $lowerframe = " "
    $lowerframe = $lowerframe + "--"*31
    for ($y = 0; $y -le 10; $y++) {
        $label = "$($y*10)%"
        $label = $label.padleft(5)
        $label = $label.padright(6)
        $lines[$y] += $label
        $footer = "1 "
        for ($day = 0; $day -lt $dim - 1; $day++) {
           
            if ($gd[$day] -ge ($y*10) -and $gd[$day] -gt 0) {
                $lines[$y] += '[]'
            }
            else {
                $lines[$y] += ' '
            }
            switch ($day + 2) {
                "5" { $footer += "5 "; break; }
                "10" { $footer += "10"; break; }
                "15" { $footer += "15"; break; }
                "20" { $footer += "20"; break; }
                "25" { $footer += "25"; break; }
                "30" { $footer += "30"; break; }
                default { $footer += " "; }

            }
            
        }
    }
    $keg = get-keg -KegID $kegid
    $lastentry = get-keglog -kegid $kegid | select-object -last 1  
    Write-host "Keg : $($keg.kegname)"
    Write-host "Remaining beer : $($lastentry.'% beer left')%"
    Write-host "% remaing beer pr day($dim days), $((Get-Culture).DateTimeFormat.GetMonthName(2)) , $year"
    for ([int]$l = 10; $l -ge 0; $l--) {
        Write-Host $lines[$l]
    }
    Write-Host $lowerframe
    $footer = " " + $footer
    Write-Host $footer
}