msillano / IoTwebUI

WEB APP for Tuya, with customizable functions that increase the performance of your IoT system
MIT License
1 stars 0 forks source link

ADDON BATTERY01: discussione su installazione - alcuni bug minori #18

Open Domy81 opened 3 weeks ago

Domy81 commented 3 weeks ago

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

IoTwebUI 2 2 1 Alert Error

msillano commented 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 !!

Domy81 commented 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 !!

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)?

msillano commented 3 weeks ago

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!
2) Il codice della funzione è copiato in: 'CUSTOM USER MACROS' di usrrulesXX.X.js. Diventa così una NUOVA MACRO personalizzata. Nella sezione 'RULES forXXXXX: use this in RULE-pad' trovi i wrapper (da mettere tra le REGOLE) per chiamare la funzione principale dell'addon! (come in caso 1: cambia solo dove sta la funzione!
nota: l'include' si può fare solo da un file HTML, ecco perchè il metodo 1 usa (\IoTwebUI.html), mentre l'aggiunta editando un file si può fare in tutti i file js: il metodo 2 usa (usrrulesXX.X.js) più logico!
3) Il codice è 'minimizzato' e pulito: diventano poche righe e può essere utilizzato nel PAD RULE come una REGOLA! Quindi copiare la versione 'minimizzata' direttamente nel PAD REGOLE! (soluzione meno efficiente di 1 e 2, perchè viene tutta interpretata al runtime) ad ogni loop.
Se si preferisce, poi, le REGOLE si copiano nel file usrrules02.2.js per renderle definitive! Spero sia più chiaro ora: gioca un po' con gli esempi... al massimo poi reinstalli! Le prime 3 REGOLE di prova ('pippo' etc.) NON richiedono device, quindi funzionano! (eseguile con volume audio medio: le trovi anche come bottoni, per test!). Ciao
Domy81 commented 2 weeks ago

...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! x-device

msillano commented 2 weeks ago

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

Domy81 commented 2 weeks ago

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! :)

msillano commented 2 weeks ago

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 è:

  1. Nel pop-up di IoTwebUI del device DEVE esistere la proprietà 'battery_percentage' o 'va_battery'
  2. Detta proprietà, sempre nel pop-up, deve avere un valore numerico < 30
msillano commented 2 weeks ago

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

Domy81 commented 2 weeks ago

Niente, sempre uguale, ho provato anche a mettere il valore a 40. x-device new x-device new2

// ============================= 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%). ;)

Domy81 commented 2 weeks ago

...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

msillano commented 2 weeks ago

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

msillano commented 2 weeks ago

...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 ''")) : in genere ne avrai tante quante le HOME che usi! L'obiettivo è di passare da una HOME all'altra!

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 errore

Se 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 >

4) Esegui IoTwebUI... ora puoi aggiungere la REGOLA ' BATTERY01(); ' tra le REGOLE! in forma test (PAD) o definitiva ( usrrulesXX.X.js:)

// 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

Domy81 commented 2 weeks ago

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?

msillano commented 2 weeks ago

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

msillano commented 2 weeks ago

La versione di BATTERY01, BATTERY02 presenti inGitHub, dir /addon, sono state aggiornate.