Archiv zu hohe Werte löschen

Hallo
Geht es, dass man einen aufgezeichneten Wert einer Variable im Archiv löschen kann, wenn er zb über 100 ist und danach automatisch reaggregiert?
Gruß Stefan

würde mich auch interessieren, dann würden Ausreißer in den Werten nicht mehr auftreten

schön wäre auch wenn man den Wert selbst bestimmen könnte.
Habe da gerade so einen Fall, Wetterstation über Wunderground angebunden und es kommt öfter 0 für alle Werte rein, und das ist z.b. bei der Luftfeuchtigkeit ja eher nicht möglich :smiley:
Also wäre es schon ein Script drauf an zusetzen, einmal am Tag laufen zu lassen, nach 0 suchen, löschen und neu aggregieren.
Leider übersteigt das meine Fähigkeiten, bzw lasten andere Projekte mein Zeit aus.

Solche Fehler kannst du doch problemlos vor dem Schreiben abfangen ;), dann musst du nicht hinterher aufräumen.

und wen du mir noch netter weise sagen würdest wie wär ich froh :smiley:

Die Aussage bezog sich auf BeLo, wenn die Daten in einem Script geholt und verarbeitet werden, dann kann man den Wert auch vor dem Speichern in die Variable auf Plausibilität prüfen.

Du hattest ja nicht geschrieben, woher deine Werte kommen.

achso :rolleyes:
meine Werte kommen über einen Serial Port von meiner Viessmann Heizung.

<?

  // Variablen Includieren
  include( "ViessmannDeviceTools.inc.php" );

  // Verbindung zur Heizung öffnen
  ViessmannOpen();

  // Wert Abfragen
  ViessmannSetVariableByCommand( "BetriebsartHeizung", 52053 /*[skribt\Viessmann\Abfragen\Betriebsart]*/ );
  ViessmannSetVariableByCommand( "Warmwassertemperaturoben", 58530 /*[skribt\Viessmann\Abfragen\Warmwasseropen berechnen\Wert]*/ );
  ViessmannSetVariableByCommand( "VorlauftemperaturPrimaerquelle", 25814 /*[skribt\Viessmann\Abfragen\Vorlauftemperatur Primär berechnen\VorlauftemperaturPrimaerquelle]*/ )/10;
  ViessmannSetVariableByCommand( "RuecklauftemperaturSekundaer", 55771 /*[skribt\Viessmann\Abfragen\Rücklauftemperatur Sekundär berechnen\Ruecklauftemperatur Sekundär]*/ );
  ViessmannSetVariableByCommand( "VorlauftemperaturSekundaer", 39911 /*[skribt\Viessmann\Abfragen\Vorlauftemperatur Sekundär berechnen\Vorlauftemperatur Sekundär]*/ );
  ViessmannSetVariableByCommand( "BetriebsartLueftung", 50037 /*[skribt\Viessmann\Abfragen\BetriebsartLueftung]*/ );  
  ViessmannSetVariableByCommand( "Ventil Heizen/WW", 23921 /*[skribt\Viessmann\Abfragen\Heizen/Warmwasseraufbereitung]*/ );  
  ViessmannSetVariableByCommand( "Heizkreispumpe", 18821 /*[skribt\Viessmann\Abfragen\Heizkreispumpe]*/ );
  ViessmannSetVariableByCommand( "Primärpumpe", 22217 /*[skribt\Viessmann\Abfragen\Primärpumpe]*/ );
  ViessmannSetVariableByCommand( "Verdichter", 55796 /*[skribt\Viessmann\Abfragen\Verdichter]*/ );

  
  
  // Verbindung schliessen
  ViessmannClose();

?>
<?
  // Constant definition for processing ----------------------------------------
  define( "VIESSMANN_GERAETEKENNUNG",   chr(0x00).chr(0xF8) );

  include( "ViessmannVariables.inc.php");

  // Get XML
  $ViessmannDeviceID = GetValueString( VIESSMANN_VARIABLE_DEVICE );
  $DeviceXMLName = IPS_GetKernelDir()."scripts\\ViessmannDevice".$ViessmannDeviceID.".xml";
  try
  {
    $ViessmannDeviceXML = simplexml_load_file( $DeviceXMLName );
  }
  catch (Exception $e)
  {
    $ViessmannDeviceXML = "";
  }

  function ViessmannGetCommand( $Command )
  {
    $CommandData = array();

    global $ViessmannDeviceXML;
    if ( !isset( $ViessmannDeviceXML ) OR $ViessmannDeviceXML == "" )
      return false;

    $CommandData["deviceid"] = $ViessmannDeviceXML["id"];
    $CommandData["protocol"] = $ViessmannDeviceXML["protocol"];

    // Get Command details
    $ViessmannDeviceCommands = $ViessmannDeviceXML->commands[0];

    foreach($ViessmannDeviceXML->commands[0] as $a => $XMLCommand )
    {
      if ( $XMLCommand["name"] == $Command )
      {
        $CommandData["name"]        = $Command;
        $CommandData["action"]      = $XMLCommand["action"];
        $CommandData["address"]     = $XMLCommand->address[0];
        $CommandData["length"]      = $XMLCommand->length[0];
        $CommandData["description"] = $XMLCommand->description[0];
        $CommandData["format"]      = $XMLCommand->format[0];
        break; // for
      }
    }
    if ( isset( $CommandData["name"] ) )
      return $CommandData;
    else
      return false;
  }

  function ViessmannResultToHexDisplay( $Result )
  {
    $ResultConv = "";
    for( $x=0; $x < strlen($Result); $x++)
    {
      if ( ord($Result[$x]) < 10 ) $ResultConv .= "0";
      $ResultConv .= strtoupper(dechex(ord($Result[$x])));
    }
    return $ResultConv;
  }

  function ViessmannConvertData( $Command, $Data )
  {
	  global $ViessmannDeviceID;
	  $ViessmannCommand = ViessmannGetCommand( $Command, $ViessmannDeviceID );
	  if ( $ViessmannCommand === false ) return false;
	  $Format = $ViessmannCommand["format"];
  
	  switch( $Format )
	  {
 		  case "Boolean":
		    if ( ord( $Data[0] ) == 0 )
		       return false;
			   else
				   return true;
		      break;
		  case "Temperature10":
			  $lowByte = ord( $Data[0] );
			  $highByte = ord( $Data[1] );
			  return (( $highByte * 256 ) + $lowByte ) / 10;
			  break;
		  case "Temperature100":
			  $lowByte = ord( $Data[0] );
			  $highByte = ord( $Data[1] );
			  return (( $highByte * 256 ) + $lowByte ) / 100;
			  break;
		  case "Count" or "Mode":
			  $Count = 0;
			  $HexString = ViessmannResultToHexDisplay( $Data );
			  for ( $x=0; $x < strlen( $Data ); $x=$x+2 )
			  {
				 $hex = substr( $HexString, $x,2 );
				 $dec = hexdec( $hex );
				 switch ( $x )
				 {
					case 0:
					  $Count = $Count + $dec;
					  break;
					case 2:
					  $Count = $Count + ( $dec * 256 );
					  break;
					case 4:
					  $Count = $Count + ( $dec * 65536 );
					  break;
					case 6:
					  $Count = $Count + ( $dec * 16777216 );
					  break;
					default:
					  break;
			    }
			  }
			  return $Count;
			  break;
			case "BooleanPercent":
			  return "BOOLEANPERCENT convertion not coded yet.";
			  break;
			case "Triple":
			  return "TRIPLE convertion not coded yet.";
			  break;
			case "Mode":
			  return hexdec(ord($Data[0]));
			  break;
		   case "ControlID":
		     $Result = "";
           for( $x=0; $x < strlen($Data); $x++)
           {
             if ( ord($Data[$x]) < 10 ) $Result .= "0";
             $Result .= strtoupper(dechex(ord($Data[$x])));
           }
           return $Result;
           break;
  		   default:
			  return "";
			  break;
		}
		return $ConvertedResult;
  }
  
  function ViessmannGetData( $Command )
  {
	 $Run = 1; // Maximum time a recheck is done, if Ping (0x05 is returnvalue)
	 // get Command Data
 	 $ViessmannCommand = ViessmannGetCommand( $Command );
	 if ( $ViessmannCommand === false ) return false;
	 
	 // clear previous result
	 do
	 {
	   SetValueString( VIESSMANN_VARIABLE_RESULT, "" );
	   // create command string and send to COM Port
	   $CommandString = "R:".$ViessmannCommand["protocol"].":".$ViessmannCommand["address"].":".$ViessmannCommand["length"].": ";
		$StartTime = microtime();
		$RunTime = 0;
		SetValueString( VIESSMANN_VARIABLE_COMMAND, $CommandString );
	   // wait for execution
      $status = getvalue( VIESSMANN_VARIABLE_COMMAND );
      while ($status != "" AND $RunTime < 1 )
		{
		  $status = getvalue( VIESSMANN_VARIABLE_COMMAND );
		  $RunTime = microtime() - $StartTime;
		}
      // get result
      $Result = GetValue( VIESSMANN_VARIABLE_RESULT );
      if ( $Result != chr(0x05) ) $Run = -1;
      $Run--;
	 } while ( $Run > 0 );
	 return $Result;
  }
  
  function ViessmannSetData( $Command, $Data )
  {
	 // get Command Data
 	 $ViessmannCommand = ViessmannGetCommand( $Command );
	 if ( $ViessmannCommand === false ) return false;
	 if ( $ViessmannCommand["action"] != "ReadWrite" ) return false;
	 // clear previous result
    SetValueString( VIESSMANN_VARIABLE_RESULT, "" );
    // create command string and send to COM Port
  	 $CommandString = "W:".$ViessmannCommand["protocol"].":".$ViessmannCommand["address"].":".$ViessmannCommand["length"].":".$Data;
    SetValueString( VIESSMANN_VARIABLE_COMMAND, $CommandString );
    // wait for execution
    $status = getvalue( VIESSMANN_VARIABLE_COMMAND );
    while ($status != "") $status = getvalue( VIESSMANN_VARIABLE_COMMAND );
    // get result
    $Result = GetValue( VIESSMANN_VARIABLE_RESULT );
    return $Result;
  }
  
  function ViessmannOpen()
  {
    // Open Com Port
    if ( COMPort_GetOpen( VIESSMANN_VARIABLE_COMPORT ) != true )
    {
	   COMPort_SetOpen( VIESSMANN_VARIABLE_COMPORT, true );
	   IPS_ApplyChanges( VIESSMANN_VARIABLE_COMPORT );
    }
  }
  
  function ViessmannClose()
  {
    // Close Com Port
    if ( COMPort_GetOpen( VIESSMANN_VARIABLE_COMPORT ) != false )
    {
	   COMPort_SetOpen( VIESSMANN_VARIABLE_COMPORT, false );
	   IPS_ApplyChanges( VIESSMANN_VARIABLE_COMPORT );
    }
  }
  
  function ViessmannSetVariableByCommand( $Command, $Var )
  {
    $Value = ViessmannGetData( $Command );
    if ( $Value === false )
	 {
	   SetValueBoolean( VIESSMANN_VARIABLE_CONNECTOK, false );
	 }
    else
    {
      SetValueBoolean( VIESSMANN_VARIABLE_CONNECTOK, true );
	   SetValue( $Var, ViessmannConvertData( $Command, $Value ) );
	 }
  }

?>
<?
  include( "ViessmannVariables.inc.php");

  // Constants
  define( "VIESSMANN_PING",             chr(0x05) );
  define( "VIESSMANN_KW_READ_PRAEFIX",  chr(0x01).chr(0xF7) );
  define( "VIESSMANN_KW_WRITE_PRAEFIX", chr(0x01).chr(0xF4) );

  // init variables
  $CurrentAction   = ""; $CurrentProtocol = ""; $CurrentCommand  = "";
  $CurrentLength   = ""; $CurrentSetValue = "";

  $ViessmannDeviceID = GetValueString( VIESSMANN_VARIABLE_DEVICE );

  // get current Command if available or determine Device ID automatically
  $Command = GetValueString( VIESSMANN_VARIABLE_COMMAND );
  if ( $ViessmannDeviceID == "" AND strlen( $Command ) == 0 )
  {
	 $Command = "R:KW:00F8:2: "; // retrieve Device ID
	 SetValueString( VIESSMANN_DEVICE_COMMAND, $Command );
  }

  if ( $Command != "" )
  {
    $CommandArray = explode(":", $Command);
    $parts = count( $CommandArray );
    if ( $parts > 0 ) $CurrentAction   = $CommandArray[0];
    if ( $parts > 1 ) $CurrentProtocol = $CommandArray[1];
    if ( $parts > 2 ) $CurrentAddress  = $CommandArray[2];
    if ( $parts > 3 ) $CurrentLength   = $CommandArray[3];
    if ( $parts > 4 ) $CurrentSetValue = $CommandArray[4];
  }

  // Get remaining data in the com port via the buffer of the register variable
  $ComData = RegVar_GetBuffer( VIESSMANN_VARIABLE_REGISTER );
  // and merge it together with the passed data
  $ComData .= $IPS_VALUE;
echo $CurrentAction."-";
if ($ComData == VIESSMANN_PING ) echo "Ping"; else echo strlen( $ComData );
  // Process Com Data ----------------------------------------------------------
  if (   $ComData == VIESSMANN_PING AND
		 ( $CurrentAction == "R" OR $CurrentAction == "W" ) )
  {
    // No data expected (Command available), so execute command if available

    // Check, if expected Action and Command capabilities fit

    // Prepare Command Address + Length
    $Address =  chr(hexdec(substr($CurrentAddress,0,2)));
    $Address .= chr(hexdec(substr($CurrentAddress,2,2)));
    switch ( $CurrentAction )
    {
      case "R": // Read
        $CommandString = VIESSMANN_KW_READ_PRAEFIX.$Address.chr($CurrentLength);
        $Command[0] = "-"; // Mark Command as executed
        break;
      case "W": // Write
        $CommandString = VIESSMANN_KW_WRITE_PRAEFIX.$Address.chr($CurrentLength).$CurrentSetValue;
        $Command = ""; // Clear command
        break;
      default:
        $CommandString = "";
        break;
    }
    if ( $CommandString != "" )
    {
      SetValueString( VIESSMANN_VARIABLE_COMMAND, $Command );
	   // Clear current result
      SetValueString( VIESSMANN_VARIABLE_RESULT, "" );
		// Send command to Viessmann heating device via COM Port
		COMPort_SendText( VIESSMANN_VARIABLE_COMPORT, $CommandString );
    }
  }
  else
  {
	  if ( $CurrentAction == "-" and strlen( $ComData ) >= $CurrentLength )
	  {
		  // Com Data is equal or longer as needed
		  $Result = substr( $ComData, 0, $CurrentLength );
		  // Set Result in IPS Variable
        SetValueString( VIESSMANN_VARIABLE_RESULT, $Result );

        // if Device ID is initial and command was to retrieve device ID
        if ( $ViessmannDeviceID == "" AND $Command == "-:KW:00F8:2: " )
        {
			 // set device ID
			 $DeviceID = "";
          for( $x=0; $x < strlen($Result); $x++)
          {
            if ( ord($Result[$x]) < 10 ) $DeviceID .= "0";
            $DeviceID .= strtoupper(dechex(ord($Result[$x])));
          }
          SetValueString( VIESSMANN_VARIABLE_DEVICE, $DeviceID );
        }

        // clear command and remaining buffer of register variable
	  	  SetValueString( VIESSMANN_VARIABLE_COMMAND, "" );
        RegVar_SetBuffer( VIESSMANN_VARIABLE_REGISTER, "" );
	  }
	  else
	  {
        // as a result is expected and the current length of data is not
        // sufficient, write the data back to the buffer of the register var
        if ( $Command != "" AND $CurrentAction == "-" )
          RegVar_SetBuffer( VIESSMANN_VARIABLE_REGISTER, $ComData);
		  else
		    RegVar_SetBuffer( VIESSMANN_VARIABLE_REGISTER, "");
    }

  }
?>

Auch dort könntest du vor dem jeweiligen SetValue… unsinnige Werte weglassen, also z.B. if ($variable <> 0) SetValue…

Dann würde keine 0 mehr geschrieben. Das geht auch als Range, wenn du die möglichen Werte kennst.

Ist etwas Aufwand, aber machbar. Wenn du hinter raus löschen willst musst du ja auch wissen was.

meinst du das so zb:

ViessmannSetVariableByCommand( "VorlauftemperaturSekundaer", 39911 /*[skribt\Viessmann\Abfragen\Vorlauftemperatur Sekundär berechnen\Vorlauftemperatur Sekundär]*/ ); 

$VorlauftemperaturSekundär = GetValue(39911);

if ($VorlauftemperaturSekundär > 100) 
{
SetValue(12345, $VorlauftemperaturSekundär); 
}

ok, jetzt bin ich genau so schlau wie vorher.

Wie kann ich das zur Laufzeit abfangen?

<?
 if ($Luftfeuchtigkeit < 15) 
{
vergiss was du machen solltest; 
}
?>

Du schreibst aber noch was mit SetValue… ich will aber nichts setzten ich möchte löschen, dieser eine Wert aus dem Archiv kann ersatzlos entfernt werden.

Mir wird in deinem Code nicht klar, wo die Original-Quellwerte her kommen.

Wenn du in deinem Beispiel die 12345 ins Archiv aufzeichnest, dann hättest du so keine Werte unter 100.

BeLo, wenn du den Müll nicht schreibst, dann musst du ihn hinter auch nicht löschen.

Du holst doch die Daten von Wonderground, bereitest sie auf und schreibst sie in Variablen, also kannst du dort auch Fehler/falsche Werte abfangen.

Ich hole da nichts, das macht das Wonderground Modul von jemandem aus dem Forum geschrieben.
Ich freu mich einfach nur, das die Variablen gefüllt werden, dementsprechend habe ich da auch kein Einblick.

Das melde dem Autor das als Fehler :wink:
Es macht ja wirklich wenig Sinn regelmäßig nachträglich zu korrigieren.(außer bei den jetzt schon vorhanden Daten)
Michael

na das ist ja die beste Idee :smiley:

EDIT: Anfrage gestartet :slight_smile:

danke ralf bei mir geht es jetzt
belo mit der variante hir kannst du zwar keine Werte löschen die bereits vorhanden sind aber zumindest keine falschen Werte mehr schreiben.