Open Domy81 opened 3 weeks ago
Cancella le regole di default: cerca device presenti nel mio sistema ma non nel Tuo! Non ho pulito bene! Apri "usrrules02.2.js" e cancella le REGOLE esistenti: lascia se vuoi le prime tre che non usano device: // for test: you can delete this if (TRIGBYNAME('spegni luce')) VOICE ("Fatto: 'spegni la luce'"); if (TRIGBYNAME("Pippo")) VOICE ("Trovato Pippo"); if (TRIGBYNAME("chiamata Pippo")) TRIGRULE("pippo"), VOICE("chiamo Pippo"); Cancella il resto... Poi ci metterai le Tue!
CORRETTO FILE IoTwebUI.2.2.1.zip !!
Cancella le regole di default: cerca device presenti nel mio sistema ma non nel Tuo! Non ho pulito bene! Apri "usrrules02.2.js" e cancella le REGOLE esistenti: lascia se vuoi le prime tre che non usano device: // for test: you can delete this if (TRIGBYNAME('spegni luce')) VOICE ("Fatto: 'spegni la luce'"); if (TRIGBYNAME("Pippo")) VOICE ("Trovato Pippo"); if (TRIGBYNAME("chiamata Pippo")) TRIGRULE("pippo"), VOICE("chiamo Pippo"); Cancella il resto... Poi ci metterai le Tue!
CORRETTO FILE IoTwebUI.2.2.1.zip !!
Confermo, errori spariti! Grazie
Ne approfitto per chiedere maggiori informazioni riguardo gli addon e la loro installazione/utilizzo: https://github.com/msillano/IoTwebUI/blob/main/addon/battery01-leggimi.md cioè, come li "richiamo" nell'interfaccia IoTwebUI, cosa bisogna modificare, i file stesso all'interno della cartella (non è molto chiaro)?
Pensa gli 'addon' come delle GROSSE regole. In realtà non c'è differenza: quando le REGOLE diventano complesse (e.g, nel caso di x-device) NON è comodo editarle direttamente nel pad delle regole,. ma è più comodo scriverle come 'funzioni' js. Si hanno anche meno vincoli! Un altro grande vantaggio è la possibilità di 'scambio' tra utenti di sviluppi personali.
Si hanno 3 alternative (nota: il codice è sostanzialmente lo stesso, cambia solo come/dove infilarlo!)
1) Il file dell'addon (vedi esempi) è nella DIR addon, e viene 'incluso' nel file principale (\IoTwebUI.html):
Nella sezione 'RULES forXXXXX: use this in RULE-pad' trovi i wrapper (da mettere tra le REGOLE) per chiamare la funzione principale dell'addon! E' un esempio, si può modificare!...boh, secondo me troppe opzioni che confondono, io continuo a non capire cosa fare! Le macro non riesco ad usarle (non capisco neanche qual'è il codice esatto da copiare e dove)! L'unico che riesco a richiamare è il codice 'minimizzato', quindi poi vedo l'x-device (l'icona ad ingranaggi) ma comunque non so che fare... mi elenca tutti i dispositivi, non solo quelli a batteria!
Da un certo punto di vista non hai torto! Ci sono MOLTE opzioni! Per fortuna sono 'opzioni', puoi pertanto ignorarle fino a quando non ne hai veramente bisogno!
Vediamo Battery01: hai settato il livello 30%. Quindi tutti i device con battery < 30% appaiono nella lista. Come vedi dal codice viene fatto il test delle proprietà '_batterypercentage' e '_vabattery' di tutti i device Tuya che trova ! (ovviamente questo si può modificare)
Quindi tutti i device in elenco hanno la proprietà '_batterypercentage' oppure '_vabattery' minore di 30 ! Verifica! (a meno di bug da correggere :) sempre possibili!)
Questo è un esempio di x-device! Che ci fai? Contrariamente alle mini-APP, una volta definita e funzionante, la puoi trattare come un qualsiasi device Tuya !
1) per esempio mettere un ALLARME su count: quando supera 10 device ti avverte!
2) Oppure scrivere un po' di REGOLE per cambiare il '_lowlevel', al volo. Questa è una REGOLA-Tap-To-Run di nome "SET minimo 4%":
if (TRIGBYNAME("SET minimo 4%")) SETXDEVICESTATUS("Battery test", 'low level', 4),REFRESH(),VOICE("Livello basso delle batterie aggionato"),REFRESH('cloud');
nota: Questa REGOLA usa 4 MACRO (funzioni js con nomi MAIUSCOLI) : TRIGBYNAME(), SETXDEVICESTATUS(), REFRESH(), VOICE(), e praticamente niente codice javaScript! La documentazione relativa (quello che fanno e che parametri richiedono) la trovi in LEGGIMI22.md
Ma se gli x-device non ti servono, se ti bastano le automazioni e i device Tuya: NON USARLI!
Oltre che per task 'amministrativi' come questo, Io li trovo molto utili come 'middleware', per esempio per preparare i valori che voglio usare nelle interfacce utente HTML! Si separa l'elaborazione dalla visualizzazione: la pagina HTML trova così i dati pronti e deve SOLO visualizzarli! Responsabilità definite e separate! Ciao
Allora vediamo una cosa alla volta! Sì ho impostato 30% sul file ma se guardi bene l'elenco ci sono elencati tutti i dispositivi (anzi 41) anche quelli non a batteria! Ed è questa la prima cosa che mi confonde! :)
Se è così è un bug che va corretto! nota: qualche bug nelle MACRO è sempre possibile, ancora non sono state testate bene in varie situazioni!
La 'condizione' per un device di essere nell'elenco è:
Trovato! Ti do subito le correzioni al volo, poi aggiorno i file.
File addon/battery01: ----prima:
72: if (_t1 == "none")
_t1 = GET(devid, 'va_battery', false);
//For more properties, duplicate the previous 2 lines...
if ((_t1 != "none") && (_t1 < _lowPerc))
_lowD.push(GETATTRIBUTE(devid, 'name'));
----corretto:
72 if (_t1 === null)
_t1 = GET(devid, 'va_battery', false);
// for more properties, duplicate previous 2 lines...
if ((_t1 !== null) && (_t1 < _lowPerc))
_lowD.push(GETATTRIBUTE(devid, 'name'));
file tuyaui02.2.js: --- prima:
1505: device.status = init || [];
return ; // exists
--- corretto: 1505: device.status = init || []; device.online = false; return ; // exists
Ciao
Niente, sempre uguale, ho provato anche a mettere il valore a 40.
// ============================= minified BATTERY01 // Minified version of BATTERY01 for RULE-pad: 4 lines only! (using Notepad++ + plugin JSTool). che significa solo 4 linee, 4 linee di cosa? Devo usare il plugin JSTool per fare cosa?
io copio nel pad tutto questo ed eseguo il test:
if(!VGET('$done'))VSET('$done',1),ADDXDEVICE('Casa',null,"Battery test",[{code:'home',value:'Casa'},{code:'low level',value:40}]);
var _xhome=GET("Battery test",'home');var _lowPerc=GET("Battery test",'low level');var _lowD=[];if(TRIGCHANGED(_xhome)) ADDXDEVICE('Casa',null,"Battery test",[{code:'home',value:_xhome},{code:'low level',value:_lowPerc}]),VOICE("Aggiorno la lista dei device");
GETIDLIST(_xhome).forEach((devid)=>{let _t1=GET(devid,'battery_percentage',false);if(_t1=="none")_t1=GET(devid,'va_battery',false);if((_t1!="none")&&(_t1<_lowPerc))_lowD.push(GETATTRIBUTE(devid,'name'));});
SETXDEVICESTATUS("Battery test", "count", _lowD.length);_lowD.forEach((dev,pos)=>{SETXDEVICESTATUS("Battery test","low"+(pos+1),dev)});
è corretto? Poi nel pannello a sinistra che esce cliccando sull'icona "Battery test" devo fare altro?
UPDATE: sempre usando il codice minimizzato nel pad (come scritto sopra), ho notato però che mettendo a 40% i device totali sono 43; rimetto 30 e sono di nuovo 41; vado a scrutare per bene tutto l'elenco e scopro che in realtà in questi 41 (col 30%) solo uno è il dispositivo a batteria (guarda caso sotto al 30%) tutti gli altri 40 sono dispositivi a corrente; e sorpresa con 40% (40 dispositivi a corrente e 3 a batteria sotto al 40%). ;)
...poi
// ===================== USE AS NEW MACRO // 0) This file (updated) must be in the 'addons' directory of your IoTwebUI installation e c'è!
// 1) Include THIS file in the main file ( IoTwebUI.html ) at the end, adding: // e già ce l'hai messa!
// 2-A) Copy the 'RULES for BATTERY01' in the RULE-pad at run time (temporary) cosa devo esattamente copiare ed eseguire, questo?
BATTERY01(); // MACRO call
if (TRIGBYNAME("Batterie Casa")) SETXDEVICESTATUS("Battery test", 'home', 'Casa'),REFRESH(),VOICE("Batterie di Casa"), REFRESH('cloud');
mi da errore!
questo?
if (TRIGBYNAME("Batterie Casa")) SETXDEVICESTATUS("Battery test", 'home', 'Casa'),REFRESH(),VOICE("Batterie di Casa"), REFRESH('cloud');
non fa nulla nel grafico, aggiunge solo un tasto "Batterie casa" nelle Tap-to-Run che "parla"! :)
// 2-B) Or copy the 'RULES for BATTERY01' in the 'var usrrules' in the usrrulesXX.X.js file (permanent). in 60:
var usrRules = `
// here your RULEs
// for test: you can delete this
`;
sostituisco così?
var usrRules = `
if (TRIGBYNAME("Batterie Casa")) SETXDEVICESTATUS("Battery test", 'home', 'Casa'),REFRESH(),VOICE("Batterie di Casa"), REFRESH('cloud');
`;
idem come prima, nulla sul grafico, solo il tasto in Tap-to-Run che parla!
// You can use 'BATTERY01()' as new MACRO in RULE-pad !
Cioè dopo 2A o 2B nel pad eseguo
BATTERY01()
Mi da errore
Se eseguo
'BATTERY01()'
mi rimuove il tasto nel Tap-to-Run
Niente, sempre uguale, ho provato anche a mettere il valore a 40. !
NON mi avevi detto di stare usando la versione minified! La correzione è la stessa, eccola in versione 'mini'
GETIDLIST(_xhome).forEach((devid)=>{let _t1=GET(devid,'battery_percentage',false);if(_t1===null)_t1=GET(devid,'va_battery',false);if((_t1!==null)&&(_t1<_lowPerc))_lowD.push(GETATTRIBUTE(devid,'name'));});
Ciao
...poi
// ===================== USE AS NEW MACRO // 0) This file (updated) must be in the 'addons' directory of your IoTwebUI installation e c'è!
// 1) Include THIS file in the main file ( IoTwebUI.html ) at the end, adding: // e già ce l'hai messa!
// 2-A) Copy the 'RULES for BATTERY01' in the RULE-pad at run time (temporary) cosa devo esattamente copiare ed eseguire, questo?
if (TRIGBYNAME("Batterie Casa")) SETXDEVICESTATUS("Battery test", 'home', 'Casa'),REFRESH(),VOICE("Batterie di Casa"), REFRESH('cloud');
mi da error!
Sia ben chiaro che i 3 modi (includi/copy/minified) sono MUTUALMENTE ESCLUSIUVI: o usi uno o l'altro o l'altro: NON tutti e TRE! A mio avviso il più semplice è il primo (include nel file HTML) e poi aggiungi quello che TI SERVE tra le regole!. Cioè SOLO questo:
BATTERY01(); // MACRO call
Questa 'REGOLA' che si limita a chiamare la MACRO BATTERY01(), SERVE SOLO se usi il metodo 'include' o il metodo 'copy' ! NON serve nel caso MINIFIED (hai già tutto il codice inserito come regola)
questo?
if (TRIGBYNAME("Batterie Casa")) SETXDEVICESTATUS("Battery test", 'home', 'Casa'),REFRESH(),VOICE("Batterie di Casa"), REFRESH('cloud');
non fa nulla nel grafico, aggiunge solo un tasto "Batterie casa" nelle Tap-to-Run che "parla"! :) if (TRIGBYNAME("Batterie Casa")) SETXDEVICESTATUS("Battery test", 'home', 'Casa'),REFRESH(),VOICE("Batterie di Casa"), REFRESH('cloud');
La seconda REGOLA (fornita come esempio) è una REGOLA 'con NOME' (cioè equivalente ad unTap-to-run)
Si chiama " (TRIGBYNAME("Batterie '
Serve quindi a cambiare HOME e rinfrescare l'elenco, ma mi pare tu ne hai una sola! CHE cosa CAMB?I! (se vuoi crea una nuova home, sposta qualche device e prova!)
Il codice SETXDEVICESTATUS("Battery test", 'home', 'Casa')
è funzionalmente equivalente alla azione, in una scena Tuya
SET 'Battery test'.home = 'Casa'
solo agisce su x-device, anzichè su device!
Cioè: Alla x-device "Battery test", proprietà 'home', viene assegnato un nuovo valore 'Casa' (v. doc. SETXDEVICESTATUS()). Per come è fatto battery01 questo basta per far aggiornare la lista dell' x-device! Ovviamente darà ERRORE se NON esiste una 'home' di nome 'Casa' !!!
La REGOLA ha un NOME: infatti inizia con if (TRIGBYNAME("Batterie Casa"))
. E' una REGOLA tipo tap-to-run e per questo la trovi tra i tap-to-run come bottone automaticamente. il NOME è proprio "Batterie Casa"....
// 2-B) Or copy the 'RULES for BATTERY01' in the 'var usrrules' in the usrrulesXX.X.js file (permanent). in 60:
ATTENZIONE! Le REGOLE o le inserisci nel PAD (test, per un solo run) e fai il test OPPURE le copi in ' in usrrulesXX.X.js (permanente!) MUTUALMENTE ESCLUSIVO e saranno usare al prossimo run! Personalmente preferisco provarle prima nel pad, e solo quando sono OK copiarle in usrrules02.2.js.
Nota: Hai due 'insiemi' di regole: quelle (editabili) nel PAD e quelle (fisse) nel file usrrulesXX.X.js !
var usrRules = ` // here your RULEs // for test: you can delete this `;
sostituisco così?
var usrRules = ` if (TRIGBYNAME("Batterie Casa")) SETXDEVICESTATUS("Battery test", 'home', 'Casa'),REFRESH(),VOICE("Batterie di Casa"), REFRESH('cloud'); `;
idem come prima, nulla sul grafico, solo il tasto in Tap-to-Run che parla!
// You can use 'BATTERY01()' as new MACRO in RULE-pad ! Cioè dopo 2A o 2B nel pad eseguo
BATTERY01()
Mi da erroreSe eseguo
'BATTERY01()'
mi rimuove il tasto nel Tap-to-Run Che cosa intendi??? NON capisco!
NO.
'BATTERY01(); ' (una volta tra le regole, via pad o file) NON LA PUOI ESEGUIRE!!! E' una REGOLA, che usa una MACRO per creare un x-device.
Le REGOLE sono eseguite automaticamente ad ogni LOOP. L'utente può 'eseguire' solo le REGOLE con un NOME (i.e. tap-to-run) tramite i bottoni!
Consiglio: riparti da capo. 1) svuota la dir ADDON 2) Svuota usrrulesXX.X.js:
// here your RULEs
// for test: you can delete this // Queste tre tienile o cancellale, come preferisci:
if (TRIGBYNAME('spegni luce')) VOICE ("Fatto: 'spegni la luce'");
if (TRIGBYNAME("Pippo")) VOICE ("Trovato Pippo");
if (TRIGBYNAME("chiamata Pippo")) TRIGRULE("pippo"), VOICE("chiamo Pippo");
`;
// ===================== CUSTOM USER MACROS
3) Scarica da GitHub la versione aggiornata di battery01 ! e mettila in \addon! (non lo ZIP, ma scarica direttamente i file in /addon). Leggi il relativo commento 'leggimi!'
4) In IoTWebUI.html elimina tutti gli include di addon tranne /battery01
<!-- INCLUDE HERE ADDONS files-->
<!-- example: -->
<script type="text/javascript" src="addons/battery01.js"></script >
// here your RULEs
// for test: you can delete this // Tienile o cancellale, come preferisci
if (TRIGBYNAME('spegni luce')) VOICE ("Fatto: 'spegni la luce'");
if (TRIGBYNAME("Pippo")) VOICE ("Trovato Pippo");
if (TRIGBYNAME("chiamata Pippo")) TRIGRULE("pippo"), VOICE("chiamo Pippo");
BATTERY01(); // MACRO call
`;
// ===================== CUSTOM USER MACROS
e ti funzionerà
In seguito, se ne hai la necissatà, introdurrai altre REGOLE (con o senza NOME) per automatizzare quello che vuoi. Ad esempio, un messaggio vocale alle 16:00 con i nomi dei device se ci sono più di 2 device con pile scariche! Ma un passo alla volta! Tutto insieme si crea un ingorgo! Ciao
Ok, adesso funziona, sempre la versione mini!! 👍
PS: certo che l'avevo detto 😜
@Domy81 commented yesterday ...boh, secondo me troppe opzioni che confondono, io continuo a non capire cosa fare! Le macro non riesco ad usarle (non capisco neanche qual'è il codice esatto da copiare e dove)! L'unico che riesco a richiamare è il codice 'minimizzato', quindi poi vedo l'x-device (l'icona ad ingranaggi)...
Aggiungo: alcuni dispositivi non hanno un valore numerico ma:
battery_state: high/medium/low
vengono considerati lo stesso?
Per aggiungere nuovi test, devi modificare il codice, vedi riga 72 (versione estesa!):
if (_t1 === null)
_t1 = GET(devid, 'va_battery', false);
// for more properties, duplicate previous 2 lines...
if ((_t1 !== null) && (_t1 < _lowPerc))
_lowD.push(GETATTRIBUTE(devid, 'name'));
diventa:
if (_t1 === null)
_t1 = GET(devid, 'va_battery', false);
// for more properties, duplicate previous 2 lines...
if (_t1 === null)
_t1 = GET(devid, 'battery_state', false);
if ((_t1 !== null) && ((_t1 < _lowPerc) || (_t1 == "low"))) // in alcuni casi NON vale _lowPerc, ma 'low' fisso
_lowD.push(GETATTRIBUTE(devid, 'name'));
Questo è più facile nella versione estesa, più complesso nella 'minified' (anche se queste righe di codice sono le stesse). Più tardi aggiorno i file su gitHub... Ciao
La versione di BATTERY01, BATTERY02 presenti inGitHub, dir /addon, sono state aggiornate.
Su IoTwebUI v.2.2.1 all'apertura ricevo più errori "ALERT ERRORE nelle REGOLE di base" che fanno riferimento a diversi dispositivi, credo di aver capito:
Riga 9. REGOLE disabilitate: >BATTERY01(); // MACRO call< ADDXDEVICE: Home Test not found! undefined
Riga 14. REGOLE disabilitate: >if (!GETATTRIBUTE("temperaturedata", "name", false)) ADDXDEVICE('ADMIN', "System", "temperaturedata"), SETXDEVICEONLINE("temperaturedata", true);< ADDXDEVICE: Home System not found! undefined
Riga 15. REGOLE disabilitate: >SETXDEVICESTATUS... < GET: not found property: va_temperature in device XXX undefined
Riga 20. REGOLE disabilitate: >SETXDEVICESTATUS... < GET: not found property: power_total in device XXX undefined
Riga 21. REGOLE disabilitate: >SETXDEVICESTATUS... < GET: not found property: cur_power in device XXX undefined