=1s) as well as individual signal decoding (fast operation 0.1s or "on change") // This solution do not contains Direct Events (Command Editor) it must be copied from external "Advanced Event Creators" for individual systems. // // Please refer to comments and descriptions in the file // we wan't make this constants global for individual access from outside class $EHOUSE_PRO_MAX_ADC=128; //Analogue to digital converters - measurement inputs $EHOUSE_PRO_MAX_INPUTS=256; //digital inputs $EHOUSE_PRO_MAX_OUTPUTS=256; //digital outputs $EHOUSE_PRO_MAX_DIMMERS=256; //PWM DIMMERS //this binary status addresses/offsets can be used for individual query of single bit signals with eH(start_address,$nr), Sat(start_address,$nr) //or executed directly with Get*Status($nr); $EHOUSE_PRO_ADC_ADDR=6; //ADCs address $EHOUSE_PRO_OUTPUTS_ADDR=$EHOUSE_PRO_ADC_ADDR+2*$EHOUSE_PRO_MAX_ADC; //digital outputs $EHOUSE_PRO_INPUTS_ADDR=$EHOUSE_PRO_OUTPUTS_ADDR+($EHOUSE_PRO_MAX_OUTPUTS/8); //inputs $EHOUSE_PRO_HORN_ADDR=$EHOUSE_PRO_INPUTS_ADDR+($EHOUSE_PRO_MAX_INPUTS/8); //horn $EHOUSE_PRO_WARNING_ADDR=$EHOUSE_PRO_HORN_ADDR+($EHOUSE_PRO_MAX_INPUTS/8); //warning $EHOUSE_PRO_MONITORING_ADDR=$EHOUSE_PRO_WARNING_ADDR+($EHOUSE_PRO_MAX_INPUTS/8); //monitoring $EHOUSE_PRO_SILENT_ADDR=$EHOUSE_PRO_MONITORING_ADDR+($EHOUSE_PRO_MAX_INPUTS/8); //silent $EHOUSE_PRO_EARLYWARNING_ADDR=$EHOUSE_PRO_SILENT_ADDR+($EHOUSE_PRO_MAX_INPUTS/8); //early warning $EHOUSE_PRO_SMS_ADDR=$EHOUSE_PRO_EARLYWARNING_ADDR+($EHOUSE_PRO_MAX_INPUTS/8); //sms $EHOUSE_PRO_ALARM_ADDR=$EHOUSE_PRO_SMS_ADDR+($EHOUSE_PRO_MAX_INPUTS/8); //alarm $EHOUSE_PRO_DIMMER_ADDR=$EHOUSE_PRO_ALARM_ADDR+($EHOUSE_PRO_MAX_INPUTS/8); //dimmer $EHOUSE_PRO_PROGRAM_ADDR=$EHOUSE_PRO_DIMMER_ADDR+($EHOUSE_PRO_MAX_DIMMERS); //program $EHOUSE_PRO_ADCPROGRAM_ADDR=$EHOUSE_PRO_PROGRAM_ADDR+(1*4); //adcprogram $EHOUSE_PRO_ROLLERPROGRAM_ADDR=$EHOUSE_PRO_PROGRAM_ADDR+(2*4); //rollers programs $EHOUSE_PRO_SECUZONE_ADDR=$EHOUSE_PRO_PROGRAM_ADDR+(3*4); //zone $EHOUSE_PRO_HWOUTS_ADDR=$EHOUSE_PRO_PROGRAM_ADDR+(4*4); //hardware outs - alarm, warning, monitoring, early warning, horn, silent etc $OFFSET_UNKNOWN=$EHOUSE_PRO_HWOUTS_ADDR+4; //unknown offset $SATEL_SECU_ZONE_ADDR= $OFFSET_UNKNOWN+4; //hardware outs - alarm, warning, monitoring, early warning, horn, silent etc $SATEL_PROGRAM_NR_ADDR=$SATEL_SECU_ZONE_ADDR+1; $SATEL_ROLLER_PROGRAM_ADDR=$SATEL_PROGRAM_NR_ADDR+1; $SATEL_HW_STATES_ADDR=$SATEL_ROLLER_PROGRAM_ADDR+1; $SATEL_ADC_PROGRAM_NR_ADDR=$SATEL_HW_STATES_ADDR+1; $SATEL_E_ADDR=$SATEL_ADC_PROGRAM_NR_ADDR+1; $SATEL_F_ADDR=$SATEL_E_ADDR+1; $SATEL_G_ADDR=$SATEL_F_ADDR+1; $SATEL_H_ADDR=$SATEL_G_ADDR+1; $SATEL_I_ADDR=$SATEL_H_ADDR+1; $SATEL_OUTS_ADDR=$SATEL_I_ADDR+1; $SATEL_INPUTS_ADDR=$SATEL_OUTS_ADDR+32; $SATEL_INPUTS_ALARM_ADDR=$SATEL_INPUTS_ADDR+32; $SATEL_INPUTS_ALARM_MEMORY_ADDR=$SATEL_INPUTS_ALARM_ADDR+32; $SATEL_TAMPER_ADDR=$SATEL_INPUTS_ALARM_MEMORY_ADDR+32; $SATEL_TAMPER_ALARM_ADDR=$SATEL_TAMPER_ADDR+32; $SATEL_TAMPER_ALARM_MEMORY_ADDR=$SATEL_TAMPER_ALARM_ADDR+32; $SATEL_INPUTS_BYPAS_ADDR=$SATEL_TAMPER_ALARM_MEMORY_ADDR+32; $SATEL_INPUTS_ISOLATE_ADDR=$SATEL_INPUTS_BYPAS_ADDR+32; $SATEL_INPUTS_NO_VIOLATION_ADDR=$SATEL_INPUTS_ISOLATE_ADDR+32; $SATEL_INPUTS_LONG_VIOLATION_ADDR=$SATEL_INPUTS_NO_VIOLATION_ADDR+32; $SATEL_INPUTS_MASKED_ADDR=$SATEL_INPUTS_LONG_VIOLATION_ADDR+32; $SATEL_INPUTS_MASKED_MEM_ADDR=$SATEL_INPUTS_MASKED_ADDR+32; $EHOUSE_PRO_FUTURE_ADDR=$SATEL_INPUTS_MASKED_MEM_ADDR+32; class eHouseProC { // Functions to be run //function __construct($str);//validate eHouse PRO hex coded status + load to $TextStatus and convert to binary (array of integers) $Bin //public function eH($TempOffset,$k);//get bit field value for specified eHouse signal type $k index 0..n, $TempOffset - first address of the signal *_ADDR //public function Sat($TempOffset,$k);//get bit field value for Satel specified signal type $k index 0..n, $TempOffset - first address of the signal *_ADDR //public function GetProPG($TempOffset);//get 4 bit integrer value -$TempOffset - first address of the signal *_ADDR //public function hexi(); //convert $TextStatus to binary Status $Bin //function Display();//Display Decoded status - for debuging only //function DecodeEhousePROStatus();//Decode full eHousePro+Satel Status (when no ultra-fast operation is required) into all class fields/arrays ////FAST USAGE function without performing whole eHousePRO+SATEL status - only indvidual items //public function eH($TempOffset,$k);//fast usage for eHouse.PRO without storing data to arrays eg $o11=eH($EHOUSE_PRO_OUTPUTS_ADDR,10); //state of 11th binary output //public function Sat($TempOffset,$k);//fast usage for Satel without storing data to arrays eg $iA9=Sat($SATEL_INPUTS_ALARM_ADDR,8); //state of 9th binary input in alarm state //public function GetInStatus($nr); //0...max //public function GetOutStatus($nr); //0...max //public function GetHornStatus($nr); //0...max //public function GetEarlyStatus($nr); //0...max //public function GetWarningStatus($nr); //0...max //public function GetMonitoringStatus($nr); //0...max //public function GetSMSStatus($nr); //0...max //public function GetAlarmStatus($nr); //0...max //public function GetQuietStatus($nr); //0...max //public function GetDimmerStatus($nr); //0...max //public function GetADCStatus($nr); //0...max //public ExecCommand($cmd);//prints (echo) direct command/event to be captured by eHouse.PRO Server // please copy-paste direct event from external event creators for desired eHouse systems public $ProcessChangedOnly=1; //Only process new data public $WasChanged=0; //data changed flag public $TextStatus; //captured hex decoded string of status public $results; //to store display out for written to file (Display function() public $Bin=array(0,0,0); //status converted to array of integers public $SATEL_ENABLED=0; //we can limit some processing if not hardware connected public $ALARM_ENABLED=1; public $DIMMERS_ENABLED=1; public $ADCS_ENABLED=1; public $DisplayToFileOnly=1; //do not echo information only to the files public $HALF_ADC=1; //if 1 all inputs taken if 2 => half (EHOUSE_PRO_MAX_ADC/HALF_ADC) public $HALF_INPUTS=1; //if 1 all inputs taken if 2 => half (EHOUSE_PRO_MAX_INPUTS/HALF_INPUTS) public $HALF_OUTPUTS=1; //if 1 all inputs taken if 2 => half (EHOUSE_PRO_MAX_OUTPUTS/HALF_OUTPUTS) public $HALF_DIMMERS=1; //if 1 all dimmers taken if 2 => half (EHOUSE_PRO_MAX_DIMMERS/HALF_DIMMERS) public $StatusReceived=0; //flag that status was received public $StatusDecoded=0; //set flag that valid eHouse.PRO status received and decoded // status fields of eHouse PRO Server + Satel public $AdrH=0; //eHouse PRO address 192.168.AdrH.AdrL public $AdrL=0; public $adc=array(128); //ADC 2B fields public $out=array(256); //Binary Optputs public $in=array(256); //Binary Inputs public $Horn=array(256); //Binary Inputs which activate Horn Output in current security zone public $Warning=array(256); //Binary Inputs which activate Warning Light Output in current security zone public $Monitoring=array(256); //Binary Inputs which activate Monitoring Radio-Line Output in current security zone public $Silent=array(256); //Binary Inputs which activate Silent/Quiet Alarm Output in current security zone public $EarlyWarning=array(256);//Binary Inputs which activate EarlyWarning Output in current security zone public $SMS=array(256); //Binary Inputs which activate SMS notifications in current security zone public $Alarm=array(256); //Binary Inputs which activate Alarm Signal in current security zone public $Dimmer=array(128); //Dimmers 1B results (0..100%) public $ProgramNr; //4B - current program/scene for Outputs public $AdcProgramNr; //4B - current Regulation Program for ADCs public $RollerProgram; //4B - current Drives Program for servos, gates, Doprs, windows public $SecuZone; //4B - current Security Zone public $HWStates; //4B - Alarm outputs status (Horn, Warning, Silent, EarlyWarning, Monitoring...) //instead off Future[180] public $SatelSecuZone; //current security zone public $SatelProgramNr; public $SatelRollerProgram; public $SatelHWStates; public $SatelAdcProgramNr; public $SatelE; public $SatelF; public $SatelG; public $SatelH; public $SatelI; public $SatelOutputs=array(256); //satel output states public $SatelInputs=array(256); //satel input states public $SatelInputsAlarm=array(256); //satel inputs violation public $SatelInputsAlarmMemory=array(256); //satel inputs ignore public $SatelTamper=array(256); //satel input states public $SatelTamperAlarm=array(256); //satel inputs violation public $SatelTamperAlarmMemory=array(256); //satel inputs violation public $SatelInputsBypas=array(256); //satel inputs ignore until clear alarm public $SatelInputsIsolate=array(256); // isolate input untill manual unbypas public $SatelNoViolationTrouble=array(256); public $SatelLongViolationTrouble=array(256); public $SatelInputsMasked=array(256); public $SatelInputsMaskedMemory=array(256); public $Future=array(170); //////////////////////////////////////////////////////////////////////////////// public function eH($TempOffset,$k) //return individual bitwise status value of eHouse.PRO signal { $d=intdiv($k,8); return ((($this->Bin[$TempOffset+$d]>>($k%8))&0x01)); } //////////////////////////////////////////////////////////////////////////////// public function Sat($TempOffset,$k) //return individual bitwise status values of Satel signal { $ii=$TempOffset+intdiv($k,8); { if (($this->Bin[$ii]&(1<<($k%8)))) { return 1; } else { return 0; } } } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //get int32 value (Program) public function GetProPG($adr) { $i=(int)$this->Bin[0+$adr+3]; $i=$i<<8; $i=$i|(int)$this->Bin[0+$adr+2]; $i=$i<<8; $i=$i|(int)$this->Bin[0+$adr+1]; $i=$i<<8; $i=$i|(int)$this->Bin[0+$adr+0]; return $i; } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //convert hex string to binary array public function hexi() { $str=$this->TextStatus; $in=array(0,0,0); $k=0; for ($i=0;$iBin=$in; } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// public function e($str) { $this->results.=$str; if (!$this->DisplayToFileOnly) {echo $str;} } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //Get*Status() functions for geting status directly from binary array (without conversion) //get input state public function GetInStatus($nr) //0...max { global $EHOUSE_PRO_INPUTS_ADDR; return $this->eH($EHOUSE_PRO_INPUTS_ADDR,$nr); } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //get output state public function GetOutStatus($nr) //0...max { global $EHOUSE_PRO_OUTPUTS_ADDR; return $this->eH($EHOUSE_PRO_OUTPUTS_ADDR,$nr); } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //get inputs activated horn/siren output public function GetHornStatus($nr) //0...max { global $EHOUSE_PRO_HORN_ADDR; return $this->eH($EHOUSE_PRO_HORN_ADDR,$nr); } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //get inputs activated early warning output public function GetEarlyStatus($nr) //0...max { global $EHOUSE_PRO_EARLYWARNING_ADDR; return $this->eH($EHOUSE_PRO_EARLYWARNING_ADDR,$nr); } /////////////////////////////////////////////////////////////////////////////// //get inputs activated warning output public function GetWarningStatus($nr) //0...max { global $EHOUSE_PRO_WARNING_ADDR; return $this->eH($EHOUSE_PRO_WARNING_ADDR,$nr); } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //get inputs activated monitoring output public function GetMonitoringStatus($nr) //0...max { global $EHOUSE_PRO_MONITORING_ADDR; return $this->eH($EHOUSE_PRO_MONITORING_ADDR,$nr); } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //get inputs activated sms notifications public function GetSMSStatus($nr) //0...max { global $EHOUSE_PRO_SMS_ADDR; return $this->eH($EHOUSE_PRO_SMS_ADDR,$nr); } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //get inputs activated alarm signal public function GetAlarmStatus($nr) //0...max { global $EHOUSE_PRO_ALARM_ADDR; return $this->eH($EHOUSE_PRO_ALARM_ADDR,$nr); } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //get inputs activated Quiet/Silent Alarm output public function GetQuietStatus($nr) //0...max { global $EHOUSE_PRO_SILENT_ADDR; return $this->eH($EHOUSE_PRO_SILENT_ADDR,$nr); } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// public function GetDimmerStatus($nr) //0...max { global $EHOUSE_PRO_DIMMER_ADDR; return (($this->Bin[$EHOUSE_PRO_DIMMER_ADDR+$nr]&0xff)/0xff)*100; } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //get adc measuremnts public function GetADCStatus($nr) //0...max { global $EHOUSE_PRO_ADC_ADDR; $fw=0.0; $temppp+=(($this->Bin[$EHOUSE_PRO_ADC_ADDR+$nr * 2 ]&0xff) ); if ($temppp<0) {$temppp+=256;} $temppp+=(($this->Bin[$EHOUSE_PRO_ADC_ADDR+$nr * 2 + 1]&0xff) << 8); return ((float)$temppp)/10; } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /* copy paste template * public function GetHornStatus($nr) //0...max { global $EHOUSE_PRO_MAX_ADC,$EHOUSE_PRO_MAX_INPUTS, $EHOUSE_PRO_MAX_OUTPUTS,$EHOUSE_PRO_MAX_DIMMERS, $EHOUSE_PRO_ADC_ADDR,$EHOUSE_PRO_OUTPUTS_ADDR,$EHOUSE_PRO_INPUTS_ADDR, $EHOUSE_PRO_HORN_ADDR, $EHOUSE_PRO_WARNING_ADDR, $EHOUSE_PRO_MONITORING_ADDR, $EHOUSE_PRO_SILENT_ADDR, $EHOUSE_PRO_EARLYWARNING_ADDR, $EHOUSE_PRO_SMS_ADDR, $EHOUSE_PRO_ALARM_ADDR, $EHOUSE_PRO_DIMMER_ADDR, $EHOUSE_PRO_PROGRAM_ADDR, $EHOUSE_PRO_ADCPROGRAM_ADDR, $EHOUSE_PRO_ROLLERPROGRAM_ADDR, $EHOUSE_PRO_SECUZONE_ADDR, $EHOUSE_PRO_HWOUTS_ADDR, $OFFSET_UNKNOWN, $SATEL_SECU_ZONE_ADDR, $SATEL_PROGRAM_NR_ADDR, $SATEL_ROLLER_PROGRAM_ADDR, $SATEL_HW_STATES_ADDR, $SATEL_ADC_PROGRAM_NR_ADDR, $SATEL_E_ADDR, $SATEL_F_ADDR, $SATEL_G_ADDR, $SATEL_H_ADDR, $SATEL_I_ADDR, $SATEL_OUTS_ADDR, $SATEL_INPUTS_ADDR, $SATEL_INPUTS_ALARM_ADDR, $SATEL_INPUTS_ALARM_MEMORY_ADDR, $SATEL_TAMPER_ADDR, $SATEL_TAMPER_ALARM_ADDR, $SATEL_TAMPER_ALARM_MEMORY_ADDR, $SATEL_INPUTS_BYPAS_ADDR, $SATEL_INPUTS_ISOLATE_ADDR, $SATEL_INPUTS_NO_VIOLATION_ADDR, $SATEL_INPUTS_LONG_VIOLATION_ADDR, $SATEL_INPUTS_MASKED_ADDR, $SATEL_INPUTS_MASKED_MEM_ADDR, $EHOUSE_PRO_FUTURE_ADDR; return $this->eH($EHOUSE_PRO_HORN_ADDR,$nr); }*/ ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // For debug only - manual execution (display all decoded data and store to the file public function Display() { global $EHOUSE_PRO_MAX_ADC,$EHOUSE_PRO_MAX_INPUTS, $EHOUSE_PRO_MAX_OUTPUTS,$EHOUSE_PRO_MAX_DIMMERS; if (($this->ProcessChangedOnly>0) && ($this->WasChanged===0)) {return;} $this->e("Address: 192.168.".$this->AdrH.".".$this->AdrL." Size:".(strlen($this->TextStatus)/2) ."\r\n"); if (!$this->StatusDecoded) {$this->DecodeEhousePROStatus();} if ($this->ADCS_ENABLED) { for ($i=0;$i<$EHOUSE_PRO_MAX_ADC/$this->HALF_ADC;$i++) {$this->e("a$i=" . $this->adc[$i] ."\t");} $this->e("\r\n"); } for ($i=0;$i<$EHOUSE_PRO_MAX_OUTPUTS/$this->HALF_OUTPUTS;$i++) {$this->e("o$i=" . $this->out[$i] ."\t");} $this->e("\r\n"); for ($i=0;$i<$EHOUSE_PRO_MAX_INPUTS/$this->HALF_INPUTS;$i++) {$this->e("i$i=" . $this->in[$i] ."\t");} $this->e("\r\n"); if ($this->ALARM_ENABLED) { for ($i=0;$i<$EHOUSE_PRO_MAX_INPUTS/$this->HALF_INPUTS;$i++) {$this->e("H$i=" . $this->Horn[$i]."\t");} $this->e("\r\n\r\n"); for ($i=0;$i<$EHOUSE_PRO_MAX_INPUTS/$this->HALF_INPUTS;$i++) {$this->e("W$i=" . $this->Warning[$i]."\t");} $this->e("\r\n\r\n"); for ($i=0;$i<$EHOUSE_PRO_MAX_INPUTS/$this->HALF_INPUTS;$i++) {$this->e("M$i=" . $this->Monitoring[$i]."\t");} $this->e("\r\n\r\n"); for ($i=0;$i<$EHOUSE_PRO_MAX_INPUTS/$this->HALF_INPUTS;$i++) {$this->e("Q$i=" . $this->Silent[$i]."\t");} $this->e("\r\n\r\n"); for ($i=0;$i<$EHOUSE_PRO_MAX_INPUTS/$this->HALF_INPUTS;$i++) {$this->e("E$i=" . $this->EarlyWarning[$i]."\t");} $this->e("\r\n\r\n"); for ($i=0;$i<$EHOUSE_PRO_MAX_INPUTS/$this->HALF_INPUTS;$i++) {$this->e("S$i=" . $this->SMS[$i]."\t");} $this->e("\r\n\r\n"); for ($i=0;$i<$EHOUSE_PRO_MAX_INPUTS/$this->HALF_INPUTS;$i++) {$this->e("A$i=" . $this->Alarm[$i]."\t");} $this->e("\r\n\r\n"); } if ($this->DIMMERS_ENABLED) {for ($i=0;$i<$EHOUSE_PRO_MAX_DIMMERS/$this->HALF_DIMMERS;$i++) {$this->e("D$i=" . $this->Dimmer[$i]."\t");} $this->e("\r\n\r\n");} $this->e("\r\nProgramNr =" . $this->ProgramNr); $this->e("\r\nAdcProgramNr =" . $this->AdcProgramNr); $this->e("\r\nDRVProgramNr =" . $this->RollerProgram); $this->e("\r\nZoneNr =" . $this->SecuZone); $this->e("\r\nHW Outs =" . $this->HWStates); //instead off Future[180] /*public $SatelSecuZone; //current security zone public $SatelProgramNr; //current security zone public $SatelRollerProgram; //current security zone public $SatelHWStates; //current security zone public $SatelAdcProgramNr; //current security zone public $SatelE; //current security zone public $SatelF; //current security zone public $SatelG; //current security zone public $SatelH; public $SatelI; for ($i=0;$i<256;$i++) echo "in $i =" . $this->SatelOutputs=array(256); //satel output states for ($i=0;$i<256;$i++) echo "in $i =" . $this->SatelInputs=array(256); //satel input states for ($i=0;$i<256;$i++) echo "in $i =" . $this->SatelInputsAlarm=array(256); //satel inputs violation for ($i=0;$i<256;$i++) echo "in $i =" . $this->SatelInputsAlarmMemory=array(256); //satel inputs ignore for ($i=0;$i<256;$i++) echo "in $i =" . $this->SatelTamper=array(256); //satel input states for ($i=0;$i<256;$i++) echo "in $i =" . $this->SatelTamperAlarm=array(256); //satel inputs violation for ($i=0;$i<256;$i++) echo "in $i =" . $this->SatelTamperAlarmMemory=array(256); //satel inputs violation for ($i=0;$i<256;$i++) echo "in $i =" . $this->SatelInputsBypas=array(256); //satel inputs ignore until clear alarm for ($i=0;$i<256;$i++) echo "in $i =" . $this->SatelInputsIsolate=array(256); // isolate input untill manual unbypas for ($i=0;$i<256;$i++) echo "in $i =" . $this->SatelNoViolationTrouble=array(256); //7 for ($i=0;$i<256;$i++) echo "in $i =" . $this->SatelLongViolationTrouble=array(256); //8 for ($i=0;$i<256;$i++) echo "in $i =" . $this->SatelInputsMasked=array(256); //0x28 for ($i=0;$i<256;$i++) echo "in $i =" . $this->SatelInputsMaskedMemory=array(256); //0x29 */ if (!is_dir('AI-Stat')) {mkdir ('AI-Stat' );} //$fn="pro.".date("H_i_s"); $fn="pro."."txt"; file_put_contents("AI-Stat/$fn", $this->results); } ////////////////////////////////////////////////////////////////////////////////////// // Decode complete eHouse.PRO + Satel Integra Security System state ///////////////////////////////////////////////////////////////////////////// function DecodeEhousePROStatus() { global $EHOUSE_PRO_MAX_ADC,$EHOUSE_PRO_MAX_INPUTS, $EHOUSE_PRO_MAX_OUTPUTS,$EHOUSE_PRO_MAX_DIMMERS, $EHOUSE_PRO_ADC_ADDR,$EHOUSE_PRO_OUTPUTS_ADDR,$EHOUSE_PRO_INPUTS_ADDR, $EHOUSE_PRO_HORN_ADDR, $EHOUSE_PRO_WARNING_ADDR, $EHOUSE_PRO_MONITORING_ADDR, $EHOUSE_PRO_SILENT_ADDR, $EHOUSE_PRO_EARLYWARNING_ADDR, $EHOUSE_PRO_SMS_ADDR, $EHOUSE_PRO_ALARM_ADDR, $EHOUSE_PRO_DIMMER_ADDR, $EHOUSE_PRO_PROGRAM_ADDR, $EHOUSE_PRO_ADCPROGRAM_ADDR, $EHOUSE_PRO_ROLLERPROGRAM_ADDR, $EHOUSE_PRO_SECUZONE_ADDR, $EHOUSE_PRO_HWOUTS_ADDR, $OFFSET_UNKNOWN, $SATEL_SECU_ZONE_ADDR, $SATEL_PROGRAM_NR_ADDR, $SATEL_ROLLER_PROGRAM_ADDR, $SATEL_HW_STATES_ADDR, $SATEL_ADC_PROGRAM_NR_ADDR, $SATEL_E_ADDR, $SATEL_F_ADDR, $SATEL_G_ADDR, $SATEL_H_ADDR, $SATEL_I_ADDR, $SATEL_OUTS_ADDR, $SATEL_INPUTS_ADDR, $SATEL_INPUTS_ALARM_ADDR, $SATEL_INPUTS_ALARM_MEMORY_ADDR, $SATEL_TAMPER_ADDR, $SATEL_TAMPER_ALARM_ADDR, $SATEL_TAMPER_ALARM_MEMORY_ADDR, $SATEL_INPUTS_BYPAS_ADDR, $SATEL_INPUTS_ISOLATE_ADDR, $SATEL_INPUTS_NO_VIOLATION_ADDR, $SATEL_INPUTS_LONG_VIOLATION_ADDR, $SATEL_INPUTS_MASKED_ADDR, $SATEL_INPUTS_MASKED_MEM_ADDR, $EHOUSE_PRO_FUTURE_ADDR; if (($this->ProcessChangedOnly>0) && ($this->WasChanged===0)) {return;} if (strlen($this->TextStatus)<1000) {return;} //no eHouse Pro Status stored in status $i=0; $k=0; $TotalOffset=0; $ind=0; $Max_ADC = 128; $EHOUSE_PRO_INPUTS_ALL=0;//256 inputs if >0 else 128 $EHOUSE_PRO_OUTPUTS_ALL=0;//256 outpust if >0 else 128 $EHOUSE_PRO_MAX_Future=170;//20B for future use $EHOUSE_PRO_MAX_AdditionalInfo=256;//Additional info for panels, audio playback status, video status $EHOUSE_PRO_MARK="FF55FF55";//ehouse.pro frame preamble mark $EHOUSE_PRO_MARK_ADDR =0;//!!!!!!ehouse pro frame address locations offset $EHOUSE_PRO_ADDRH_ADDR =4;//addrh - 192.168.addrh.addrl $EHOUSE_PRO_ADDRL_ADDR =5;//addrl /* //$EHOUSE_PRO_ADC_ADDR=6;//adcs $EHOUSE_PRO_OUTPUTS_ADDR=$EHOUSE_PRO_ADC_ADDR+2*$this->EHOUSE_PRO_MAX_ADC;//digital outputs $EHOUSE_PRO_INPUTS_ADDR=$EHOUSE_PRO_OUTPUTS_ADDR+($this->EHOUSE_PRO_MAX_OUTPUTS/8);//inputs $EHOUSE_PRO_HORN_ADDR=$EHOUSE_PRO_INPUTS_ADDR+($this->EHOUSE_PRO_MAX_INPUTS/8); //horn $EHOUSE_PRO_WARNING_ADDR=$EHOUSE_PRO_HORN_ADDR+($this->EHOUSE_PRO_MAX_INPUTS/8);//warning $EHOUSE_PRO_MONITORING_ADDR=$EHOUSE_PRO_WARNING_ADDR+($this->EHOUSE_PRO_MAX_INPUTS/8);//monitoring $EHOUSE_PRO_SILENT_ADDR=$EHOUSE_PRO_MONITORING_ADDR+($this->EHOUSE_PRO_MAX_INPUTS/8);//silent $EHOUSE_PRO_EARLYWARNING_ADDR=$EHOUSE_PRO_SILENT_ADDR+($this->EHOUSE_PRO_MAX_INPUTS/8);//early warning $EHOUSE_PRO_SMS_ADDR=$EHOUSE_PRO_EARLYWARNING_ADDR+($this->EHOUSE_PRO_MAX_INPUTS/8);//sms $EHOUSE_PRO_ALARM_ADDR=$EHOUSE_PRO_SMS_ADDR+($this->EHOUSE_PRO_MAX_INPUTS/8);//alarm $EHOUSE_PRO_DIMMER_ADDR=$EHOUSE_PRO_ALARM_ADDR+($this->EHOUSE_PRO_MAX_INPUTS/8);//dimmer $EHOUSE_PRO_PROGRAM_ADDR=$EHOUSE_PRO_DIMMER_ADDR+($this->EHOUSE_PRO_MAX_DIMMERS);//program $EHOUSE_PRO_ADCPROGRAM_ADDR=$EHOUSE_PRO_PROGRAM_ADDR+(1*4); //adcprogram $EHOUSE_PRO_ROLLERPROGRAM_ADDR=$EHOUSE_PRO_PROGRAM_ADDR+(2*4);//rollers programs $EHOUSE_PRO_SECUZONE_ADDR=$EHOUSE_PRO_PROGRAM_ADDR+(3*4); //zone $EHOUSE_PRO_HWOUTS_ADDR=$EHOUSE_PRO_PROGRAM_ADDR+(4*4); //hardware outs - alarm, warning, monitoring, early warning, horn, silent etc $OFFSET_UNKNOWN=$EHOUSE_PRO_HWOUTS_ADDR+4;//unknown offset $SATEL_SECU_ZONE_ADDR= $OFFSET_UNKNOWN+4;//hardware outs - alarm, warning, monitoring, early warning, horn, silent etc $SATEL_PROGRAM_NR_ADDR=$SATEL_SECU_ZONE_ADDR+1; $SATEL_ROLLER_PROGRAM_ADDR=$SATEL_PROGRAM_NR_ADDR+1; $SATEL_HW_STATES_ADDR=$SATEL_ROLLER_PROGRAM_ADDR+1; $SATEL_ADC_PROGRAM_NR_ADDR=$SATEL_HW_STATES_ADDR+1; $SATEL_E_ADDR=$SATEL_ADC_PROGRAM_NR_ADDR+1; $SATEL_F_ADDR=$SATEL_E_ADDR+1; $SATEL_G_ADDR=$SATEL_F_ADDR+1; $SATEL_H_ADDR=$SATEL_G_ADDR+1; $SATEL_I_ADDR=$SATEL_H_ADDR+1; $SATEL_OUTS_ADDR=$SATEL_I_ADDR+1; $SATEL_INPUTS_ADDR=$SATEL_OUTS_ADDR+32; $SATEL_INPUTS_ALARM_ADDR=$SATEL_INPUTS_ADDR+32; $SATEL_INPUTS_ALARM_MEMORY_ADDR=$SATEL_INPUTS_ALARM_ADDR+32; $SATEL_TAMPER_ADDR=$SATEL_INPUTS_ALARM_MEMORY_ADDR+32; $SATEL_TAMPER_ALARM_ADDR=$SATEL_TAMPER_ADDR+32; $SATEL_TAMPER_ALARM_MEMORY_ADDR=$SATEL_TAMPER_ALARM_ADDR+32; $SATEL_INPUTS_BYPAS_ADDR=$SATEL_TAMPER_ALARM_MEMORY_ADDR+32; $SATEL_INPUTS_ISOLATE_ADDR=$SATEL_INPUTS_BYPAS_ADDR+32; $SATEL_INPUTS_NO_VIOLATION_ADDR=$SATEL_INPUTS_ISOLATE_ADDR+32; $SATEL_INPUTS_LONG_VIOLATION_ADDR=$SATEL_INPUTS_NO_VIOLATION_ADDR+32; $SATEL_INPUTS_MASKED_ADDR=$SATEL_INPUTS_LONG_VIOLATION_ADDR+32; $SATEL_INPUTS_MASKED_MEM_ADDR=$SATEL_INPUTS_MASKED_ADDR+32; $EHOUSE_PRO_FUTURE_ADDR=$SATEL_INPUTS_MASKED_MEM_ADDR+32; */ for ($k=0;$k<$EHOUSE_PRO_MAX_OUTPUTS/$this->HALF_OUTPUTS;$k++) { $this->out[$k]=$this->eH($EHOUSE_PRO_OUTPUTS_ADDR,$k); } $toind=$EHOUSE_PRO_MAX_INPUTS/$this->HALF_INPUTS; for ($k=0;$k<$toind;$k++) { $this->in[$k]=$this->eH($EHOUSE_PRO_INPUTS_ADDR,$k); } //for trying some optimalization -> ommit not changed inputs for controller if($this->ALARM_ENABLED) { for ($k=0;$k<$toind;$k++) { $this->Alarm[$k]=$this->eH($EHOUSE_PRO_ALARM_ADDR,$k); } for ($k=0;$k<$toind;$k++) { $this->Horn[$k]=$this->eH($EHOUSE_PRO_HORN_ADDR,$k); } for ($k=0;$k<$toind;$k++) { $this->Warning[$k]=$this->eH($EHOUSE_PRO_WARNING_ADDR,$k); } for ($k=0;$k<$toind;$k++) { $this->Monitoring[$k]=$this->eH($EHOUSE_PRO_MONITORING_ADDR,$k); } for ($k=0;$k<$toind;$k++) { $this->Silent[$k]=$this->eH($EHOUSE_PRO_SILENT_ADDR,$k); } for ($k=0;$k<$toind;$k++) { $this->SMS[$k]=$this->eH($EHOUSE_PRO_SMS_ADDR,$k); } for ($k=0;$k<$toind;$k++) { $this->EarlyWarning[$k]=$this->eH($EHOUSE_PRO_EARLYWARNING_ADDR,$k); } } if ($this->ADCS_ENABLED) { $i=0; while ($i < $EHOUSE_PRO_MAX_ADC/$this->HALF_ADC) { $temppp= $this->Bin[$TotalOffset+$EHOUSE_PRO_ADC_ADDR+ ($i*2)]&0xff; if ($temppp<0) {$temppp+=256;} $temppp+=(($this->Bin[$EHOUSE_PRO_ADC_ADDR+ ($i*2) + 1]&0xff) << 8); $this->adc[$i] = ((float)$temppp)/10; $i++; } } if ($this->DIMMERS_ENABLED) { $i=0; while ($i < $EHOUSE_PRO_MAX_DIMMERS/$this->HALF_DIMMERS) { $this->Dimmer[$i]=(($this->Bin[$TotalOffset+$EHOUSE_PRO_DIMMER_ADDR+$i]&0xff)/0xff)*100; $i++; } } $this->CurrentProgram=$this->GetProPG(2+$EHOUSE_PRO_PROGRAM_ADDR); $this->CurrentADCProgram=$this->GetProPG(2+$EHOUSE_PRO_ADCPROGRAM_ADDR); $this->CurrentSecuProgram=$this->GetProPG(2+$EHOUSE_PRO_ROLLERPROGRAM_ADDR); $this->CurrentZone=$this->GetProPG(2+$EHOUSE_PRO_SECUZONE_ADDR); $this->HWOuts=$this->GetProPG(2+$EHOUSE_PRO_HWOUTS_ADDR); if (!$this->SATEL_ENABLED) { $this->StatusDecoded=1; return; } $TotalOffset = $SATEL_SECU_ZONE_ADDR; //if (eHousePRO[index].SingleChanged) { $this->SatelSecuZone=$this->Bin[$TotalOffset++]; $this->SatelProgramNr=$this->Bin[$TotalOffset++]; $this->SatelRollerProgram=$this->Bin[$TotalOffset++]; $this->SatelHWStates=$this->Bin[$TotalOffset++]; $this->SatelAdcProgramNr=$this->Bin[$TotalOffset++]; $this->SatelE=$this->Bin[$TotalOffset++]; $this->SatelF=$this->Bin[$TotalOffset++]; $this->SatelG=$this->Bin[$TotalOffset++]; $this->SatelH=$this->Bin[$TotalOffset++]; $this->SatelI=$this->Bin[$TotalOffset++]; } //$TotalOffset=$EHOUSE_PRO_FUTURE_ADDR; // { // for ($k=0;$k<170;$k++) // eHousePRO[index].Future[k]=eHousePRO[index].BinStat[TotalOffset++]; // } //$sstr="";$ssss=""; { for ($k = 0; $k < 256; $k++) { $this->SatelOutputs[$k]=$this->Sat($SATEL_OUTS_ADDR,$k); } } { for ($k = 0; $k < 256; $k++) { $this->SatelInputs[$k]=$this->Sat($SATEL_INPUTS_ADDR,$k); } } { for ($k = 0; $k < 256; $k++) { $this->SatelInputsAlarm[$k]=$this->Sat($SATEL_INPUTS_ALARM_ADDR,$k); } } { for ($k = 0; $k < 256; $k++) { $this->SatelInputsAlarmMemory[$k]=$this->Sat($SATEL_INPUTS_ALARM_MEMORY_ADDR,$k); } } { for ($k = 0; $k < 256; $k++) { $this->SatelTamper[$k]=$this->Sat($SATEL_TAMPER_ADDR,$k); } } { for ($k = 0; $k < 256; $k++) { $this->SatelTamperAlarm[$k]=$this->Sat($SATEL_TAMPER_ALARM_ADDR,$k); } } { for ($k = 0; $k < 256; $k++) { $this->SatelTamperAlarmMemory[$k]=$this->Sat($SATEL_TAMPER_ALARM_MEMORY_ADDR,$k); } } { for ($k = 0; $k < 256; $k++) { $this->SatelInputsBypas[$k]=$this->Sat($SATEL_INPUTS_BYPAS_ADDR,$k); } } { for ($k = 0; $k < 256; $k++) { $this->SatelInputsIsolate[$k]=$this->Sat($SATEL_INPUTS_ISOLATE_ADDR,$k); } } $this->StatusDecoded=1; //complete status decoding } //////////////////////////////////////////////////////////////////////////////// // Constructor feeding data with hexcoded textstatus for decoder // Verify status for eHousePRO if valid => store to TextStatus, convert to binary array of integers function __construct($str) { $s=substr($str,0,9); if (stripos($s,"FF55FF55")!==FALSE) { $this->TextStatus=trim($str); if (stripos($this->TextStatus,"*")!==FALSE) { $this->WasChanged=1; $this->TextStatus=substr($this->TextStatus,0,strlen($this->TextStatus)-1); } $this->hexi(); //convert Hex TextStatus to binary array of integer $ind=0; if (($this->Bin[$ind++]!=0xff) || ($this->Bin[$ind++]!=0x55) || ($this->Bin[$ind++]!=0xff) || ($this->Bin[$ind++]!=0x55) ) { $this->TextStatus=''; //invalid eHousePro Status } else { $this->StatusReceived=1; //set flag that valid eHouse.PRO status received $this->AdrH=$this->Bin[4]; $this->AdrL=$this->Bin[5]; } } else { $this->StatusDecoded=0; //set flag that valid eHouse.PRO status received and decoded $this->StatusReceived=0; $this->TextStatus=''; //invalid eHousePro Status } } ///////////////////////////////////////////////////////////////////////////////// //send direct event to the eHousePro Server 10B hex coded (string size 20) //events syntax are: [DevAddrH,DevAddrL,CommandCode,SignalNR,State,Arg1,Arg2,Arg3,Arg4,Arg5]; //eg 00FE2103020000000000 // | adres 0,254 - eHouse Pro Server 192.168.0.254 // | command "set output" // | nr=4 (starts from 0) // | state=2 (toggle), no advanced arguments //Only Direct Event are perforormed here other are ignored public function ExecCommand($cmd) { $str=trim($cmd); if (strlen($str)===20) {echo "$str\n";} } //////////////////////////////////////////////////////////////////////////////// public function Hex($int) { $ad=dechex($int); while (strlen($ad)<2) {$ad='0'.$ad;} return $ad; } ///////////////////////////////////////////////////////////////////////////////// //exec complete direct command 10B binary=>20B hex coded string //AdrH, AdrL automatically added as prefix public function ExEv($cmd,$arg1=0,$arg2=0,$arg3=0,$arg4=0,$arg5=0,$arg6=0,$arg7=0) { $str=$this->Hex($this->AdrH&0xff). $this->Hex($this->AdrL&0xff). $this->Hex($cmd&0xff). $this->Hex($arg1&0xff). $this->Hex($arg2&0xff). $this->Hex($arg3&0xff). $this->Hex($arg4&0xff). $this->Hex($arg5&0xff). $this->Hex($arg6&0xff). $this->Hex($arg7&0xff); echo $str."\n"; //echo -> will be captured by ehouse.pro server return $str; //return value } } ///examples //creator and feeding with status invalid are ignored not writing data to the Status locations //$eHousePro=new eHouseProC("FF55FF5500070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000*"); //$eHousePro->Display(); //debug only information - fully decoded status written on the screen and write to the file /* $out5=$eHousePro->GetOutStatus(4); //Individual signal decoding (binary output nr 5 (starts from 0) fast - without complete status decoding $in15=$eHousePro->GetInStatus(14); //Individual signal decoding (binary input nr 15 (starts from 0) fast - without complete status decoding //We can disable processing of subsystems we don't use for bigger speed and lower processor utilization $SATEL_ENABLED=0; //Satel Integra Security System $ALARM_ENABLED=0; //local security system (Horn, Silent, Warning, EarlyWarning, Monitoring, Alarm Flags) $DIMMERS_ENABLED=0; //External Dimmers $ADCS_ENABLED=0; //1-Wire temperature sensors or other linked //if we have smaller amount of inputs/outputs we can limit processing $HALF_ADC=1; //if 1 all inputs taken if 2 => half (EHOUSE_PRO_MAX_ADC/HALF_ADC) $HALF_INPUTS=1; //if 1 all inputs taken if 2 => half (EHOUSE_PRO_MAX_INPUTS/HALF_INPUTS) $HALF_OUTPUTS=1; //if 1 all inputs taken if 2 => half (EHOUSE_PRO_MAX_OUTPUTS/HALF_OUTPUTS) $HALF_DIMMERS=1; //if 1 all dimmers taken if 2 => half (EHOUSE_PRO_MAX_DIMMERS/HALF_DIMMERS) */ //$eHousePro->DecodeEhousePROStatus(); //Full status decoding - no results displays in case of valid status //$eHousePro->ExEv(21,1000,1000,1000,1000,1000,1000,1000); ?>