RegisterVariableInteger("LockPrio", "LockPrio"); $this->RegisterVariableInteger("UserPrio", "UserPrio"); // Energiehandling $this->RegisterVariableBoolean("Idle", "Idle", "", true); $this->RegisterVariableInteger("CurrentPower", "CurrentPower", "", 0); $this->RegisterVariableBoolean("Sperrzeit", "Sperrzeit", "", false); $this->RegisterVariableFloat("UsedEnergy", "UsedEnergy", "", 0); $this->RegisterVariableString("PowerSteps", "PowerSteps"); // PowerSteps-Variable registrieren // Trägheit $this->RegisterPropertyInteger("IdleCounterMax", 4); $this->RegisterVariableInteger("IdleCounter", "IdleCounter", "", 0); $this->SetValue("IdleCounter", 0); $this->RegisterVariableInteger("Mindestlaufzeit", "IdleCounter", "", 0); $this->RegisterVariableInteger("Zustand_WP", "Zustand_WP", "", 1); $this->RegisterVariableInteger("WP_Laufzeit_Zahler", "WP_Laufzeit_Zahler", "", 20*12); $this->RegisterVariableBoolean("LetzterPeakwert", "LetzterPeakwert", "", false); $this->RegisterVariableBoolean("LetzterPeakwert_Aenderung", "LetzterPeakwert_Aenderung", "", false); $this->RegisterPropertyInteger("WP_Leistung", 6000); $this->RegisterPropertyInteger("Wolkenschwellwert", 60); $this->RegisterPropertyInteger("Wolkenwert", 0); $this->RegisterPropertyInteger("Aussentemperatur", 0); $this->RegisterPropertyInteger("Referenzzeit", 0); $this->RegisterPropertyInteger("Sperrkontakt", 0); $this->RegisterPropertyInteger("Kontakt_Erhoeung", 0); $this->RegisterPropertyBoolean("Schwellwert_Anwenden", false); $this->RegisterPropertyInteger("Schwellwert", 0); $this->RegisterPropertyInteger("WW_Temp", 1); //Initialisieren $this->SetValue("Idle", true); } public function ApplyChanges() { parent::ApplyChanges(); } // Aktionen verarbeiten public function RequestAction($Ident, $Value) { switch ($Ident) { case "SetCurrentPower": $this->SetCurrentPower($Value); break; case "GetCurrentData": return $this->GetCurrentData($Value); break; case "ResetPowerSteps": $this->ResetPowerSteps($Value); break; default: throw new Exception("Invalid Ident"); } } // Methode zum Setzen des aktuellen Stromverbrauchs public function SetCurrentPower(float $power) { $sperrzei_abs = ((60 * 60 * (GetValue($this->ReadPropertyInteger("Aussentemperatur")) + 10)) / 25) * 6; if ($sperrzei_abs > 6 * 60 * 60) { $sperrzei_abs = 6 * 60 * 60; } if ( $this->ReadPropertyInteger("Wolkenschwellwert") < GetValue($this->ReadPropertyInteger("Wolkenwert")) || $sperrzei_abs < 0 ) { $sperrzei_abs = 0; } $sperrzeit = (GetValue($this->ReadPropertyInteger("Referenzzeit")) % 86400) - $sperrzei_abs; $entsperrzeit = GetValue($this->ReadPropertyInteger("Referenzzeit")) % 86400; $aktuellezeit = time() % 86400; $this->CheckIdle($power); $its_lock_time = $this->GetValue("Sperrzeit"); if ( $aktuellezeit > $sperrzeit && $aktuellezeit < $entsperrzeit && $this->GetValue("WP_Laufzeit_Zahler") > 240 ) { $this->SetValue("Sperrzeit", true); } elseif ($this->GetValue("WP_Laufzeit_Zahler") > 240) { $this->SetValue("Sperrzeit", false); } $newlocktime = $this->GetValue("Sperrzeit"); if ( $newlocktime == true && $its_lock_time == false && $this->GetValue("WP_Laufzeit_Zahler") > 240 ) { $this->SetValue("WP_Laufzeit_Zahler", 0); SetValue($this->ReadPropertyInteger("Sperrkontakt"), true); } elseif ( $newlocktime == false && $its_lock_time == true && $this->GetValue("WP_Laufzeit_Zahler") > 240 ) { $this->SetValue("WP_Laufzeit_Zahler", 0); SetValue($this->ReadPropertyInteger("Sperrkontakt"), false); } elseif ( $this->GetValue("CurrentPower") != $power || ($this->GetValue("WP_Laufzeit_Zahler") > 240 && $this->GetValue("LetzterPeakwert") != $this->GetValue("LetzterPeakwert_Aenderung")) ) { $this->SetValue("WP_Laufzeit_Zahler", 0); $LastPeak = $this->GetValue("LetzterPeakwert"); $this->SetValue("LetzterPeakwert_Aenderung", $LastPeak); $state = $this->GetValue("Zustand_WP"); if ($state == 0) { $this->SetValue("Zustand_WP", 1); SetValue($this->ReadPropertyInteger("Sperrkontakt"), false); SetValue($this->ReadPropertyInteger("Kontakt_Erhoeung"), false); } elseif ($state == 1) { // Normalbetrieb if ( $LastPeak && $power == $this->ReadPropertyInteger("WP_Leistung") ) { $this->SetValue("Zustand_WP", 1); $this->SetValue( "CurrentPower", $this->ReadPropertyInteger("WP_Leistung") ); } elseif ($LastPeak && $power == 0) { $this->SetValue("Zustand_WP", 2); $this->SetValue("CurrentPower", 0); } elseif ( $LastPeak == false && $power == $this->ReadPropertyInteger("WP_Leistung") ) { $this->SetValue("Zustand_WP", 3); $this->SetValue( "CurrentPower", $this->ReadPropertyInteger("WP_Leistung") ); } elseif ($LastPeak == false && $power == 0) { $this->SetValue("Zustand_WP", 1); $this->SetValue("CurrentPower", 0); } } elseif ($state == 2) { // Sperre if ( $LastPeak && $power == $this->ReadPropertyInteger("WP_Leistung") ) { $this->SetValue("Zustand_WP", 1); $this->SetValue( "CurrentPower", $this->ReadPropertyInteger("WP_Leistung") ); } elseif ($LastPeak && $power == 0) { $this->SetValue("Zustand_WP", 2); $this->SetValue("CurrentPower", 0); } elseif ( $LastPeak == false && $power == $this->ReadPropertyInteger("WP_Leistung") ) { $this->SetValue("Zustand_WP", 3); $this->SetValue( "CurrentPower", $this->ReadPropertyInteger("WP_Leistung") ); } elseif ($LastPeak == false && $power == 0) { $this->SetValue("Zustand_WP", 1); $this->SetValue("CurrentPower", 0); } } elseif ($state == 3) { // Erhöht if ( $LastPeak && $power == $this->ReadPropertyInteger("WP_Leistung") ) { $this->SetValue("Zustand_WP", 1); $this->SetValue( "CurrentPower", $this->ReadPropertyInteger("WP_Leistung") ); } elseif ($LastPeak && $power == 0) { $this->SetValue("Zustand_WP", 2); $this->SetValue("CurrentPower", 0); } elseif ( $LastPeak == false && $power == $this->ReadPropertyInteger("WP_Leistung") ) { $this->SetValue("Zustand_WP", 3); $this->SetValue( "CurrentPower", $this->ReadPropertyInteger("WP_Leistung") ); } elseif ($LastPeak == false && $power == 0) { $this->SetValue("Zustand_WP", 1); $this->SetValue("CurrentPower", 0); } } else { $this->SetValue("Zustand_WP", 1); } $newState = $this->GetValue("Zustand_WP"); if ($newState == 0) { SetValue($this->ReadPropertyInteger("Sperrkontakt"), false); SetValue($this->ReadPropertyInteger("Kontakt_Erhoeung"), false); } elseif ($newState == 1) { SetValue($this->ReadPropertyInteger("Sperrkontakt"), false); SetValue($this->ReadPropertyInteger("Kontakt_Erhoeung"), false); } elseif ($newState == 2) { SetValue($this->ReadPropertyInteger("Sperrkontakt"), true); SetValue($this->ReadPropertyInteger("Kontakt_Erhoeung"), false); } elseif ($newState == 3) { SetValue($this->ReadPropertyInteger("Sperrkontakt"), false); SetValue($this->ReadPropertyInteger("Kontakt_Erhoeung"), true); } else { SetValue($this->ReadPropertyInteger("Sperrkontakt"), false); SetValue($this->ReadPropertyInteger("Kontakt_Erhoeung"), false); } } else { $newCount = $this->GetValue("WP_Laufzeit_Zahler"); $this->SetValue("WP_Laufzeit_Zahler", $newCount + 1); } } // Methode zum Abrufen der aktuellen Daten public function GetCurrentData(bool $Peak) { // tagessperrzeit berechnen $this->SetValue("LetzterPeakwert", $Peak); if($this->GetValue("WP_Laufzeit_Zahler")<(20*12)){ $this->SetValue("PowerSteps", json_encode([$this->GetValue("CurrentPower")])); }elseif($this->ReadPropertyBoolean("Schwellwert_Anwenden")==true && ($this->ReadPropertyInteger("Schwellwert")>GetValue($this->ReadPropertyInteger("WW_Temp"))) ){ $this->SetValue("PowerSteps", json_encode([$this->ReadPropertyInteger("WP_Leistung")])); } else{ $this->SetValue("PowerSteps", json_encode([0, $this->ReadPropertyInteger("WP_Leistung")])); } } public function CheckIdle($power) { $lastpower = GetValue($this->GetIDForIdent("CurrentPower")); if ($lastpower != $power) { $this->SetValue("Idle", false); $this->SetValue( "IdleCounter", $this->ReadPropertyInteger("IdleCounterMax") ); } // IdleCounter auslesen und verarbeiten $idleCounter = $this->GetValue("IdleCounter"); if ($idleCounter > 0) { $this->SetValue("Idle", false); $this->SetValue("IdleCounter", $idleCounter - 1); } else { $this->SetValue("Idle", true); } } } ?>