Problem mit Verbrauchsmessung

Moin,
vor einigen Wochen hat eine meiner Steckdosen ein Problem. Beim Stromverbrauch liefert sie mal den richtige Wert von 137KWh und dnn beim nächsten Mal 238KWh. Hat das schon mal jemand gehabt und vielleicht einen Tipp?

Im Moment habe ich mich mit einem Script geholfen das nur die glaubwürdigen Werte in eine Hilfsvariable schreibt.

Ralf

Ja, das kommt schon öfters vor - leider! So wie ich das verstanden hab, ist die CRC-Kontrolle von Z-Wave etwas dürftig. Es wurden von Symcon Schalter eingebaut um negative Werte und 0-Werte zu verhindern. Schön wäre natürlich auch eine Möglichkeit eine maximale Änderung festzulegen - gibts aber leider noch nicht. Ich glaube im Forum gabs mal ein Script zum filtern.

Grüße
Stefan

Moin Steppe,
dumm das es öfter vorkommt. Das es ein Filterscript gibt weiß ich denn ich habe es geschrieben:-)

Das mit dem Filtern bzw. auch max. Änderung hat ein Problem. Fängt es falsch an bleibt es immer falsch. Neben max. Änderung müsste man auch gleichzeitig Verringerung der Zählerwerte verhindern.

Ralf

Ich hab dein Script im Forum nicht gefunden, aber hab mich mal kurz mit den Z-Wave Zählern befasst, weil es bei mir auch manchmal vorkommt und ich das dann immer händisch korrigiert habe.

Folgendes ist rausgekommen:
Es können Zählerwerte gelöscht werden, welche kleiner sind als der vorherige und Zählerwerte die größer sind als $maxchange. Werte mit 0 oder negative werden ja schon von Symcon abgefangen.

$maxchange = 2.0; // Maximale zuname des Wertes
$delnegchange = TRUE; // Lösche Wert der kleiner ist als die vorherige
$debug = FALSE; // Debug Ausgabe - echo
$setvalue = FALSE; // Variable wird auf alten Archivwert gesetzt - dabei wird ein neuer Archiveintrag erzeugt
$corcounter = TRUE; // Zähle wie oft korrigiert wurde

// ------------------ Ende Config ---------------------------------------------------------

$ArchiveList = IPS_GetInstanceListByModuleID("{43192F0B-135B-4CE7-A0A7-1475603F3060}"); // Archivinstanzen abrufen
$ArchiveID = $ArchiveList[0]; // !!! Es wird die erste gefundene Archivinstanz verwendet
$Start = new DateTimeImmutable('Now');
$Start = $Start->modify('-1 day');
$starttime = strtotime($Start->format('Y-m-d H:i:s'));
$endtime = strtotime('Now');
$VariableID = IPS_GetParent($_IPS['SELF']) /* ID der Variablen im Archive */;

// Datensätze gestern bis jetzt abfragen
$logData = AC_GetLoggedValues($ArchiveID, $VariableID,  $starttime,$endtime, 0); 

// Anzahl der Werte
$entries = count($logData);

if($debug){
    echo "Werte: ".$entries.PHP_EOL;
    echo "Archiv 0: ".$logData[0]['Value'].PHP_EOL;
    echo "Archiv 1: ".$logData[1]['Value'].PHP_EOL;
    echo "Aktuell: ".GetValueFloat($VariableID).PHP_EOL;
    }

if ($entries > 1){
    $diff = $logData[0]['Value']-$logData[1]['Value'];
    if($debug){echo "Differenz: ".$diff.PHP_EOL;}
    if ($diff>$maxchange){
        echo "Wertänderung zu groß - Lösche Wert";
        AC_DeleteVariableData($ArchiveID, $VariableID,$logData[0]['TimeStamp'] ,$logData[0]['TimeStamp']);
        AC_ReAggregateVariable ($ArchiveID, $VariableID);
        if($setvalue){SetValueFloat($VariableID,$logData[1]['Value']);}
        // Korrekturzähler
        if ($corcounter){
            $corrections = ReadInteger("Korrekturen");
            $corrections ++;
            WriteInteger("Korrekturen",$corrections);
        }
    }
    if ($delnegchange === TRUE and $diff < 0 ){
        echo "Wertänderung negativ - Lösche Wert";
        AC_DeleteVariableData($ArchiveID, $VariableID,$logData[0]['TimeStamp'] ,$logData[0]['TimeStamp']);
        AC_ReAggregateVariable ($ArchiveID, $VariableID);
        if($setvalue){SetValueFloat($VariableID,$logData[1]['Value']);}
        // Korrekturzähler
        if ($corcounter){
            $corrections = ReadInteger("Korrekturen");
            $corrections ++;
            WriteInteger("Korrekturen",$corrections);
        }
    }
}

function ReadInteger($Name)
    {
    $result = preg_replace("/[^a-zA-Z0-9]+/", "", $Name);
	$varID = @IPS_GetObjectIDByIdent($result, $_IPS['SELF']);
    if ($varID == FALSE){
        WriteInteger($Name,0);
        $value = 0;
    }
    else{
    $value = GetValueInteger($varID);
    }
    return $value;
    }

function WriteInteger($Name, $Value)
	{
    $result = preg_replace("/[^a-zA-Z0-9]+/", "", $Name);
	$varID = @IPS_GetObjectIDByIdent($result, $_IPS['SELF']);
 	
 	if ($varID == FALSE){
		$varID = IPS_CreateVariable(1); //Integer
 		IPS_SetName($varID, $Name); // Variable benennen
		IPS_SetParent($varID, $_IPS['SELF']); // Variable einsortieren unter dem Objekt mit der ID "12345"
		IPS_SetIdent ($varID, $result);
   	}

	SetValueInteger($varID,$Value);
}

Das Script wird bei jeder Zähleränderung aufgerufen und liegt unterhalb der Zählervariable. Jetzt warte ich nur noch auf Fehler :wink:

Grüße
Stefan