diff --git a/class/db.php b/class/db.php index 8ba93e8..d8bf66a 100644 --- a/class/db.php +++ b/class/db.php @@ -35,27 +35,26 @@ class db extends mysqli return $this->real_escape_string($string); } - function logProperty($device, $propertyTree, $value, $oldValue = 0) + function logProperty($device, $property, $value, $oldValue = 0) { global $mohaDB, $properties2log, $testMode; $precision = 0; //echo "############## logProperty ################\nproperty => " . $propertyTree .EOL; - if (array_key_exists($propertyTree, $properties2log)) + if (array_key_exists($property, $properties2log)) { //echo "logging in database"; $ieeeAddress = $device->ieeeAddress; //print_r($ieeeAddress); - $query = "INSERT INTO logs (device, property, value) VALUES('" . $this->protect($ieeeAddress) . "', '" . $this->protect($propertyTree) . "', '" . $this->protect($value) . "')"; - if (is_numeric($value) and !empty($properties2log[$propertyTree])) + $query = "INSERT INTO logs (device, property, value) VALUES('" . $this->protect($ieeeAddress) . "', '" . $this->protect($property) . "', '" . $this->protect($value) . "')"; + echo $query; + if (is_numeric($value) and !empty($properties2log[$property])) { // calculate a min/max value for storing data - - $minMax = $properties2log[$propertyTree]; + $minMax = $properties2log[$property]; if (is_callable($minMax)) { $minMax = $minMax($value); } - //echo "minMax = " .$minMax . EOL; //echo "oldValue = " . $oldValue . EOL; //echo "Value = " . $value . EOL; @@ -75,7 +74,7 @@ class db extends mysqli logger(ERROR, _("mysql query errror: ") . $this->error, __FILE__ . ":" . __LINE__); } } - logger(INFO, sprintf(_("New value (%s) of property: '%s' of device: %s stored in database"), bool2string($value), $propertyTree, $device->friendlyName), __FILE__ . ":" . __LINE__); + logger(INFO, sprintf(_("New value (%s) of property: '%s' of device: %s stored in database"), bool2string($value), $property, $device->friendlyName), __FILE__ . ":" . __LINE__); } } } diff --git a/class/hook_class.php b/class/hook_class.php index e2f37cb..05e49de 100644 --- a/class/hook_class.php +++ b/class/hook_class.php @@ -33,7 +33,7 @@ class hook if (isset($indexDevices[$ieeeAddress])) { $property = $property2change[0]; - $indexDevices[$ieeeAddress]->$property["functions"][] = array($this,"callback"); + $indexDevices[$ieeeAddress]->properties[$property]["functions"][] = array($this,"callback"); $property2change[1] = true; logger(DEBUG, sprintf(_("Property '%s' is initialized with callback"), $property2change[0]), __FILE__ . ":" . __LINE__); }else diff --git a/constants.php b/constants.php index e809814..a9c5e18 100644 --- a/constants.php +++ b/constants.php @@ -4,8 +4,8 @@ define("EOL", "\n"); define("EOLR", "\n\r"); define("Z2M", "zigbee2mqtt"); -define("ON", 1); -define("OFF", 0); +define("ON", true); +define("OFF", false); define("AUTO", 0); define("MANUAL", 1); diff --git a/db_functions.php b/db_functions.php index 8440b59..df372a2 100644 --- a/db_functions.php +++ b/db_functions.php @@ -26,9 +26,10 @@ function mkDevicesDB($topic, $json, $group=false) { $devices[$topic]= array(); } + //print_r($json); foreach ($json as $jsonDevice) { - //print_r($device); + $fn = $jsonDevice->friendly_name; $fnTree = explode("/", $fn); $device = & $devices[$topic]; @@ -55,7 +56,7 @@ function mkDevicesDB($topic, $json, $group=false) $indexFriendlyNames[$fn] = & $device["device"]; }else { - addDevice($device, $fn, $jsonDevice); + addDevice($device["device"], $fn, $jsonDevice); } } $dbInit += 1; @@ -70,43 +71,69 @@ function mkDevicesDB($topic, $json, $group=false) function addDevice(& $device, $fn, $jsonDevice ) { global $listProperties, $listPropertiesKeys, $hooks, $indexDevices, $indexFriendlyNames; - $device["device"]->type = $jsonDevice->type; - $device["device"]->ieeeAddress = $jsonDevice->ieee_address; + $device->type = $jsonDevice->type; + $device->ieeeAddress = $jsonDevice->ieee_address; if ( !empty($jsonDevice->power_source ) ) { - $device["device"]->powerSource = $jsonDevice->power_source; + $device->powerSource = $jsonDevice->power_source; } if ($jsonDevice->definition != null) { - $device["device"]->description = $jsonDevice->definition->description; - searchPropertyKey($fn, $device["device"], $jsonDevice->definition->exposes, $listPropertiesKeys); + $device->description = $jsonDevice->definition->description; + searchPropertyKey($fn, $device, $jsonDevice->definition->exposes, $listPropertiesKeys); } - searchPropertyValue($fn, $device["device"], $jsonDevice, $listProperties); + searchPropertyValue($fn, $device, $jsonDevice, $listProperties); //indexing device - $indexDevices[$device["device"]->ieeeAddress] = & $device["device"]; - $indexFriendlyNames[$fn] = & $device["device"]; + $indexDevices[$device->ieeeAddress] = & $device; + $indexFriendlyNames[$fn] = & $device; } -function searchPropertyKey($fn, &$device, $object, $listPropertiesKeys) +function searchPropertyKey($fn, &$device, $inputObject, $listPropertiesKeys) { - foreach($listPropertiesKeys as $property) + //foreach($listPropertiesKeys as $propertyKey) + //{ + logger(DEBUG, _("searching for property"), __FILE__ . ":" . __LINE__ ); + if (is_object($inputObject)) { - foreach($object as $key => $value) + if (property_exists($inputObject, "property")) { - if (gettype($value) == "object" or gettype($value) == "array") + logger(DEBUG, _("propertyKey exists filling properties"), __FILE__ . ":" . __LINE__ ); + $string = $inputObject->property; + $device->properties[$string]["value"] = null; + $device->properties[$string]["functions"] = array(); + + foreach($inputObject as $key2 => $value2) { - searchPropertyKey($fn, $device, $value, $listPropertiesKeys); + + if ($key2 != "property") + { + $device->properties[$string][$key2] = $value2; + logger(DEBUG, sprintf(_("property %s value %s"), $key2, print_r($device->properties[$string][$key2])), __FILE__ . ":" . __LINE__ ); + } } - if ( isset($value->property)) + }else + { + if (property_exists($inputObject, "type")) { - $string = $value->property; - $device->properties[$string]["value"] = null; - $device->properties[$string]["functions"] = array(); + $device->type = $inputObject->type; + } + foreach($inputObject as $key => $value) + { + logger(DEBUG, sprintf(_("key = %s"), $key), __FILE__ . ":" . __LINE__ ); + searchPropertyKey($fn, $device, $value, $listPropertiesKeys); } } //print_r($device); + }elseif (is_array($inputObject)) + { + foreach($inputObject as $value) + { + logger(DEBUG, _("value is object or group, iterating"), __FILE__ . ":" . __LINE__ ); + searchPropertyKey($fn, $device, $value, $listPropertiesKeys); + } } + } function searchPropertyValue($fn, &$device, $object, $listProperties) @@ -143,18 +170,20 @@ function iterateDevice($topic, $fn, $parentDevice, &$device, $payloadArray, $pro global $changed, $mohaDB, $testMode; $deviceType = (is_a($device, "device")); // = true if object //echo "==================== New iterate =====================" .EOL; - //echo "devicetype = "; var_dump($deviceType); echo EOL; + //echo "deviceType = "; var_dump($deviceType); echo EOL; //echo "device =>";print_r($device);echo EOL; //echo "PropertyTree ==============> " . $propertyTree . EOL; foreach($payloadArray as $key => $value) { $oldValue = null; //echo "key =>"; print_r($key); echo EOL; - //echo "value =>"; print_r($value); echo EOL; + //echo "value =>"; var_dump($value); echo EOL; //echo "type : " . gettype($value) .EOL; $valueType = gettype($value); if ($valueType == "object") { + //logger(DEBUG, _("valueType == object"), __FILE__ . ":" . __LINE__); + $propertyTree .= $key . "/"; //echo "PropertyTree " . $propertyTree . EOL; //echo " is Object" . EOL; @@ -170,67 +199,104 @@ function iterateDevice($topic, $fn, $parentDevice, &$device, $payloadArray, $pro //echo "===============>"; iterateDevice($topic, $fn, $parentDevice, $device->properties[$key], $value, $propertyTree); - }else + }elseif(is_array($device)) { //echo "is array"; - if (!array_key_exists($key, $device->properties)) + if (!array_key_exists($key, $device)) { - $device->properties[$key] = new stdClass; + $device[$key] = new stdClass; } //echo "iterating" . EOL; - iterateDevice($topic, $fn, $parentDevice, $device->properties[$key], $value, $propertyTree); + iterateDevice($topic, $fn, $parentDevice, $device[$key], $value, $propertyTree); + }elseif(is_object($device)) + { + if (!property_exists($device, $key)) + { + $device->$key = new stdClass; + } + iterateDevice($topic, $fn, $parentDevice, $device->$key, $value, $propertyTree); } }elseif ($valueType == "array") { + //logger(DEBUG,_("valueType == array"), __FILE__ . ":" . __LINE__); $propertyTree .= $key . "/"; if ($deviceType === true ) { $device->properties[$key] = array(); iterateDevice($topic, $fn, $parentDevice, $device->properties[$key], $value, $propertyTree); - }else + }elseif(is_array($device)) { - $device->properties[$key] = array(); - iterateDevice($topic, $fn, $parentDevice, $device->properties[$key], $value, $propertyTree); + $device[$key] = array(); + iterateDevice($topic, $fn, $parentDevice, $device[$key], $value, $propertyTree); + }elseif(is_object($device)) + { + $device->$key = array(); + iterateDevice($topic, $fn, $parentDevice, $device->$key, $value, $propertyTree); } }else { + //logger(DEBUG,_("valueType is ") . $valueType, __FILE__ . ":" . __LINE__); + //var_dump($device);echo EOL; - //if (empty($device->$key) or $value != null) - //{ - if (property_exists($device, $key)) + if (is_a($device, "device")) + { + //logger(DEBUG,_("This is an object 'device'"), __FILE__ . ":" . __LINE__); + if(array_key_exists($key, $device->properties)) { - if (is_array($device->$key)) + if ($device->properties[$key]["value"] != $value) { - $oldValue = $device->$key["value"]; - }else - { - $oldValue = $device->$key; + changeValue($device->properties[$key]["value"], $value, $parentDevice, $propertyTree, $key); } }else { - $device->$key = array("value" => null); - $device->$key["functions"] = array(); + $device->properties[$key] = array("value" => $value); + $device->properties[$key]["functions"] = array(); } - //echo $key . ' ===> oldvalue = ' . $oldValue . " value = " . $value . EOL; - if ($oldValue !== $value) + }elseif (is_array($device)) + { + //logger(DEBUG,_("deviceType") . $deviceType, __FILE__ . ":" . __LINE__); + if (array_key_exists($key, $device)) { - $device->$key["value"] = $value; - //$changed[$fn]["key"] = $key; - //$changed[$fn]["value"] = $value; - logger(INFO, sprintf(_("Device %s property %s, %s"), $fn, $propertyTree . $key, bool2string($value)), __FILE__ . ":" . __LINE__); - $mohaDB->logProperty($parentDevice, $propertyTree . $key, $value, $oldValue); - if (!empty($device->$key["functions"])) + if (is_array($device[$key])) { - logger(DEBUG,_("executing notifications functions"), __FILE__ . ":" . __LINE__); - foreach($device->properties[$key]["functions"] as $function) + if ($device[$key]["value"] != $value) { - $function($device, $key, $value); + changeValue($device->$key["value"], $value, $parentDevice, $propertyTree, $key); + } + }else + { + changeValue($device[$key], $value, $parentDevice, $propertyTree, $key); + } + }else + { + $device[$key] = array("value" => $value); + $device[$key]["functions"] = array(); + } + }elseif (is_object($device)) + { + if(property_exists($device, $key)) + { + if (is_array($device->$key)) + { + if ($device->$key["value"] != $value) + { + changeValue($device->$key["value"], $value, $parentDevice, $propertyTree, $key); + } + }else + { + if ($device->$key != $value) + { + changeValue($device->$key, $value, $parentDevice, $propertyTree, $key); } } + }else + { + $device->$key = array("value" => $value); + $device->$key["functions"] = array(); } - //} + } } } } @@ -238,30 +304,90 @@ function iterateDevice($topic, $fn, $parentDevice, &$device, $payloadArray, $pro function getDevicesValues($topic) { global $indexDevices, $topics; - logger(DEBUG, _("getDevicesValues function" )); + logger(DEBUG, _("getDevicesValues function" ), __FILE__ . ":" . __LINE__ ); foreach($indexDevices as $device) { if ($device->topic == $topic) { - logger(DEBUG, "device: " . $device->friendlyName); - $payload = "{"; + logger(DEBUG, "device: " . $device->friendlyName, __FILE__ . ":" . __LINE__ ); + $device->payload = array(); $flag = false; //$properties = array_slice($device, 12); //logger(DEBUG, print_r($properties, true)); - foreach($device->properties as $property => $value) + if (!empty($device->properties)) { - - if ($flag) + foreach($device->properties as $property => $value) { - $payload .= ","; - }else { - $flag = true; + $device->payload[$property] = ""; } - $payload .= '"' . $property . '":""'; - } - $device->payload = $payload . "}"; - logger(DEBUG, $device->payload); - $device->get(); + //logger(DEBUG, print_r($device->payload, true), __FILE__ . ":" . __LINE__ ); + $device->get(); + }else + { + logger(DEBUG, _("no properties to get for device: " . $device->friendlyName ), __FILE__ . ":" . __LINE__ ); + } + + } + } +} + +function getDeviceByFriendlyname(&$device, $topic, $fn, $payloadArray, $create = false) +{ + global $devices, $indexDevices, $indexFriendlyNames; + $n = explode("/", $fn); + //echo "topic => ". $topic . EOL; + $device = &$devices[$topic]; + foreach($n as $value) + { + //print_r($device[$value]); + if (array_key_exists($value, $device)) + { + $device = &$device[$value]; + }elseif($create === true) + { + $device[$value] = array(); + $device = &$device[$value]; + }else + { + logger(ERROR, sprintf(_(" device with friendlyname %s not found"), $fn), __FILE__ . ":" . __LINE__); + return false; + } + + } + if (! array_key_exists("device", $device)) + { + if ($create === true) + { + logger(WARNING, _("init of ") . $fn, __FILE__ . ":" . __LINE__); + $device["device"] = new device; + $device["device"]->type = $payloadArray->type; + $device["device"]->ieeeAddress = $payloadArray->ieeeAddress; + $device["device"]->friendlyname = $fn; + $indexDevices[$device["device"]->ieeeAddress] = & $device["device"]; + $indexFriendlyNames[$fn] = & $device["device"]; + } + }else + { + logger(INFO, sprintf(_(" device with friendlyname %s exists"), $fn), __FILE__ . ":" . __LINE__); + } + return true; +} + +function changeValue(&$oldValue, $value, &$parentDevice, $propertyTree, $key) +{ + global $mohaDB; + $object = $parentDevice->properties[$key]; + //$changed[$fn]["key"] = $key; + //$changed[$fn]["value"] = $value; + logger(INFO, sprintf(_("Logging Device %s property %s, %s"), $parentDevice->friendlyName, $propertyTree . $key, bool2string($value)), __FILE__ . ":" . __LINE__); + $mohaDB->logProperty($parentDevice, $key, $value, $oldValue); + $oldvalue = $value; + if (!empty($object["functions"])) + { + logger(DEBUG,_("executing notifications functions"), __FILE__ . ":" . __LINE__); + foreach($object["functions"] as $function) + { + $function($parentDevice, $key, $value); } } } diff --git a/docs/template.php b/docs/template.php index b13e4cc..53e6c31 100644 --- a/docs/template.php +++ b/docs/template.php @@ -23,7 +23,7 @@ class extends hook { // here your code - logger (INFO,sprintf(_("%s: notification received from MQTT from %s => parameter: %s value: %s"), $this->hookName, $device->friendlyName, $property, $value), __FILE__ . ":" . __LINE__); + logger (INFO,sprintf(_("%s: notification received from MQTT from %s => parameter: %s value: %s"), $this->hookName, $device->friendlyName, $property, bool2string($value)), __FILE__ . ":" . __LINE__); } } diff --git a/events.php b/events.php index 49668bf..550b60f 100644 --- a/events.php +++ b/events.php @@ -56,20 +56,20 @@ function checkEvents() $logLevel = $oldLevel; } -function setOneshotEvent(&$device, $datetime, $property, $value, $replace=false) +function setOneshotEvent(&$deviceObject, $datetime, $property, $value, $replace=false) { global $events; $events[] = new event; $key = key($events); $events[$key]->dateTimeEvent = new dateTime($datetime); - $events[$key]->ieeeAddress = $device->ieeeAddress; - $events[$key]->topic = $device->topic; + $events[$key]->ieeeAddress = $deviceObject->ieeeAddress; + $events[$key]->topic = $deviceObject->topic; $events[$key]->param = $property; $events[$key]->value = $value; - $events[$key]->device = & $device; + $events[$key]->device = & $deviceObject; } -function setRecurrentEvent(&$device, $property, $value, $startDatetime, $stopDatetime, $hours, $minutes, $seconds, $days, $weeks, $months, $years) +function setRecurrentEvent(&$deviceObject, $property, $value, $startDatetime, $stopDatetime, $hours, $minutes, $seconds, $days, $weeks, $months, $years) { global $events; $string = "P"; @@ -87,9 +87,9 @@ function setRecurrentEvent(&$device, $property, $value, $startDatetime, $stopDat $event->recurrenceInterval = new DateInterval($string); $event->startDatetime = new datetime($startDatetime); $event->stopDatetime = new datetime($stopDatetime); - $event->ieee_address = $device->ieeeAddress; - $event->topic = $device->topic; - $event->device = & $device; + $event->ieee_address = $deviceObject->ieeeAddress; + $event->topic = $deviceObject->topic; + $event->device = & $deviceObject; $event->param = $property; $event->value = $value; $event->dateTimeEvent = $event->startDatetime; @@ -100,7 +100,7 @@ function setRecurrentEvent(&$device, $property, $value, $startDatetime, $stopDat } } -function setDelay(&$device, $delay, $unit="second", $property, $value, $replace=false) +function setDelay(&$deviceObject, $delay, $unit, $property, $value, $replace=false) { global $events, $logLevel; $oldLevel = $logLevel; @@ -142,40 +142,40 @@ function setDelay(&$device, $delay, $unit="second", $property, $value, $replace= //print_r($datetime); if ($replace) { - $eventKey = searchEvent($device, $property, $value); + $eventKey = searchEvent($deviceObject, $property, $value); if ($eventKey !== false) deleteEvent($eventKey); } //$dt = $datetime->format("Y-m-d\TH:i:s\Z"); $events[] = new event; $key = array_key_last($events); $events[$key]->dateTimeEvent = $datetime; - $events[$key]->ieeeAddress = $device->ieeeAddress; - $events[$key]->topic = $device->topic; + $events[$key]->ieeeAddress = $deviceObject->ieeeAddress; + $events[$key]->topic = $deviceObject->topic; $events[$key]->param = $property; $events[$key]->value = $value; - $events[$key]->device = & $device; + $events[$key]->device = & $deviceObject; logger (DEBUG, _('Setting new delay in $events[]'), __FILE__ . ":" . __LINE__); - print_r($events[$key]); + //print_r($events[$key]); $loglevel = $oldLevel; } -function removeEvent($device, $property , $value) +function removeEvent($deviceObject, $property , $value) { - if (($eventKey = searchEvent($device, $property , $value)) === true) + if (($eventKey = searchEvent($deviceObject, $property , $value)) === true) { deleteEvent($eventKey); } } -function searchEvent($device, $property , $value) +function searchEvent($deviceObject, $property , $value) { global $events; - logger(DEBUG, sprintf(_("searching event for device %s, property %s and value %s"), $device->friendlyName, $property, bool2string($value)), __FILE__ . ":" . __LINE__); + logger(DEBUG, sprintf(_("searching event for device %s, property %s and value %s"), $deviceObject->friendlyName, $property, bool2string($value)), __FILE__ . ":" . __LINE__); foreach($events as $key => $event) { //echo "Event : $event => $value" . EOL; //echo "===>";print_r($event); echo EOL; - if($event->topic == $device->topic and $event->param == $property and $event->value == $value and $event->ieeeAddress == $device->ieeeAddress) + if($event->topic == $deviceObject->topic and $event->param == $property and $event->value == $value and $event->ieeeAddress == $deviceObject->ieeeAddress) { //echo "==============================\nfound " . $key . "\n=================================" . EOL; return $key; diff --git a/hooks/scripts/etage_plan_travail_eclairage.php b/hooks/scripts/etage_plan_travail_eclairage.php index 8def8c8..d76fc7a 100644 --- a/hooks/scripts/etage_plan_travail_eclairage.php +++ b/hooks/scripts/etage_plan_travail_eclairage.php @@ -12,7 +12,7 @@ class etage_plan_travail_eclairage extends hook // $device -> calling device // $property -> property of the device (given by mqtt) // $value -> value of the property - public function callBack(&$device, $property, $value) + public function callBack($device, $property, $value) { // here your code if($value == "ON") // ON diff --git a/hooks/scripts/rdc_chambre_eclairage.php b/hooks/scripts/rdc_chambre_eclairage.php index 8cbae24..7cbf9e0 100644 --- a/hooks/scripts/rdc_chambre_eclairage.php +++ b/hooks/scripts/rdc_chambre_eclairage.php @@ -19,38 +19,40 @@ class rdc_chambre_eclairage extends hook // $device -> calling device // $property -> property of the device (given by mqtt) // $value -> value of the property - public function callBack(&$device, $property, $value) + public function callBack($device, $property, $value) { global $devices, $indexDevices; - $lux = $indexDevices[RDC_CHAMBRE_LUMINOSITE]->illuminance_lux; + $lux = $indexDevices[RDC_CHAMBRE_LUMINOSITE]->properties["illuminance_lux"]; + $targetAmbiance = $indexDevices[RDC_CHAMBRE_AMBIANCE]; + $targetEclairage = $indexDevices[RDC_CHAMBRE_ECLAIRAGE]; + if ($property == "occupancy" and $value == "ON") { - $this->send(RDC_CHAMBRE_AMBIANCE, "ON", "OFF", AUTO); + $this->send($targetAmbiance, "ON", "OFF", AUTO); }elseif ($property == "contact" and $value = true and getValue(RDC_CHAMBRE_ECLAIRAGE, "state_l1") == "OFF") { - $this->send(RDC_CHAMBRE_ECLAIRAGE, "ON", "OFF", AUTO); + $this->send($targetEclairage, "ON", "OFF", AUTO); } logger (INFO, sprintf(_("%s: notification received from MQTT from %s => parameter: %s value: %s"), $this->hookName, $device->friendlyName, $property, bool2string($value)), __FILE__ . ":" . __LINE__); } - private function send($device, $state, $delayState = false, $method = MANUAL) + private function send($deviceObject, $state, $delayState = false, $method = MANUAL) { global $devices, $indexDevices; - $device = &$indexDevices[$device]; $msg = array("state" => $state); - if ($device->state["value"] != $state) + if ($deviceObject->properties["state"]["value"] != $state) { - logger(INFO, sprintf(_("publishing message: %s to %s"), json_encode($msg), $device->friendlyName), __FILE__ . ":" . __LINE__); - $device->payload = $msg; - $device->set(); - $device->method = $method; + logger(INFO, sprintf(_("publishing message: %s to %s"), json_encode($msg), $deviceObject->friendlyName), __FILE__ . ":" . __LINE__); + $deviceObject->payload = $msg; + $deviceObject->set(); + $deviceObject->method = $method; }else { - logger(INFO, sprintf(_("not publishing message: %s to %s, already set"), json_encode($msg), $device->friendlyName), __FILE__ . ":" . __LINE__); + logger(INFO, sprintf(_("not publishing message: %s to %s, already set"), json_encode($msg), $deviceObject->friendlyName), __FILE__ . ":" . __LINE__); } //echo 'delaystate = ' . var_dump($delayState); - if ($delayState !== false) setDelay($device, $this->delay, $this->timeUnit, "state", $delayState, true); + if ($delayState !== false) setDelay($deviceObject, $this->delay, $this->timeUnit, "state", $delayState, true); } } diff --git a/hooks/scripts/rdc_portes_ouvertes.php b/hooks/scripts/rdc_portes_ouvertes.php index 3658f23..783952e 100644 --- a/hooks/scripts/rdc_portes_ouvertes.php +++ b/hooks/scripts/rdc_portes_ouvertes.php @@ -15,9 +15,8 @@ class alerte_intrusion extends hook public $timeUnit = "minute"; // unit of time for delay, second, minute, day, week, month, year // callback fonction. Is called with these 4 parameters - public function callBack(&$device, $param, $value) + public function callBack($device, $param, $value) { - global $devices, $indexDevices; switch($param) { case "contact": diff --git a/hooks/scripts/rdc_salon_eclairage.php b/hooks/scripts/rdc_salon_eclairage.php index 0ace81f..2c44971 100644 --- a/hooks/scripts/rdc_salon_eclairage.php +++ b/hooks/scripts/rdc_salon_eclairage.php @@ -22,7 +22,10 @@ class rdc_salon_eclairage extends hook { global $indexDevices; logger(INFO, _("hook : rdc_salon_eclairage"), __FILE__ . ":" . __LINE__); - $device = &$indexDevices[RDC_SALON_ECLAIRAGE_PANNEAU]; + $deviceTarget = &$indexDevices[RDC_SALON_ECLAIRAGE_PANNEAU]; + $lux = $indexDevices[RDC_SALON_LUMINOSITE]; + $mvmt = $indexDevices[RDC_SALON_MVMT]; + $mvmt2 = $indexDevices[RDC_SALON_MVMT2]; switch($param) { case "occupancy": @@ -31,30 +34,30 @@ class rdc_salon_eclairage extends hook if ($value == ON and getValue(RDC_SALON_LUMINOSITE, "illuminance_lux") <= $this->luminance_min) { logger(DEBUG, _("setting to ON"), __FILE__ . ":" . __LINE__); - $this->send("ON", null, AUTO); - removeEvent($device, "state", "OFF"); + $this->send($deviceTarget, "ON", null, AUTO); + removeEvent($deviceTarget, "state", "OFF"); }elseif ($value == OFF) { logger(DEBUG, _("Value is OFF"), __FILE__ . ":" . __LINE__); if (getValue(RDC_SALON_MVMT, "occupancy") == OFF and (getValue(RDC_SALON_MVMT2, "occupancy") == OFF)) { logger(DEBUG, _("Setting to OFF"), __FILE__ . ":" . __LINE__); - setDelay($device, $this->delay, $this->timeUnit, "state", "OFF", true); - //$this->send("ON", "OFF", AUTO); + setDelay($deviceTarget, $this->delay, $this->timeUnit, "state", "OFF", true); + //$this->send($deviceTarget, "ON", "OFF", AUTO); } } break; case "contact": logger(DEBUG, _("CASE: Contact Door"), __FILE__ . ":" . __LINE__); - if ($value == false and getValue(RDC_SALON_LUMINOSITE, "illuminance_lux") <= $this->luminance_min and getValue(RDC_SALON_ECLAIRAGE_PANNEAU, "state") == "OFF") + if ($value == false and getValue(RDC_SALON_LUMINOSITE, "illuminance_lux") <= $this->luminance_min and getValue($deviceTarget->ieeeAddress, "state") == "OFF") { logger(DEBUG, _("Door is open and illumance < min"), __FILE__ . ":" . __LINE__); if (getValue(RDC_SALON_MVMT, "occupancy") == ON or getValue(RDC_SALON_MVMT2, "occupancy") == ON) { - $this->send("ON", null, AUTO); + $this->send($deviceTarget, "ON", null, AUTO); }else { - $this->send("ON", "OFF", AUTO); + $this->send($deviceTarget, "ON", "OFF", AUTO); } } break; @@ -63,39 +66,39 @@ class rdc_salon_eclairage extends hook if ($value >= $this->luminance_max) { logger(DEBUG, _("illuminace is > to max"), __FILE__ . ":" . __LINE__); - //$this->send("OFF", null, AUTO); + //$this->send($deviceTarget, "OFF", null, AUTO); //removeEvent($indexDevices[RDC_SALON_ECLAIRAGE_PANNEAU], "state", "OFF"); - if (searchEvent($device, "state", "OFF") === false) + if (searchEvent($deviceTarget, "state", "OFF") === false) { - setDelay($device, $this->delay, $this->timeUnit, "state", "OFF", true); + setDelay($deviceTarget, $this->delay, $this->timeUnit, "state", "OFF", true); } }elseif ($value <= $this->luminance_min and (getValue(RDC_SALON_MVMT, "occupancy") == ON OR getValue(RDC_SALON_MVMT2,"occupancy") == ON)) { logger(DEBUG, _("illuminance < min and movement detected"), __FILE__ . ":" . __LINE__); - $this->send("ON", null, AUTO); + $this->send($deviceTarget, "ON", null, AUTO); } break; } logger (INFO, sprintf(_("%s: notification received from MQTT from %s => parameter: %s value: %s"), $this->hookName, $device->friendlyName, $param, bool2string($value)), __FILE__ . ":" . __LINE__); } - private function send($state, $delayState = false, $method = MANUAL) + private function send(&$deviceTarget, $state, $delayState = false, $method = MANUAL) { global $indexDevices; - $device = & $indexDevices[RDC_SALON_ECLAIRAGE_PANNEAU]; + $msg = array("state" => $state); - if ($device->state["value"] != $state) + if ($deviceTarget->properties["state"]["value"] != $state) { - logger(INFO, sprintf(_("publishing message: %s to %s"), json_encode($msg), $device->friendlyName), __FILE__ . ":" . __LINE__); - $device->payload = $msg; - $device->set(); - $device->method = $method; + logger(INFO, sprintf(_("publishing message: %s to %s"), json_encode($msg), $deviceTarget->friendlyName), __FILE__ . ":" . __LINE__); + $deviceTarget->payload = $msg; + $deviceTarget->set(); + $deviceTarget->method = $method; }else { - logger(INFO, sprintf(_("not publishing message: %s to %s, already set"), json_encode($msg), $device->friendlyName), __FILE__ . ":" . __LINE__); + logger(INFO, sprintf(_("not publishing message: %s to %s, already set"), json_encode($msg), $deviceTarget->friendlyName), __FILE__ . ":" . __LINE__); } //echo 'delaystate = ' . var_dump($delayState); - if ($delayState !== false) setDelay($device, $this->delay, $this->timeUnit, "state", $delayState, true); + if ($delayState !== false) setDelay($deviceTarget, $this->delay, $this->timeUnit, "state", $delayState, true); } } diff --git a/hooks/scripts/rdc_sdb_eclairage.php b/hooks/scripts/rdc_sdb_eclairage.php index 43f9be1..10528a6 100644 --- a/hooks/scripts/rdc_sdb_eclairage.php +++ b/hooks/scripts/rdc_sdb_eclairage.php @@ -26,14 +26,16 @@ class rdc_sdb_eclairage extends hook // callback fonction. Is called with these 3 parameters public function callBack(&$device, $property, $value) { - global $devices, $indexDevices; + global $indexDevices; //var_dump($value); + $deviceTarget = $indexDevices[RDC_SDB_WC_ECLAIRAGE]; + switch($property) { case "occupancy": if ($value == ON) { - if (getValue(RDC_SDB_WC_ECLAIRAGE, "state_l1") != "ON") + if (getValue($deviceTarget->ieeeAddress, "state_l1") != "ON") { $this->send("ON"); } @@ -42,13 +44,13 @@ class rdc_sdb_eclairage extends hook } break; case "state_l1": - if ($value == ON) + if ($value == "ON") { - setDelay($indexDevices[RDC_SDB_WC_ECLAIRAGE], $this->delayManual, $this->timeUnit, "state_l1", "OFF", true); + setDelay($deviceTarget, $this->delay, $this->timeUnit, "state_l1", "OFF", true); $device->method = MANUAL; - }elseif ($value = OFF) + }elseif ($value = "OFF") { - removeEvent($indexDevices[RDC_SDB_WC_ECLAIRAGE], "state_l1", "OFF"); + removeEvent($deviceTarget, "state_l1", "OFF"); } break; } @@ -57,13 +59,12 @@ class rdc_sdb_eclairage extends hook private function send($state) { - global $devices, $indexDevices; + global $indexDevices; $msg = array("state_l1" => $state); - $device = & $indexDevices[RDC_SDB_WC_ECLAIRAGE]; + $device = &$indexDevices[RDC_SDB_WC_ECLAIRAGE]; logger(INFO, sprintf(_("publishing message: %s to %s"), $state, $device->friendlyName), __FILE__ . ":" . __LINE__); $device->payload = $msg; $device->set(null); - } } $hooks["rdc_sdb_eclairage"] = new rdc_sdb_eclairage(); diff --git a/hooks/scripts/rdc_wc_eclairage.php b/hooks/scripts/rdc_wc_eclairage.php index 96c0681..a3a1053 100644 --- a/hooks/scripts/rdc_wc_eclairage.php +++ b/hooks/scripts/rdc_wc_eclairage.php @@ -11,9 +11,9 @@ class rdc_wc_eclairage extends hook public $timeUnit = "minute"; // unit of time for delay, second, minute, day, week, month, year // callback fonction. Is called with these 4 parameters - public function callBack(&$device, $property, $value) + public function callBack($device, $property, $value) { - global $devices, $indexDevices; + global $indexDevices; //var_dump($value); switch($property) { diff --git a/moha.php b/moha.php index abc767a..2aa45e7 100644 --- a/moha.php +++ b/moha.php @@ -13,7 +13,7 @@ $listProperties = array("powerSource" => "batterie"); $listPropertiesKeys = array("expose"); //global variables -$logLevel = ALL; // INFO | NOTICE | WARNING | ERROR | ALERT; //ALL; + $notificationLevel = ALERT | ERROR; $topics = array(); // list of topics $mids = array(); // list of message IDs @@ -39,20 +39,20 @@ $flagHooks = false; if ($testMode) { + $logLevel = ALL; // INFO | NOTICE | WARNING | ERROR | ALERT; //ALL; $mqttServerIp = "192.168.1.253"; // IP address of mqttserver in test mode - $dataPath = "."; + $dataPath = "./"; $logFile = "./moha.log"; // Path of log file $configDir = "./config"; // default config dir (production value is /etc/moha/) }else { + $logLevel = INFO | NOTICE | WARNING | ERROR | ALERT; $mqttServerIp = "127.0.0.1"; // IP address of mqttserver in production mode $dataPath = "/usr/share/moha/"; $logFile = "/var/log/moha.log"; // Path of log file $configDir = "/etc/moha"; // default config dir (production value is /etc/moha/) - } - if (!init()) exit(1); // gettext @@ -70,7 +70,7 @@ function notify($message) return $result; } -function logger($level, $log, $pos = false, $notif = true) +function logger($level, $log, $pos = "", $notif = true) { global $logFh, $logLevel, $notificationLevel, $logLevels; $logString = date("c") . ' ' . $logLevels[$level] . " " ; @@ -100,7 +100,7 @@ function init() date_default_timezone_set('Europe/Paris'); if (! $logFh = fopen($logFile, "w") ) { - echo _("error opening log file"); + echo _("error opening log file in ") . getcwd(); return false; } return true; @@ -144,7 +144,7 @@ function endMoha() $client->disconnect(); while ($connected) { - if ( $x++ <= 60) + if ( $x++ >= 60) { fclose($logFh); exit (1); @@ -190,9 +190,9 @@ require "config/properties2log.php"; require "mqtt_functions.php"; require "events.php"; require "db_functions.php"; -require "webserver.php"; +require "webserver/webserver.php"; -logger(DEBUG, _("Loading stored devices datas"), __FILE__ . ":" . __LINE__); +logger(DEBUG, _("Loading stored devices datas from ") . $dataPath . "moha.db", __FILE__ . ":" . __LINE__); if (loadDB($devices, $dataPath . "moha.db") === false) { logger(ERROR, _("Can not load device db"), __FILE__ . ":" . __LINE__); @@ -251,6 +251,7 @@ foreach($topics as $name => $topic) // starting main loop logger(INFO, _("Starting loop"), __FILE__ . ":" . __LINE__, false); $oneshot = false; + while (true) { $client->loop(); // mqtt server loop() @@ -280,7 +281,7 @@ while (true) } if($hooksInitialized == 0) // all hooks are not initialized { - //$i = 1; + $i = 1; foreach($hooks as $hookName => $hook) { if ($hook->initialized === false) @@ -295,9 +296,9 @@ while (true) logger(DEBUG, _("All hooks initialized"), __FILE__ . ":" . __LINE__); $flagHooks = true; - }else // executed when initialization finished + }else // executed when hooks initialization finished but database init not finished { - logger(DEBUG, _("looping"), __FILE__ . ":" . __LINE__); + //logger(DEBUG, _("looping"), __FILE__ . ":" . __LINE__); } checkEvents(); diff --git a/topics_callbacks/linky2mqtt.php b/topics_callbacks/linky2mqtt.php index 5117dd8..6535a9c 100644 --- a/topics_callbacks/linky2mqtt.php +++ b/topics_callbacks/linky2mqtt.php @@ -1,25 +1,37 @@ callback = function($topic, $message) { global $topics, $logFh, $devices, $included; $topicName = $topic[0]; $friendlyName = $topic[1]; // get friendlyName - logger(INFO, sprintf(_("Incoming notification of device %s"), $topic[0], $topic[1]), __FILE__ . ":" . __LINE__); - $device = & $devices[$topic[0]]; - $payloadArray = json_decode($message->payload); - if (!isset($device[$fn])) //must not exists, but ... + logger(INFO, sprintf(_("Incoming notification of device %s"), $topicName, $fn), __FILE__ . ":" . __LINE__); + $payloadArray = json_decode($message->payload, true); + + if (!array_key_exists($fn, $device)) { - logger(LOG_WARNING, $logFh, _("init of ") . $fn, __FILE__ . ":" . __LINE__); - $device[$fn] = array(); - $device[$fn]["device"] = new device; - $device[$fn]["device"]->type = "mesure"; - $device[$fn]["device"]->ieeeAddress = $payloadArray["ADSC"]; - $indexDevices[$device[$fn]["device"]->ieeeAddress] = & $device[$fn]["device"]; + echo "initializing $fn"; + $device[$fn] = array("device" => new device); + $device = &$device[$fn]; + $device["device"]->friendlyName = $payloadArray["friendly_name"]; + $device["device"]->ieeeAddress = $payloadArray["ieeeAddress"]; + $device["device"]->type = $payloadArray["type"]; + $indexDevices[$device["device"]->ieeeAddress] = & $device["device"]; + $indexFriendlyNames[$fn] = & $device["device"]; + + }else + { + $device = &$device[$fn]; } - $device = & $device[$fn]; + unset($payloadArray["friendly_name"]); + unset($payloadArray["ieeeAddress"]); + unset($payloadArray["type"]); + + //$device = getDeviceByFriendlyname($topicName, $fn, $payloadArray, true); changeDevice($topicName, $friendlyName, $device["device"], $payloadArray); //print_r($device["device"]); } diff --git a/topics_callbacks/pws2mqtt.php b/topics_callbacks/pws2mqtt.php index d0729a3..c74e84a 100644 --- a/topics_callbacks/pws2mqtt.php +++ b/topics_callbacks/pws2mqtt.php @@ -1,43 +1,56 @@ callback = function($topic, $message) { - global $topics, $logFh, $devices, $included; - $fn = $topic[1]; // get friendlyname - logger(INFO, sprintf(_("Incoming notification of device %s => friendly name : %s"), $topic[0], $topic[1]), __FILE__ . ":" . __LINE__); - $device = & $devices[$topic[0]]; - $payloadArray = json_decode($message->payload); - - if (!isset($device[$fn])) + global $logFh, $devices, $included; + $topicName = $topic[0]; + $fn = $topic[1]; + logger(INFO, sprintf(_("Incoming notification of device %s => friendly name : %s"), $topicName, $fn), __FILE__ . ":" . __LINE__); + $device = & $devices[$topicName]; + $payloadArray = json_decode($message->payload, true); + // friendlyname + if (!array_key_exists($fn, $device)) { - logger(WARNING, $logFh, _("init of ") . $fn, __FILE__ . ":" . __LINE__); - $device[$fn] = array(); - $device[$fn]["device"] = new device; - $device[$fn]["device"]->type = $payloadArray->type; - $device[$fn]["device"]->ieeeAddress = $payloadArray->ieeeAddress; - $device[$fn]["device"]->friendlyname = $fn; - $indexDevices[$device[$fn]["device"]->ieeeAddress] = & $device[$fn]["device"]; + echo "initializing $fn"; + $device[$fn] = array("device" => new device); + $device = &$device[$fn]; + $device["device"]->friendlyName = $payloadArray["friendly_name"]; + $device["device"]->ieeeAddress = $payloadArray["ieeeAddress"]; + $device["device"]->type = $payloadArray["type"]; + $device["device"]->topic = $topicName; + $indexDevices[$device["device"]->ieeeAddress] = & $device["device"]; + $indexFriendlyNames[$fn] = & $device["device"]; + + }else + { + $device = &$device[$fn]; } - $device = & $device[$fn]; + unset($payloadArray["friendly_name"]); + unset($payloadArray["ieeeAddress"]); + unset($payloadArray["type"]); + foreach ($payloadArray as $property => $value) { $str = substr($property, -1); if ($str == "f") { $newProperty = rtrim($property, "f") . "c"; - $payloadArray->{$newProperty} = farenheit2celsius($value); + $payloadArray[$newProperty] = farenheit2celsius($value); }elseif ($str == "h") { $newProperty = substr($property, 0, -3) . "kmh"; - $payloadArray->{$newProperty} = mph2kmh($value); + $payloadArray[$newProperty] = mph2kmh($value); } if ($property == "baromin") { $newProperty = "barominmb"; - $payloadArray->{"barominmb"} = millibars($value); + $payloadArray["barominmb"] = millibars($value); } } - changeDevice($topic[0], $fn, $device["device"], $payloadArray); + //$device = getDeviceByFriendlyname($topicName, $fn, $payloadArray, true); + changeDevice($topicName, $fn, $device["device"], $payloadArray); } ?> diff --git a/topics_callbacks/zigbee2mqtt.php b/topics_callbacks/zigbee2mqtt.php index 5842d94..cb95baf 100644 --- a/topics_callbacks/zigbee2mqtt.php +++ b/topics_callbacks/zigbee2mqtt.php @@ -1,8 +1,12 @@ callback = function($topic, $message) { - global $topics, $logFh, $devices, $included; + global $topics, $devices, $included, $logFh; + if ($topic[1] == "bridge") { switch ($topic[2]) @@ -13,7 +17,7 @@ $callback = function($topic, $message) case "devices": logger(DEBUG,_("Inserting zigbee devices in DB"), __FILE__ . ":" . __LINE__); $topics[$topic[0]]->devices = json_decode($message->payload); - fwrite($logFh, var_export($topics[$topic[0]]->devices, true)); + //fwrite($logFh, var_export($topics[$topic[0]]->devices, true)); mkDevicesDB($topic[0], $topics[$topic[0]]->devices); getDevicesValues($topic[0]); break; @@ -40,36 +44,46 @@ $callback = function($topic, $message) }elseif (($topic[array_key_last($topic)]) != "get" and ($topic[array_key_last($topic)]) != "set" and $included) { $topic = explode ("/", $message->topic, 2); // get topic name + $topicName = $topic[0]; + $fn = $topic[1]; + $device = null; $fnTree = explode ("/" , $topic[1]); // get friendlyname - echo $topic[0] . " => " . $topic[1] . EOL; - //$devices[$topic[0]][$fnTree[0]]->json = json_decode($message->payload); - if ($fnTree[array_key_last($fnTree)] == "availability") + + echo $topicName . " => " . $fn . EOL; + logger(DEBUG, _("end of fnTree = ") . end($fnTree), __FILE__ . ":" . __LINE__); + $fnTreeEnd = end($fnTree); + switch($fnTreeEnd) { - unset ($fnTree[array_key_last($fnTree)]); - $payloadArray = array("availability" => $message->payload); - //TODO payload can be a json object - }else - { - $payloadArray = json_decode($message->payload); + case "l1": + case "l2": + $fnTreeEnd = "state_" . $fnTreeEnd; + case "mode": + case "contact": + case "availability": + array_pop ($fnTree); + $fn = implode("/", $fnTree); + $fn = implode("/", $fnTree); + $payloadArray = array($fnTreeEnd => $message->payload); + //TODO payl + $payloadArray = array($fnTreeEnd => $message->payload); + //TODO payload can be a json object + break; + default: + $payloadArray = json_decode($message->payload,true); } - $device = & $devices[$topic[0]]; - foreach($fnTree as $fn) + logger(DEBUG, _("friendlyname = ") . $fn, __FILE__ . ":" . __LINE__); + if ((getDeviceByFriendlyname($device, $topicName, $fn, $payloadArray, true)) === false) { - //print_r($device) ; - if (!isset($device[$fn])) //must not exists, but ... - { - logger(LOG_WARNING, $logFh, _("init of ") . $fn, __FILE__ . ":" . __LINE__); - $device[$fn] = array(); - $device[$fn]["device"] = new device; - addDevice($device[$fn], $fn, $payloadArray); - } - $device = & $device[$fn]; + logger(ERROR, sprintf(_("device with friendlyname %s not found"), $fn), __FILE__ . ":" . __LINE__); } - changeDevice($topic[0], $topic[1], $device["device"], $payloadArray); - //fwrite($logFh, print_r($msg, true)); + print_r($device); + changeDevice($topicName, $fn, $device["device"], $payloadArray); + }else + { + logger(DEBUG, _("Zigbee2mqtt doing nothing !?")); } + }; -$topics["zigbee2mqtt"] = new topic; -$topics["zigbee2mqtt"]->callback = & $callback; + ?> diff --git a/utils.php b/utils.php index 00e8d55..397e379 100644 --- a/utils.php +++ b/utils.php @@ -9,6 +9,9 @@ function bool2string($var) }elseif($var === true) { return "true"; + }elseif ($var === null) + { + return "null"; }else { return $var; @@ -72,13 +75,13 @@ function getDevice($topic, $fn) function getValue($ieeeAddress, $property) { global $indexDevices; - return $indexDevices[$ieeeAddress]->$property["value"]; + return $indexDevices[$ieeeAddress]->properties[$property]["value"]; } function setValue($fn, $property, $value) { global $indexDevices; - $indexDevices(RDC_SALON_MVMT2)->occupancy["value"] = $value; + $indexDevices[$ieeeAddress]->properties[$property]["value"] = $value; } logger(DEBUG, _("signal handling"), __FILE__ . ":" . __LINE__, false); diff --git a/webserver.php b/webserver.php deleted file mode 100644 index 30cce41..0000000 --- a/webserver.php +++ /dev/null @@ -1,318 +0,0 @@ -' . EOL . '' . EOL . '' . EOL . '' . EOL . 'Moha' . EOL . '' . $text . ""; - - stream_socket_sendto($socket, $response); -} - -function webListTopics() -{ - global $topics; - logger(DEBUG, _("webListTopics function")); - $response = ""; - foreach ($topics as $name => $topic) - { - $response .= '' . $name ."
"; - } - return $response; -} - -function webBrowse($socket, $argList) -{ - global $topics, $devices; - logger(DEBUG, _("Generic response to choose device and property"), __FILE__ . ":" . __LINE__); - //$response = "
" . _("unknown command") . ""; - $response = ""; - $flag = false; - if (array_key_exists("topic", $argList)) - { - if (array_key_exists($argList["topic"], $topics)) - { - logger(DEBUG, _("Topic exists") , __FILE__ . ":" . __LINE__); - $topicRef = ' $value) - { - if ($key != "devicarray_key_existse" and is_array($value)) - { - //print_r($value); - if (array_key_exists("value", $value)) - { - $response .= $key . ' = ' . bool2string($value["value"]) . "
"; - }else - { - $response .= $key . ' = ' . bool2string($value) . "
"; - } - } - } - }else - { - foreach($device as $key => $value) - { - $response .= $topicRef . "&fn=" . $fn . "/" . $key . '">' . $key . "

"; - } - } - logger(DEBUG, _("response: ") . EOL . $response , __FILE__ . ":" . __LINE__); - - //htmlSend($socket, $response); - }else - { - foreach($devices[$argList["topic"]] as $key => $value) - { - print "key = " . print_r($key, true) . " value = " . print_r($value, true) . EOLR; - logger(DEBUG, _("devices de topic: ") . $key , __FILE__ . ":" . __LINE__); - $response .= $topicRef . "&fn=" . $key . '">' . $key . "
"; - logger(DEBUG, _("response: ") . $response , __FILE__ . ":" . __LINE__); - } - } - }else - { - $response = webListTopics(); - } - }else - { - $response = webListTopics(); - } - htmlSend($socket, $response); -} - -function webDashboard($socket, $n = 0) -{ - global $dashboards, $indexDevices; - logger(DEBUG, _("webDashboard function")); - $response = ""; - if(array_key_exists($n, $dashboards)) - { - foreach ($dashboards[$n] as $ieeeAddress => $property) - { - logger(DEBUG, _($indexDevices[$ieeeAddress]->friendlyName . " => " . bool2string($indexDevices[$ieeeAddress]->$property["value"]))); - $response .= $indexDevices[$ieeeAddress]->friendlyName . " => " . bool2string($indexDevices[$ieeeAddress]->$property["value"]) . "
"; - } - }else - { - $response = _("dashboard not found"); - } - - htmlSend($socket, $response); -} - -function askWebServer($read) -{ - global $topics, $indexDevices, $devices; - $array = array(); - $argList =array(); - - if ( stream_select( $read, $array, $array, 0 )) - { - logger(DEBUG, _("socket ready to read"), __FILE__ . ":" . __LINE__); - $spawn = stream_socket_accept($read[0]); - if ($spawn !== false) - { - logger(DEBUG, _("socket accepted"), __FILE__ . ":" . __LINE__); - $input = fgets($spawn, 4096); - logger(DEBUG, $input, __FILE__ . ":" . __LINE__); - $input = substr($input,5); - $input = explode(" ", $input); // suppress text - if (!empty($input[0])) - { - $argTmp = explode("&", urldecode($input[0])); - foreach($argTmp as $tmp) - { - logger(DEBUG, $tmp, __FILE__ . ":" . __LINE__); - if(strpos($tmp, "=") === false) - { - logger(DEBUG, _("no ="), __FILE__ . ":" . __LINE__); - $argList["cmd"] = trim($tmp); - }else - { - $argList[trim(strchr($tmp, "=", true))] = trim(substr(strchr($tmp, "="), 1)); - } - } - logger(DEBUG, print_r($argList, true), __FILE__ . ":" . __LINE__); - - /*if (array_key_exists("browse", $argList)) - { - logger(DEBUG, _("Browsing")); - webBrowse($spawn, $argList); - return true; - }elseif(array_key_exists("dashboard", $argList)) - { - webDashboard($spawn, $argList["dashboard"]); - return true; - }*/ - if(array_key_exists("cmd", $argList)) - { - $command = strtolower($argList["cmd"]); - logger(DEBUG, _("command is ") . $command, __FILE__ . ":" . __LINE__); - switch($command) - { - case "dashboard": - webDashboard($spawn, $argList["dashboard"]); - break; - case "browse": - logger(DEBUG, _("Browsing"), __FILE__ . ":" . __LINE__); - webBrowse($spawn, $argList); - //return true; - break; - case "get": - logger(DEBUG, _("GET reached"), __FILE__ . ":" . __LINE__); - if(!array_key_exists("topic", $argList) or !array_key_exists("fn", $argList) or !array_key_exists("property", $argList)) - { - $response = "GET: " . _("no parameters passed, need topic, fn and property"); - }else - { - if (($device = getDevice($argList["topic"], $argList["fn"])) === false) - { - htmlSend($spawn, sprintf(_('"%s" or "%s" does not exists'), $argList["topic"], $argList["fn"])); - return false; - } - $property = $argList["property"]; - $response = "GET: " . bool2string($device->$property["value"]); - } - htmlSend($spawn, $response); - break; - case "set": - logger(DEBUG, _("SET reached"), __FILE__ . ":" . __LINE__); - if(!array_key_exists("topic", $argList) or !array_key_exists("fn", $argList) or !array_key_exists("property", $argList) or !array_key_exists("value", $argList)) - { - $response = "SET: " . _("no parameters passed, need topic, fn, property and value") . "passed"; - htmlSend($spawn, $response); - }else - { - $response = "setting property " . $argList["property"] . " of " . $argList["fn"] . " to value: " . $argList["value"]; - htmlSend($spawn, $response); - $payload = array($argList["property"] => $argList["value"]); - publish(Z2M . "/" . $argList["fn"], $payload); - } - - break; - case "dump": - case "print": - logger(DEBUG, $command . _(" reached"), __FILE__ . ":" . __LINE__); - if (array_key_exists($argList["object"], $GLOBALS)) - { - $var = $GLOBALS[$argList["object"]]; - - if (isset($argList["topic"])) - { - $topic = $argList["topic"]; - } - if (isset($argList["address"])) - { - $var = $var[$argList["address"]]; - }elseif (isset($argList["fn"])) - { - if(!empty($topic)) - { - $var = getDevice($topic, $argList["fn"]); - }else - { - $str = _("topic is not defining: add &topic=\nThese topics are availables: "); - foreach($topics as $key => $value) - { - $str .= $key . EOL; - } - logger(ERROR, $str, __FILE__ . ":" . __LINE__); - } - } - $error = error_get_last(); - if($error !== null) - { - $response = $error["message"] . " file: " . $error["file"] . " line: " . $error["line"]; - } - if ($command === "print") - { - $response = "
" . nl2br(print_r($var, true)) . "
";
-								}elseif($command === "dump")
-								{
-									$response = "Dump" . EOL;
-									$response .= "
" . nl2br(var_export($var, true)) . "
";
-								}
-							}else
-							{
-								$response = _("Object do not exists");
-							}
-
-							htmlSend($spawn, $response);
-							break;
-						case "notify":
-							logger(DEBUG, $command . _(" reached"), __FILE__ . ":" . __LINE__);
-							if (!array_key_exists("topic", $argList) or !array_key_exists("fn", $argList) or !array_key_exists("property", $argList) or !array_key_exists("condition", $argList) or !array_key_exists("value", $argList))
-							{
-								$response = _("Error: With 'notify' command, you need 4 parameters: topic, fn, property, condition, value");
-								htmlSend($spawn, $response);
-							}else
-							{
-								$response = _("notify command have been set");
-								$monitored[] = new watch($argList["topic"], $argList["fn"], $argList["property"], $argList["condition"], $argList["value"]);
-								htmlSend($spawn, $response);
-							}
-							logger(DEBUG, print_r($monitored, true), __FILE__ . ":" . __LINE__);
-							break;
-						default:
-							webBrowse($spawn, $argList);
-					}
-				}else
-				{
-					webDashboard($spawn);
-				}
-			}else
-			{
-				webDashboard($spawn);
-			}
-		}
-	}
-}
-?>
diff --git a/webserver/cmd_functions.php b/webserver/cmd_functions.php
new file mode 100644
index 0000000..7de042d
--- /dev/null
+++ b/webserver/cmd_functions.php
@@ -0,0 +1,238 @@
+ $property)
+		{
+			$value = $indexDevices[$ieeeAddress]->properties[$property]["value"];
+			if ($value === null)
+			{
+				$value ="null";
+			}
+			logger(DEBUG, _($indexDevices[$ieeeAddress]->friendlyName . " => " . bool2string($value)));
+			$response .= $indexDevices[$ieeeAddress]->friendlyName . " => " . bool2string($value) . "
"; + } + }else + { + $response = _("dashboard not found"); + } + + htmlSend($socket, $response); +} + +function webBrowse($socket, $argList) +{ + global $topics, $devices; + logger(DEBUG, _("Generic response to choose device and property"), __FILE__ . ":" . __LINE__); + //$response = "
" . _("unknown command") . ""; + $response = ""; + $flag = false; + $tab = ""; + if (array_key_exists("topic", $argList)) + { + if (array_key_exists($argList["topic"], $topics)) + { + logger(DEBUG, _("Topic exists") , __FILE__ . ":" . __LINE__); + $topicRef = 'properties as $key => $value) + { + $response .= $key . "
"; + $response .= $tab . "[
"; + echo memory_get_usage(); + //$response = value($key, $value, $response); + iterateProperty($key, $value, $response, $tab); + $response .= $tab . "]
"; + } + /*foreach($device->properties as $key => $value) + { + $response = value($key, $value, $response); + }*/ + }else + { + foreach($device as $key => $value) + { + $response .= $topicRef . htmlentities("&fn=" . $fn . "/" . $key) . '">' . $key . "

\n"; + } + } + logger(DEBUG, _("response: ") . EOL . $response , __FILE__ . ":" . __LINE__); + + //htmlSend($socket, $response); + }else + { + foreach($devices[$argList["topic"]] as $key => $value) + { + print "key = " . print_r($key, true) . " value = " . print_r($value, true) . EOLR; + logger(DEBUG, _("devices de topic: ") . $key , __FILE__ . ":" . __LINE__); + $response .= $topicRef . htmlentities("&fn=" . $key) . '">' . $key . "
"; + logger(DEBUG, _("response: ") . $response , __FILE__ . ":" . __LINE__); + } + } + }else + { + $response = webListTopics(); + } + }else + { + $response = webListTopics(); + } + htmlSend($socket, $response); +} + +function iterateProperty($property, $value, &$response, $tab="") +{ + $tab .= "   "; + if (is_array($value) or is_object($value)) + { + logger(DEBUG, _("is object or array"), __FILE__ . ":" . __LINE__ ); + foreach($value as $key => $value2) + { + + logger(DEBUG, $key, __FILE__ . ":" . __LINE__ ); + iterateProperty($key, $value2, $response, $tab); + + } + }else + { + $response .= $tab . $property . ' = ' . bool2string($value) . "
";//value($property, $value, ""); + } +} + +function webListTopics() +{ + global $topics; + logger(DEBUG, _("webListTopics function")); + $response = ""; + foreach ($topics as $name => $topic) + { + $response .= '' . $name ."
"; + } + return $response; +} + +function webGet($argList) +{ + if(!array_key_exists("topic", $argList) or !array_key_exists("fn", $argList) or !array_key_exists("property", $argList)) + { + $response = "GET: " . _("no parameters passed, need topic, fn and property"); + }else + { + if (($device = getDevice($argList["topic"], $argList["fn"])) === false) + { + $response = sprintf(_('"%s" or "%s" does not exists'), $argList["topic"], $argList["fn"]); + }else + { + $property = $argList["property"]; + $response = "GET: " . bool2string($device->$property["value"]); + } + } + return $response; +} + +function webSet($argList) +{ + if(!array_key_exists("topic", $argList) or !array_key_exists("fn", $argList) or !array_key_exists("property", $argList) or !array_key_exists("value", $argList)) + { + $response = "SET: " . _("no parameters passed, need topic, fn, property and value") . "passed"; + + }else + { + $response = "setting property " . $argList["property"] . " of " . $argList["fn"] . " to value: " . $argList["value"]; + $payload = array($argList["property"] => $argList["value"]); + publish(Z2M . "/" . $argList["fn"], $payload); + } + return $response; +} + +function webPrint($argList, $command) +{ + global $GLOBALS, $topics; + if (array_key_exists($argList["object"], $GLOBALS)) + { + $var = $GLOBALS[$argList["object"]]; + + if (isset($argList["topic"])) + { + $topic = $argList["topic"]; + } + if (isset($argList["address"])) + { + $var = $var[$argList["address"]]; + }elseif (isset($argList["fn"])) + { + if(!empty($topic)) + { + $var = getDevice($topic, $argList["fn"]); + }else + { + $str = _("topic is not defining: add &topic=\nThese topics are availables: "); + foreach($topics as $key => $value) + { + $str .= $key . EOL; + } + logger(ERROR, $str, __FILE__ . ":" . __LINE__); + } + } + $error = error_get_last(); + if($error !== null) + { + $response = $error["message"] . " file: " . $error["file"] . " line: " . $error["line"]; + } + if ($command === "print") + { + $response = "
" . nl2br(print_r($var, true)) . "
";
+		}elseif($command === "dump")
+		{
+			$response = "Dump" . EOL;
+			$response .= "
" . nl2br(var_export($var, true)) . "
";
+		}
+	}else
+	{
+		$response = _("Object do not exists");
+	}
+	return $response;
+}
+
+function webNotify($argList)
+{
+	if (!array_key_exists("topic", $argList) or !array_key_exists("fn", $argList) or !array_key_exists("property", $argList) or !array_key_exists("condition", $argList) or !array_key_exists("value", $argList))
+	{
+		$response = _("Error: With 'notify' command, you need 4 parameters: topic, fn, property, condition, value");
+	}else
+	{
+		$response = _("notify command have been set");
+		$monitored[] = new watch($argList["topic"], $argList["fn"], $argList["property"], $argList["condition"], $argList["value"]);
+	}
+}
+?>
diff --git a/webserver/webserver.php b/webserver/webserver.php
new file mode 100644
index 0000000..890fba6
--- /dev/null
+++ b/webserver/webserver.php
@@ -0,0 +1,113 @@
+' . EOL . '' . EOL . '' . EOL . '' . EOL . 'Moha' . EOL . '' . $text . "";
+
+	stream_socket_sendto($socket, $response);
+}
+
+function askWebServer($read)
+{
+	global $topics, $indexDevices, $devices;
+	$array = array();
+	$argList =array();
+	//logger(DEBUG, _("askWebserver function starting"), __FILE__ . ":" . __LINE__);
+	if ( stream_select( $read, $array, $array, 0 ))
+	{
+		logger(DEBUG, _("socket ready to read"), __FILE__ . ":" . __LINE__);
+		$spawn = stream_socket_accept($read[0]);
+		if ($spawn !== false)
+		{
+			logger(DEBUG, _("socket accepted"), __FILE__ . ":" . __LINE__);
+			$input = fgets($spawn, 4096);
+			logger(DEBUG, $input, __FILE__ . ":" . __LINE__);
+			$input = substr($input,5);
+			$input = explode(" ", $input);			// suppress text
+			if (!empty($input[0]))
+			{
+				$argTmp = explode("&", urldecode($input[0]));
+				foreach($argTmp as $tmp)
+				{
+					logger(DEBUG, $tmp, __FILE__ . ":" . __LINE__);
+					if(strpos($tmp, "=") === false)
+					{
+						logger(DEBUG, _("no ="), __FILE__ . ":" . __LINE__);
+						$argList["cmd"] = trim($tmp);
+					}else
+					{
+						$argList[trim(strchr($tmp, "=", true))] = trim(substr(strchr($tmp, "="), 1));
+					}
+				}
+				logger(DEBUG, print_r($argList, true), __FILE__ . ":" . __LINE__);
+				if(array_key_exists("cmd", $argList))
+				{
+					$command = strtolower($argList["cmd"]);
+					logger(DEBUG, _("command is ") . $command, __FILE__ . ":" . __LINE__);
+					switch($command)
+					{
+						case "dashboard":
+							webDashboard($spawn, $argList["dashboard"]);
+							break;
+						case "browse":
+							logger(DEBUG, _("Browsing"), __FILE__ . ":" . __LINE__);
+							webBrowse($spawn, $argList);
+							//return true;
+							break;
+						case "get":
+							logger(DEBUG, _("GET reached"), __FILE__ . ":" . __LINE__);
+							htmlSend($spawn, webGet($argList));
+							break;
+						case "set":
+							logger(DEBUG, _("SET reached"), __FILE__ . ":" . __LINE__);
+							htmlSend($spawn, webSet($argList));
+							break;
+						case "dump":
+						case "print":
+							logger(DEBUG, $command . _(" reached"), __FILE__ . ":" . __LINE__);
+							htmlSend($spawn, webPrint($argList, $command));
+							break;
+						case "notify":
+							logger(DEBUG, $command . _(" reached"), __FILE__ . ":" . __LINE__);
+							htmlSend($spawn, webNotify($argList));
+							logger(DEBUG, print_r($monitored, true), __FILE__ . ":" . __LINE__);
+							break;
+						default:
+							webBrowse($spawn, $argList);
+					}
+				}else
+				{
+					webDashboard($spawn);
+				}
+			}else
+			{
+				webDashboard($spawn);
+			}
+		}
+	}
+}
+?>
diff --git a/www/index.php b/www/index.php
index 3f39399..9327cea 100644
--- a/www/index.php
+++ b/www/index.php
@@ -1,7 +1,6 @@