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 } |