LOGICHE - TEMPORIZZAZIONE CON PREAVVISO CONFIGURABILE - LOGICHE - Domotica KNX MyHOME Modbus e soluzioni IOT


LOGICHE - TEMPORIZZAZIONE CON PREAVVISO CONFIGURABILE

Autore: ENNIO FANTUZZI

Lo script presentato in questo tutorial permette di creare una funzione temporizzata tipo "luce scala" con tempo di attesa, di lampeggio ON e OFF configurabili dall'utente.

 

CREAZIONE DELLO SCRIPT

Il primo passo consiste nel creare uno SCRIPT, procedendo come segue:

A questo punto, cancellare il contenuto dello SCRIPT ed inserire il codice seguente:

/********************************
/ CREDITS
/ Written by Ennio Fantuzzi
/ All Rights Reserverd.
/ Copyright 2014
/
/ Date: 13/10/2014
/ Version: 1.0

*********************************/

/*******************************************************************************************************************************
  
  La Funzione di questo script php, è simile a quella di un temporizzatore scale, dove il ciclo di funzionamento è

Quando a "COMANDO" arriva un "1", Lo script Imposta a "1" USCITAPREAVVISATA e USCITAFISSA, o commuta STATUS a "1"
Allo scadere di un tempo pari a TEMPOACCENSIONE-TEMPOPREAVVISO, STATUS commuta a "2" 
ed USCITAPREAVVISATA entra nella fase di lampeggio per un tempo pari a TEMPOPREAVVISO.
Il lampeggio è regolato in secondi da TIMEPULSEON, e TIMEPULSEOFF, che regolano rispettivamente 
il tempo in cui USCITAPREAVVISATA deve rimanere accesa e spenta.
A scadere del timer di TEMPOPREAVVISO, Tutte le uscite vengono Poste a "0"
Se durante il funzionamento dello scriptrunner, COMANDO torna a 0, il programma viene arrestato, in un tempo che può variare
dai 10 a 1 secondi, a seconda dello status del programma.
COMANDO, viene riportato automaticamente a 0, alla chiusura dello ScriptRunner, senza generare eventi all'interno di IKON.

INTERFACCIA, ovvero dove vanno posti gli oggetti all'interno dello scriptrunner, e quale testo specificare in "IDENTIFICATORE" per associarli correttamente:
INGRESSI:
- COMANDO, deve essere di tipo BOOLEAN;
USCITE:
- USCITAPREAVVISTA, deve essere di tipo BOOLEAN ed è l'uscita che lampeggerà durante il periodo TEMPOPREAVVISO;
- USCITAFISSA, deve essere di tipo BOOLEAN ed è l'uscita che rimarrà accesa durante tutto il periodo TEMPOACCENSIONE;
- STATUS, deve essere di tipo integer e segnala in che stato è lo ScriptRunner: 0 Tutto Spento, 1 Acceso nella prima parte Fissa, 2 Acceso nella parte Lampeggiante.
NOTABENE: Queste sotto, sono poste in uscite, ma in realtà sono dei parametri in ingresso: viene scelta questa zona in modo che una loro variazione, non lancia lo ScriptRunner.
- TEMPOACCENSIONE, deve essere di tipo integer ed è espresso in minuti;
- TEMPOPREAVVISO, deve essere di tipo integer ed è espresso in minuti;
- TIMEPULSEON, deve essere di tipo integer ed è espresso in secondi;
- TIMEPULSEOFF, deve essere di tipo integer ed è espresso in secondi;


*******************************************************************************************************************************/

	include_library("surrounding");
	$accensione=0;
	$tempofisso=0;
        $preavviso=0;
        $pulseontime=0;
        $pulseofftime=0;
		
	foreach($me->parentRelations as $parentRelation) {
	
	    	$parent = $parentRelation->parent;
		if (strcmp(strtoupper($parentRelation->options['tag_complex_element']), "COMANDO")==0) {
	    		$ElementodiComando=$parent;
	    	}

	}
	foreach($me->childRelations as $childRelation) {
	
	    	$child = $childRelation->child;
		if (strcmp(strtoupper($childRelation->options['tag_complex_element']), "TEMPOACCENSIONE")==0) {
	    		$accensione += (intval($child ->value)*1);
	    		debug("Child Values is: ".strval($child ->value));
	    	}
		if (strcmp(strtoupper($childRelation->options['tag_complex_element']), "TEMPOPREAVVISO")==0) {
	    		$preavviso += (intval($child ->value)*1);
	    		debug("Child Values is: ".strval($child ->value));
	    	}
		if (strcmp(strtoupper($childRelation->options['tag_complex_element']), "TIMEPULSEON")==0) {
	    		$pulseontime += intval($child ->value);
	    		debug("Child Values is: ".strval($child ->value));
	    	}
		if (strcmp(strtoupper($childRelation->options['tag_complex_element']), "TIMEPULSEOFF")==0) {
	    		$pulseofftime += intval($child ->value);
	    		debug("Child Values is: ".strval($child ->value));
	    	}
		if (strcmp(strtoupper($childRelation->options['tag_complex_element']), "USCITAPREAVVISATA")==0) {
	    		$UscitaPreavvisata = $child;
	    		debug("Child Values is: ".strval($child ->value));
	    	}
		if (strcmp(strtoupper($childRelation->options['tag_complex_element']), "USCITAFISSA")==0) {
	    		$UscitaFissa = $child;
	    		debug("Child Values is: ".strval($child ->value));
	    	}
		if (strcmp(strtoupper($childRelation->options['tag_complex_element']), "STATUS")==0) {
	    		$StatusObj= $child;
	    		debug("Child Values is: ".strval($child ->value));
	    	}
	}
	if (empty($ElementodiComando)){
		debug ("Esco perchè Manca");
                objM::objUpdateToDb($ElementodiComando->id,"value","0");

		_output();
	}
	if (intval($ElementodiComando->value)!=1){
		if (!empty($UscitaPreavvisata)) {
			$UscitaPreavvisata->refreshFromDb("value");
			if ($UscitaPreavvisata->value != 0) objM::objPerformOperation($UscitaPreavvisata->id,"SETVALUE",0);
		}
		if (!empty($UscitaFissa)) {
			$UscitaFissa->refreshFromDb("value");
			if ($UscitaFissa->value != 0) objM::objPerformOperation($UscitaFissa->id,"SETVALUE",0);
		}
		debug ("Esco perche' Comando è OFF");
                objM::objUpdateToDb($ElementodiComando->id,"value","0");
		_output();
	}	
	if (empty($UscitaPreavvisata) && empty($UscitaFissa)){
		debug ("ESCO perche' Mancano entrambe le uscite");
                objM::objUpdateToDb($ElementodiComando->id,"value","0");
		_output();	
	}
	$tempofisso = $accensione - $preavviso;
	if ($accensione <1){
		debug ("Accensione bassa, ESCO");
                objM::objUpdateToDb($ElementodiComando->id,"value","0");
		_output();
	}
	if ($preavviso <0){
		debug ("Preavviso bassa, ESCO");
		_output();
	}
	if ($tempofisso < 0){
		$tempofisso =0;
	}
	
	if (($preavviso > 0) && (($pulseontime+$pulseofftime)<1)){
		debug ("Calcoli sballati, ESCO");
                 objM::objUpdateToDb($ElementodiComando->id,"value","0");
		_output();
	}
        $preavviso=$preavviso*60;
	debug ("accendo");
	
	if (!empty($UscitaPreavvisata)) objM::objPerformOperation($UscitaPreavvisata->id,"SETVALUE",1);
	if (!empty($UscitaFissa)) objM::objPerformOperation($UscitaFissa->id,"SETVALUE",1);
	if (!empty($StatusObj)) objM::objPerformOperation($StatusObj->id,"SETVALUE",1);
	//intval($ElementodiComando->value)
	$contatore1 = 0;
	debug ("Valore di COMANDO"); debug ($ElementodiComando->value);
	
	while ($contatore1 < $tempofisso){
		$contatore2 = 0;
		while ($contatore2 < 6){		
			sleep(10);                       
			$ElementodiComando->refreshFromDb("value");
			debug ("Valore di COMANDO"); debug ($ElementodiComando->value);
			if (intval($ElementodiComando->value)==0){
				if (!empty($UscitaPreavvisata)) {
					$UscitaPreavvisata->refreshFromDb("value");
					if ($UscitaPreavvisata->value != 0) objM::objPerformOperation($UscitaPreavvisata->id,"SETVALUE",0);
				}
				if (!empty($UscitaFissa)) {
					$UscitaFissa->refreshFromDb("value");
					if ($UscitaFissa->value != 0) objM::objPerformOperation($UscitaFissa->id,"SETVALUE",0);
				}
				if (!empty($StatusObj)) objM::objPerformOperation($StatusObj->id,"SETVALUE",0);
                                objM::objUpdateToDb($ElementodiComando->id,"value","0");
				_output();
			}
			debug ("Loop 10 secondi");
			$contatore2++;
		}
		debug ("Loop 60 secondi");
		$contatore1++;
		
	}
	$contatore1 = 0;
	debug ("preavviso");
	if (!empty($StatusObj)) objM::objPerformOperation($StatusObj->id,"SETVALUE",2);
	while ($contatore1 < $preavviso){              //// Moltiplicare preavviso x 60!!!
		// Durata Lampeggio OFF 
		debug ("Lampeggio off");
		if (!empty($UscitaPreavvisata)) objM::objPerformOperation($UscitaPreavvisata->id,"SETVALUE",0);
		
		$contatore2 = 0;
		while (($contatore2 < $pulseofftime)&&($contatore1 < $preavviso)) {		
			sleep(1);                       
			$ElementodiComando->refreshFromDb("value");
			debug ("Valore di COMANDO"); debug ($ElementodiComando->value);
			if (intval($ElementodiComando->value)==0){
				if (!empty($UscitaPreavvisata)) {
					$UscitaPreavvisata->refreshFromDb("value");
					if ($UscitaPreavvisata->value != 0) objM::objPerformOperation($UscitaPreavvisata->id,"SETVALUE",0);
				}
				if (!empty($UscitaFissa)) {
					$UscitaFissa->refreshFromDb("value");
					if ($UscitaFissa->value != 0) objM::objPerformOperation($UscitaFissa->id,"SETVALUE",0);
				}
				if (!empty($StatusObj)) objM::objPerformOperation($StatusObj->id,"SETVALUE",0);
                                objM::objUpdateToDb($ElementodiComando->id,"value","0");
				_output();
			}
			$contatore2++;
			$contatore1++;
		}
		// Durata Lampeggio ON 
		debug ("Lampeggio on");
		if (!empty($UscitaPreavvisata)) objM::objPerformOperation($UscitaPreavvisata->id,"SETVALUE",1);
		$contatore2 = 0;
		while (($contatore2 < $pulseontime)&&($contatore1 < $preavviso)) {		
			sleep(1);                       
			$ElementodiComando->refreshFromDb("value");
			if (intval($ElementodiComando->value)==0){
				if (!empty($UscitaPreavvisata)) {
					$UscitaPreavvisata->refreshFromDb("value");
					if ($UscitaPreavvisata->value != 0) objM::objPerformOperation($UscitaPreavvisata->id,"SETVALUE",0);
				}
				if (!empty($UscitaFissa)) {
					$UscitaFissa->refreshFromDb("value");
					if ($UscitaFissa->value != 0) objM::objPerformOperation($UscitaFissa->id,"SETVALUE",0);
				}
				if (!empty($StatusObj)) objM::objPerformOperation($StatusObj->id,"SETVALUE",0);
                                 objM::objUpdateToDb($ElementodiComando->id,"value","0");
				_output();
			}
			$contatore2++;
			$contatore1++;
		}
	}
	debug ("spengo");
	if (!empty($UscitaPreavvisata)) objM::objPerformOperation($UscitaPreavvisata->id,"SETVALUE",0);
	if (!empty($UscitaFissa)) objM::objPerformOperation($UscitaFissa->id,"SETVALUE",0);
	if (!empty($StatusObj)) objM::objPerformOperation($StatusObj->id,"SETVALUE",0);
        objM::objUpdateToDb($ElementodiComando->id,"value","0");

Salvare mediante l'apposito pulsante SALVA.

 

CREAZIONE DELLO SCRIPT RUNNER

Per ogni temporizzazione che si desidera creare, è necessario configurare un nuovo SCRIPT RUNNER nel seguente modo:

A questo punto inserire nella sezione "DATI GENERALI" un nome identificativo per il nuovo oggetto, e selezionare lo SCRIPT creato in precedenza nell'omonimo menu a tendina; lasciare inalterate le altre opzioni della sezione "ASPETTO".

Nella sezione "INGRESSI" trascinare l'oggetto di tipo ON/OFF che, quando va ad 1, avvia la temporizzazione; se questo oggetto va a 0 prima del termine della sequenza, essa viene arrestata e l'uscita spenta.

Nella sezione "USCITE" viceversa trascinare i seguenti oggetti, avendo cura di utilizzare l'identificativo relativo (caratteri tutti maiuscoli):

La figura seguente mostra un esempio di configurazione:

Nota: il nome degli oggetti non è significativo, essendo tratto dal progetto di esempio; l'importante è rispettare scrupolosamente le diciture del campo IDENTIFICATIVO.