[vz-users] immer noch Spikes bei auswertung Zählerstände Solar

Tobias Baumann 017623705678 at o2online.de
So Jul 30 10:37:44 CEST 2023


Hallo Daniel , Hallo Rupert


Da ich beim letzten mal im Mai bereits über 40 value per hand gelöscht 
habe war mir es diesmal zu umständlich ich habe mal einen Script bauen 
lassen von chatgpt + einige änderungen von mir

ich weiss nicht ob und wo das ins wiki passt ,


  ihr könnt ihn ja mal austesten so lange noch der delete schutz an ist 
dürfte ja nicht passieren



Am 29.07.2023 um 20:34 schrieb Rupert Schöttler:
>
> Hallo,
>
> Am 29.07.23 um 19:45 schrieb Tobias Baumann:
>> ja das war das Thema "Spikes statt Fläche" da hattes du damals auch 
>> deine antwort 29.05 da raus , sicherlich hatte ich einige kleine 
>> probleme mit meinen geschriebenen Scripten aber diese sind jetzt 
>> behoben.
>>
>>
>> Am 29.07.2023 um 16:29 schrieb Rupert Schöttler:
>>>> entweder dublicates  dürfen nie geschrieben  werden oder ich müsste
>>>> den Zeitraum  weiter verlänger (6h oder 12h)
>>>
>>> Das wird nicht helfen, nur die Wahrscheinlichkeit eines Spikes ändern.
>
>
> So, jetzt komme ich vielleicht doch ins Schleudern: Wie konfiguriert 
> man vzlogger, dass Duplikate NIE weitergegeben werden? Ich war der 
> Meinung, das geht ganz einfach, oder ist das Default-Verhalten. Aber 
> da war ich wohl von OpenHAB beeinflusst, denn lt. 
> https://wiki.volkszaehler.org/software/controller/vzlogger/vzlogger_conf_parameter
>
> *duplicates*
> Zeit in Sekunden in denen wiederholende, identische Werte (z.B. 
> unveränderte Zählerstände) nicht an die api weitergeleitet werden sollen.
> Typ                 Integer
> Wert             0-?
> Empfehlung     0, insbesondere bei s0-Impulsen!
>
> Möglichkeiten:
>
> a) ganz weglassen (auskommentieren) -> was ist das Default-Verhalten?
>
> b) 0 ist sicher falsch, denn das lässt JEDEN Wert durch und führt bei 
> Dir zu den regelmäßigen Spikes, die Du ganz zu Beginn beobachtet hattest.
>
> c) Geht -1 als "unendlich"?
>
> d) was ist der größte Integer? Ein Tag hat 24*60*60 = 86400 Sekunden. 
> Das könnte reichen und auch erlaubt sein (also Integer mit mehr als 16 
> Bit), denn an anderer Stelle im Wiki ist bei Integer mal 100.000 als 
> Beispielzahl genannt.
>
> (Sorry: Dein Lösungsansatz, duplicates möglichst groß zu setzen, ist 
> vielleicht doch der richtige Weg oder der einzige Workaround...)
>
> Einen Spike kann's nach meiner Einschätzung dann nur noch geben, wenn 
> vzlogger neu gestartet wird und das Programm dadurch keine Historie 
> mehr im Gedächtnis hat: Der erste Zählerstand geht auf jeden Fall 
> durch, und wenn er zufälligerweise in der folgenden 1 Minute um 0,1 
> kWh springt, bekommst Du eine Leistung von 6 kW angezeigt -- ob's 
> passt oder nicht. Dann hilft nur, den Wert vor dem Spike manuell zu 
> löschen. Fluch der kleinen Auflösung ...
>
> Gruß von Lech und Wertach
>
> Rupert
>

-- 
Diese E-Mail wurde von AVG-Antivirussoftware auf Viren geprüft.
www.avg.com
-------------- nächster Teil --------------
Ein Dateianhang mit HTML-Daten wurde abgetrennt...
URL: <http://demo.volkszaehler.org/pipermail/volkszaehler-users/attachments/20230730/84ef9623/attachment-0001.htm>
-------------- nächster Teil --------------
function Get-JsonData {
    param ($url)
    try {
        $response = Invoke-RestMethod -Uri $url -Method Get
        return $response
    } catch {
        Write-Host "Failed to fetch JSON data: $_"
    }
}

function Delete-Data {
    param ($url)
    try {
        $response = Invoke-RestMethod -Uri $url -Method Get
        return $true
    } catch {
        return $false
    }
}

function IsValidIPorDomain {
    param ($value)
    $ipRegex = "\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b"
    $domainRegex = "^(?:(?!-)[A-Za-z0-9-]{1,63}(?<!-)\.)+[A-Za-z]{2,6}$"
    if ($value -match $ipRegex -or $value -match $domainRegex) {
        return $true
    } else {
        return $false
    }
}

function IsValidUUID {
    param ($value)
    $uuidRegex = '^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$'
    if ($value -match $uuidRegex) {
        return $true
    } else {
        return $false
    }
}

function ConvertToUnixTimestamp {
    param ($dateTime)
    try {
        $dateTimeObject = [DateTime]::ParseExact($dateTime, "dd.MM.yyyy HH:mm", $null)
        $unixTimestamp = $dateTimeObject.ToUniversalTime().Subtract((Get-Date "1970-01-01")).TotalMilliseconds
        return [math]::Round($unixTimestamp)
    } catch {
        Write-Host "Invalid date format. Please use dd.MM.yyyy HH:mm format."
        return $null
    }
}

function ConvertToDecimal {
    param ($value)
    $decimalValue = [decimal]::Parse($value.Replace(',', '.'), [System.Globalization.NumberStyles]::Float)
    return $decimalValue.ToString("0.00")
}

function Main {
    $V1 = ""
    do {
        $V1 = Read-Host "Enter Server Address (IP or URL/domain without http:// or https://)"
        if ($V1.EndsWith('/')) {
            Write-Host "Server Address should not end with '/'. Please try again."
        }
    } while (-not (IsValidIPorDomain $V1) -or $V1.EndsWith('/'))

    $V2 = ""
    do {
        $V2 = Read-Host "Enter UUID (e.g., xxxxxxxx-xxxx-xxxx-xxxxxxxxxxxx)"
    } while (-not (IsValidUUID $V2))

    $V3 = Read-Host "Enter TimeStamp Start (UNIX timestamp in ms or date in format dd.MM.yyyy HH:mm)"
    $V4 = Read-Host "Enter TimeStamp End (UNIX timestamp in ms or date in format dd.MM.yyyy HH:mm)"
    $V5 = ""
    do {
        $V5 = Read-Host "Enter Max Value (xxx.xx format)"
        $V5 = ConvertToDecimal $V5
    } while (-not ($V5 -match '^\d+\.\d{2}$' -and $V5 -gt 0))

    # Convert date strings to UNIX timestamps
    if ($V3 -match '^\d+$') {
        # Check if it's already a UNIX timestamp (numeric)
        $V3 = [long]$V3
    } else {
        # Convert date to UNIX timestamp
        $V3 = ConvertToUnixTimestamp $V3
        if ($V3 -eq $null) {
            return
        }
    }

    if ($V4 -match '^\d+$') {
        # Check if it's already a UNIX timestamp (numeric)
        $V4 = [long]$V4
    } else {
        # Convert date to UNIX timestamp
        $V4 = ConvertToUnixTimestamp $V4
        if ($V4 -eq $null) {
            return
        }
    }

    $baseUrl = "http://$V1/data/$V2.json?from=$V3&to=$V4"
    $rowCount = 0

    while ($true) {
        $jsonData = Get-JsonData -url $baseUrl
        $maxValue = $jsonData.data.max[1]
        $timestamp = $jsonData.data.max[0]

        if ($maxValue -gt $V5) {
            Write-Host "Max value is higher than $V5 : [$timestamp, $maxValue]"
            $deleteUrl = "http://$V1/data/$V2.json?operation=delete&ts=$timestamp"
            if (Delete-Data -url $deleteUrl) {
                Write-Host "Data with timestamp $timestamp deleted."
                $rowCount++
            } else {
                Write-Host "Failed to delete data with timestamp $timestamp."
            }
        } else {
            Write-Host "Max value is not higher than $V5 : [$timestamp, $maxValue]"
            break
        }

        Start-Sleep -Seconds 1
    }
    Write-Host "Total rows deleted: $rowCount"
    Read-Host "Press Enter to continue..."
}

Main


Mehr Informationen über die Mailingliste volkszaehler-users