enabled) public $timer = 0; public $luminance_min = 60; public $luminance_max = 3000; public $storeDownTime = 38; public $storeUpTime = 41; public $maxLevel; public $storeLevel; protected $propertyInitialized =array(); protected $devicelist = array( RDC_EXTERIEUR_LUMINOSITE => "illuminance_lux", RDC_SALON_LUMINOSITE => "illuminance_lux", RDC_STORE_VIBRATION => "vibration", METEO => "rainin", METEO => "solarradiation", METEO => "windspeedkmh", METEO => "windgustkmh" ); function installHooks(&$indexDevices) { return $this->installHooksFunction($indexDevices); } // callback fonction. Is called with these 3 parameters // $device -> calling device // $property -> property of the device (given by mqtt) // $value -> value of the property public function callBack($device, $property, $value) { global $mohaDB, $devices, $indexDevices; logger(DEBUG, "Callback : RDC_STORE", __FILE__ . ":" . __LINE__); $rain = 0; static $rainS; $exterieur_lux = 0; $exterieurLuxMoyen =0; $salon_lux = 0; $rafale = 0; $soleil = 0; $storeDevice = $indexDevices[RDC_STORE]; $r = 0; $moving = "STOP"; $store2level = false; $lastVibration = 0; if ($this->active == true) { if (array_key_exists("vibration", $indexDevices[RDC_store_vibration]->properties)) { $lastVibration = $mohaDB->moyenne($indexDevices[RDC_store_vibration], "vibration", 5); logger(DEBUG, "Last vibration inferior to 5 minutes" . bool2string($lastVibration ), __FILE__ . ":" . __LINE__); } if (array_key_exists("moving", $storeDevice->properties)) { $moving = $storeDevice->properties["moving"]["value"]; logger(DEBUG, "Moving = " . $moving, __FILE__ . ":" . __LINE__); } if (array_key_exists(METEO, $indexDevices)) { if (array_key_exists("rainin", $indexDevices[METEO]->properties)) { $rainTmp = $indexDevices[METEO]->properties["rainin"]["value"]; $rain = $rainTmp - $rainS; $rainS = $rainTmp; logger(DEBUG, "rain=" . $rain, __FILE__ . ":" . __LINE__); } if (array_key_exists("windgustkmh", $indexDevices[METEO]->properties)) { if ($indexDevices[METEO]->properties["windgustkmh"]["value"] > 50) { logger(ALERT, "Vent fort :" . $indexDevices[METEO]->properties["windgustkmh"]["value"], __FILE__ . ":" . __LINE__, $device); } $rafale = $mohaDB->moyenne($indexDevices[METEO], "windgustkmh", 10); if ($rafale == 0) { $rafale = $indexDevices[METEO]->properties["windgustkmh"]["value"]; } logger(DEBUG, "rafale=" . $rafale, __FILE__ . ":" . __LINE__); } if (array_key_exists("windspeedkmh", $indexDevices[METEO]->properties)) { if ($indexDevices[METEO]->properties["windspeedkmh"]["value"] > 50) { logger(ALERT, "Vent fort :" . $indexDevices[METEO]->properties["windspeedkmh"]["value"], __FILE__ . ":" . __LINE__, $device); } $vent = $mohaDB->moyenne($indexDevices[METEO], "windspeedkmh", 6); if ($vent == 0) { $vent = $indexDevices[METEO]->properties["windspeedkmh"]["value"]; } logger(DEBUG, "vitesse du vent =" . $vent, __FILE__ . ":" . __LINE__); } if ($vent > $rafale) { $rafale = $vent; } if (array_key_exists("solarradiation", $indexDevices[METEO]->properties)) { $soleil = $mohaDB->moyenne($indexDevices[METEO], "solarradiation", 10); logger(DEBUG, "soleil=" . $soleil, __FILE__ . ":" . __LINE__); } } if (array_key_exists("position", $storeDevice->properties)) { $this->storeLevel = $storeDevice->properties["position"]["value"]; logger(DEBUG, "storeLevel=" . $this->storeLevel, __FILE__ . ":" . __LINE__); }else { $this->storeLevel = 0; } if (array_key_exists("illuminance_lux", $indexDevices[RDC_FACADE_LUMINOSITE]->properties)) { $facade_lux = $indexDevices[RDC_FACADE_LUMINOSITE]->properties["illuminance_lux"]["value"]; $facadeLuxMoyen = $mohaDB->moyenne($indexDevices[RDC_FACADE_LUMINOSITE], "illuminance_lux", 10); if ($facadeLuxMoyen == 0) { $facadeLuxMoyen = $facade_lux; } logger(DEBUG, "facade_lux=" . $facade_lux . " et facadeLuxMoyen=" . $facadeLuxMoyen, __FILE__ . ":" . __LINE__); } if (array_key_exists("illuminance_lux", $indexDevices[RDC_EXTERIEUR_LUMINOSITE]->properties)) { $exterieur_lux = $indexDevices[RDC_EXTERIEUR_LUMINOSITE]->properties["illuminance_lux"]["value"]; $exterieurLuxMoyen = $mohaDB->moyenne($indexDevices[RDC_EXTERIEUR_LUMINOSITE], "illuminance_lux", 10); if ($exterieurLuxMoyen == 0) { $exterieurLuxMoyen = $exterieur_lux; } logger(DEBUG, "exterieur_lux=" . $exterieur_lux . " et exterieurLuxMoyen=" . $exterieurLuxMoyen, __FILE__ . ":" . __LINE__); } if (array_key_exists("illuminance_lux", $indexDevices[RDC_SALON_LUMINOSITE]->properties)) { $salon_lux = $mohaDB->moyenne($indexDevices[RDC_SALON_LUMINOSITE], "illuminance_lux", 10); if ($salon_lux == 0) { $salon_lux = $indexDevices[RDC_SALON_LUMINOSITE]->properties["illuminance_lux"]["value"]; } logger(DEBUG, "salon_lux=" . $salon_lux, __FILE__ . ":" . __LINE__); } // Calcul de la position du store if ($exterieurLuxMoyen > 36000 or $exterieur_lux > 50000 or $salon_lux >600) { logger(DEBUG, "exterieurLuxMoyen > 36000 or exterieur_lux > 50000 or salon_lux >600", __FILE__ . ":" . __LINE__); $store2level = $this->storeLevel + 20; }elseif ($exterieurLuxMoyen < 5000 and $salon_lux < 200 and $soleil < 100 and $facadeLuxMoyen < 10000) { logger(DEBUG, "exterieurLuxMoyen < 5000 and salon_lux < 200 and soleil < 100 and facadeLuxMoyen < 10000", __FILE__ . ":" . __LINE__); $this->close("Luminosité faible"); } logger(DEBUG, sprintf(_("property=%s, value=%s"), $property, $value), __FILE__ . ":" . __LINE__); if ($rafale >= 70 or $rain != 0) { $this->maxLevel = 0; logger(DEBUG, sprintf("rafale = %s and rain = %s",$rafale, $rain), __FILE__ . ":" . __LINE__); $this->close("vent trop fort ou pluie"); return 0; }elseif ($rafale != 0) { //calcul du maxlevel par rapport a la vitesse des rafales $r = round(($rafale-20)/4, 0, PHP_ROUND_HALF_UP)*10; if ($r < 0) { $r = 0; }else { $r = 100 - $r; } if ($lastVibration == 0) { $this->maxLevel = 100 - $r; } logger(DEBUG, "rafale=" . $rafale, __FILE__ . ":" . __LINE__); } logger(DEBUG, "maxlevel=" . $this->maxLevel, __FILE__ . ":" . __LINE__); switch ($property) { case "rainin": logger(DEBUG, "CASE: rainin:" . $value, __FILE__ . ":" . __LINE__); $this->close("Pluie"); break; case "windgustkmh": logger(DEBUG, "CASE: windgustkmh:" . $rafale, __FILE__ . ":" . __LINE__); break; case "vibration": //$tmpStore = $this->storeLevel - 20; /*if ($store2level == false or $store2level > $tmpStore) { $this->setTo($tmpStore, AUTO); }*/ $this->maxLevel -= 20; default: break; } if ($this->maxLevel < 0) { $this->maxLevel = 0; } logger(DEBUG, "maxLevel = " . $this->maxLevel . ' result => $r = ' . $r, __FILE__ . ":" . __LINE__); if ($this->storeLevel > $this->maxLevel) { $this->setTo($this->maxLevel, AUTO); }elseif ($store2level !== false) //$store2level = false then no change on store position { if ( $store2level > $this->maxLevel ) { logger(DEBUG, "store2level > maxLevel", __FILE__ . ":" . __LINE__); $this->setTo($this->maxLevel, AUTO); }else { logger(DEBUG, "store2level <= maxLevel", __FILE__ . ":" . __LINE__); $this->setTo($store2level, AUTO); } }else { logger(DEBUG, _("Store is Moving ") . $moving, __FILE__ . ":" . __LINE__); } } } private function setTo($level, $method) { logger(DEBUG, "function 'set' to level : " . $level, __FILE__ . ":" . __LINE__); if ($level <= 100) { logger(DEBUG, "Open store :" . $level, __FILE__ . ":" . __LINE__); $this->send($level, $method); }//else /*{ logger(DEBUG, "store is already at level" . $this->storeLevel . " so < at " . $level, __FILE__ . ":" . __LINE__); }*/ } private function close ($reason) { if ($this->storeLevel > 0) { logger(DEBUG, "Close store :" . $reason, __FILE__ . ":" . __LINE__); $this->send(0, IDLE); } } private function send($level, $method) { global $indexDevices; $deviceObject = $indexDevices[RDC_STORE]; $msg = array("position" => $level); logger(INFO, sprintf(_("publishing message: %s to %s"), json_encode($msg), $deviceObject->friendlyName), __FILE__ . ":" . __LINE__); $deviceObject->payload = $msg; $deviceObject->set("position", $method); } } $hooks["rdc_store"] = new rdc_store(); ?>