Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

0_userdata.0: existsState() vs. $-Selector $().length after state deletion #478

Closed
Mic-M opened this issue Jan 17, 2020 · 3 comments
Closed
Labels

Comments

@Mic-M
Copy link
Contributor

Mic-M commented Jan 17, 2020

Hi,

I have identified an issue with state creation under 0_userdata.0 and by using the new, yet undocumented, ioBroker function existsState() versus using $-Selector $().length to check for state existment.
I was able to isolate this as follows:


The following script creates a state under 0_userdata.0 by using setObject(). Afterwards, it checks in an interval (10x 2 seconds), if the state was deleted in the meantime.
If DELETE_STATE = true, then the script will delete the state in the 5th interval (after 10 seconds). If set to false, the tester needs to delete the state manually right after script start (so delete within ioBroker admin interface, tab "Objects").


Test Summary:
Deletion of a state, that was created by setObject(), seems to be not correctly recognized.

  1. State deleted manually:
    • $-selector: correct
    • existsState(): not correct (still returns true)
  2. State deleted through deleteState():
    • $-selector: not correct ($().length still returns >0)
    • existsState(): correct

However, we would expect that both existsState() would return false and $().length would return 0, if a state is deleted either manually within ioBroker admin, or by using deleteState() function.


Result of Test 1: DELETE_STATE = true

  • ioBroker Function existsState() identifies the state deletion. This is correct.
  • $(TEST_STATE).length falsely returns 1 ("Yes" in Script), which is not correct.

Result of Test 2: DELETE_STATE = false
About 10 seconds after script start, I have manually deleted the state 0_userdata.0.Test_1 within ioBroker admin Objects menu. Result:

  • ioBroker Function existsState() does not identify the state deletion. So not correct.
  • $(TEST_STATE).length correctly returns <1 ("No" in Script), which is correct.

The Script:

const DELETE_STATE = true;

const TEST_STATE = '0_userdata.0.Test_1';
//const TEST_STATE = 'javascript.0.Test_1';

log('______________________________________________________________________________________');


// First of all, we delete the state through JavaScript
deleteState(TEST_STATE);

// Next, we proceed accordingly. We use timeout of 2 seconds to make sure that the state is deleted.
setTimeout(function(){

    log('Start creating state [' + TEST_STATE + ']. Option DELETE_STATE set to ' + DELETE_STATE);
    if (!DELETE_STATE) log('Please note: for this test, you need to delete the state after creation by this script manually within ioBroker admin, tab "Objects". You will have max 18 seconds to proceed.', 'warn')
    createTestState();
    //createState('javascript.0.Test_1', {'name':'Test', 'type':'boolean', 'read':true, 'write':true, 'def':false });


    let intervalTimer;
    let counter = 0;
    let max = 10;
    intervalTimer = setInterval(function() {
        counter++;
        log ('=== Execution ' + counter + ' of ' + max + ' =====');
        if(DELETE_STATE && counter===5) {
            deleteState(TEST_STATE);
            log('######## State deleted through deleteState() function. ########')
        }

        if (counter <= max) {
            log('Does state exist per existsState(): ' + ((!existsState(TEST_STATE)) ? 'NO' : 'YES'));
            log('Does state exist per $(TEST_STATE).length: ' + (($(TEST_STATE).length < 1 ) ? 'NO' : 'YES'));
        } else {
            log(max + ' intervals completed. We stop further execution.')
            clearInterval(intervalTimer);
            intervalTimer = null;
        }
    }, 2000);

}, 2000);


function createTestState() {
    let obj = {};
    obj.type = 'state';
    obj.native = {};
    obj.common = {'name':'Test', 'type':'boolean', 'read':true, 'write':true, 'def':false };
    setObject(TEST_STATE, obj, function (err) {
        if (err) {
            log('Cannot write object for state [' + TEST_STATE + ']: ' + err);
        } else {
            let init = null;
            if(obj.common.def === undefined) {
                if(obj.common.type === 'number') init = 0;
                if(obj.common.type === 'boolean') init = false;
                if(obj.common.type === 'string') init = '';
            } else {
                init = obj.common.def;
            }
            // Timeout due to https://github.com/ioBroker/ioBroker.javascript/issues/474
            setTimeout(function() {
                setState(TEST_STATE, init, true);
            }, 50 );
        }
    });
}

Log of Test 1:

18:59:18.016	info	javascript.0 (14362) Start javascript script.js.E-Test.ERR_setObject
18:59:18.038	info	javascript.0 (14362) script.js.E-Test.ERR_setObject: ______________________________________________________________________________________
18:59:18.039	info	javascript.0 (14362) script.js.E-Test.ERR_setObject: registered 0 subscriptions and 0 schedules
18:59:20.043	info	javascript.0 (14362) script.js.E-Test.ERR_setObject: Start creating state [0_userdata.0.Test_1]. Option DELETE_STATE set to true
18:59:22.049	info	javascript.0 (14362) script.js.E-Test.ERR_setObject: === Execution 1 of 10 =====
18:59:22.050	info	javascript.0 (14362) script.js.E-Test.ERR_setObject: Does state exist per existsState(): YES
18:59:22.051	info	javascript.0 (14362) script.js.E-Test.ERR_setObject: Does state exist per $(TEST_STATE).length: YES
18:59:24.050	info	javascript.0 (14362) script.js.E-Test.ERR_setObject: === Execution 2 of 10 =====
18:59:24.051	info	javascript.0 (14362) script.js.E-Test.ERR_setObject: Does state exist per existsState(): YES
18:59:24.052	info	javascript.0 (14362) script.js.E-Test.ERR_setObject: Does state exist per $(TEST_STATE).length: YES
18:59:26.051	info	javascript.0 (14362) script.js.E-Test.ERR_setObject: === Execution 3 of 10 =====
18:59:26.051	info	javascript.0 (14362) script.js.E-Test.ERR_setObject: Does state exist per existsState(): YES
18:59:26.052	info	javascript.0 (14362) script.js.E-Test.ERR_setObject: Does state exist per $(TEST_STATE).length: YES
18:59:28.051	info	javascript.0 (14362) script.js.E-Test.ERR_setObject: === Execution 4 of 10 =====
18:59:28.051	info	javascript.0 (14362) script.js.E-Test.ERR_setObject: Does state exist per existsState(): YES
18:59:28.053	info	javascript.0 (14362) script.js.E-Test.ERR_setObject: Does state exist per $(TEST_STATE).length: YES
18:59:30.051	info	javascript.0 (14362) script.js.E-Test.ERR_setObject: === Execution 5 of 10 =====
18:59:30.052	info	javascript.0 (14362) script.js.E-Test.ERR_setObject: ######## State deleted through deleteState() function. ########
18:59:30.052	info	javascript.0 (14362) script.js.E-Test.ERR_setObject: Does state exist per existsState(): NO
18:59:30.053	info	javascript.0 (14362) script.js.E-Test.ERR_setObject: Does state exist per $(TEST_STATE).length: YES
18:59:32.051	info	javascript.0 (14362) script.js.E-Test.ERR_setObject: === Execution 6 of 10 =====
18:59:32.051	info	javascript.0 (14362) script.js.E-Test.ERR_setObject: Does state exist per existsState(): NO
18:59:32.053	info	javascript.0 (14362) script.js.E-Test.ERR_setObject: Does state exist per $(TEST_STATE).length: YES
18:59:34.052	info	javascript.0 (14362) script.js.E-Test.ERR_setObject: === Execution 7 of 10 =====
18:59:34.052	info	javascript.0 (14362) script.js.E-Test.ERR_setObject: Does state exist per existsState(): NO
18:59:34.053	info	javascript.0 (14362) script.js.E-Test.ERR_setObject: Does state exist per $(TEST_STATE).length: YES
18:59:36.052	info	javascript.0 (14362) script.js.E-Test.ERR_setObject: === Execution 8 of 10 =====
18:59:36.052	info	javascript.0 (14362) script.js.E-Test.ERR_setObject: Does state exist per existsState(): NO
18:59:36.054	info	javascript.0 (14362) script.js.E-Test.ERR_setObject: Does state exist per $(TEST_STATE).length: YES
18:59:38.051	info	javascript.0 (14362) script.js.E-Test.ERR_setObject: === Execution 9 of 10 =====
18:59:38.052	info	javascript.0 (14362) script.js.E-Test.ERR_setObject: Does state exist per existsState(): NO
18:59:38.053	info	javascript.0 (14362) script.js.E-Test.ERR_setObject: Does state exist per $(TEST_STATE).length: YES
18:59:40.054	info	javascript.0 (14362) script.js.E-Test.ERR_setObject: === Execution 10 of 10 =====
18:59:40.055	info	javascript.0 (14362) script.js.E-Test.ERR_setObject: Does state exist per existsState(): NO
18:59:40.057	info	javascript.0 (14362) script.js.E-Test.ERR_setObject: Does state exist per $(TEST_STATE).length: YES
18:59:42.055	info	javascript.0 (14362) script.js.E-Test.ERR_setObject: === Execution 11 of 10 =====
18:59:42.055	info	javascript.0 (14362) script.js.E-Test.ERR_setObject: 10 intervals completed. We stop further execution.

Log of Test 2:

19:09:37.203	info	javascript.0 (14362) Start javascript script.js.E-Test.ERR_setObject
19:09:37.207	info	javascript.0 (14362) script.js.E-Test.ERR_setObject: ______________________________________________________________________________________
19:09:37.208	info	javascript.0 (14362) script.js.E-Test.ERR_setObject: registered 0 subscriptions and 0 schedules
19:09:39.208	info	javascript.0 (14362) script.js.E-Test.ERR_setObject: Start creating state [0_userdata.0.Test_1]. Option DELETE_STATE set to false
19:09:39.209	warn	javascript.0 (14362) script.js.E-Test.ERR_setObject: Please note: for this test, you need to delete the state after creation by this script manually within ioBroker admin, tab "Objects". You will have max 18 seconds to proceed.
19:09:41.210	info	javascript.0 (14362) script.js.E-Test.ERR_setObject: === Execution 1 of 10 =====
19:09:41.211	info	javascript.0 (14362) script.js.E-Test.ERR_setObject: Does state exist per existsState(): YES
19:09:41.212	info	javascript.0 (14362) script.js.E-Test.ERR_setObject: Does state exist per $(TEST_STATE).length: YES
19:09:43.210	info	javascript.0 (14362) script.js.E-Test.ERR_setObject: === Execution 2 of 10 =====
19:09:43.210	info	javascript.0 (14362) script.js.E-Test.ERR_setObject: Does state exist per existsState(): YES
19:09:43.212	info	javascript.0 (14362) script.js.E-Test.ERR_setObject: Does state exist per $(TEST_STATE).length: YES
19:09:45.210	info	javascript.0 (14362) script.js.E-Test.ERR_setObject: === Execution 3 of 10 =====
19:09:45.211	info	javascript.0 (14362) script.js.E-Test.ERR_setObject: Does state exist per existsState(): YES
19:09:45.212	info	javascript.0 (14362) script.js.E-Test.ERR_setObject: Does state exist per $(TEST_STATE).length: YES
19:09:47.211	info	javascript.0 (14362) script.js.E-Test.ERR_setObject: === Execution 4 of 10 =====
19:09:47.211	info	javascript.0 (14362) script.js.E-Test.ERR_setObject: Does state exist per existsState(): YES
19:09:47.212	info	javascript.0 (14362) script.js.E-Test.ERR_setObject: Does state exist per $(TEST_STATE).length: NO
19:09:49.211	info	javascript.0 (14362) script.js.E-Test.ERR_setObject: === Execution 5 of 10 =====
19:09:49.211	info	javascript.0 (14362) script.js.E-Test.ERR_setObject: Does state exist per existsState(): YES
19:09:49.212	info	javascript.0 (14362) script.js.E-Test.ERR_setObject: Does state exist per $(TEST_STATE).length: NO
19:09:51.210	info	javascript.0 (14362) script.js.E-Test.ERR_setObject: === Execution 6 of 10 =====
19:09:51.211	info	javascript.0 (14362) script.js.E-Test.ERR_setObject: Does state exist per existsState(): YES
19:09:51.212	info	javascript.0 (14362) script.js.E-Test.ERR_setObject: Does state exist per $(TEST_STATE).length: NO
19:09:53.211	info	javascript.0 (14362) script.js.E-Test.ERR_setObject: === Execution 7 of 10 =====
19:09:53.211	info	javascript.0 (14362) script.js.E-Test.ERR_setObject: Does state exist per existsState(): YES
19:09:53.213	info	javascript.0 (14362) script.js.E-Test.ERR_setObject: Does state exist per $(TEST_STATE).length: NO
19:09:55.211	info	javascript.0 (14362) script.js.E-Test.ERR_setObject: === Execution 8 of 10 =====
19:09:55.211	info	javascript.0 (14362) script.js.E-Test.ERR_setObject: Does state exist per existsState(): YES
19:09:55.212	info	javascript.0 (14362) script.js.E-Test.ERR_setObject: Does state exist per $(TEST_STATE).length: NO
19:09:57.211	info	javascript.0 (14362) script.js.E-Test.ERR_setObject: === Execution 9 of 10 =====
19:09:57.212	info	javascript.0 (14362) script.js.E-Test.ERR_setObject: Does state exist per existsState(): YES
19:09:57.213	info	javascript.0 (14362) script.js.E-Test.ERR_setObject: Does state exist per $(TEST_STATE).length: NO
19:09:59.212	info	javascript.0 (14362) script.js.E-Test.ERR_setObject: === Execution 10 of 10 =====
19:09:59.212	info	javascript.0 (14362) script.js.E-Test.ERR_setObject: Does state exist per existsState(): YES
19:09:59.213	info	javascript.0 (14362) script.js.E-Test.ERR_setObject: Does state exist per $(TEST_STATE).length: NO
19:10:01.212	info	javascript.0 (14362) script.js.E-Test.ERR_setObject: === Execution 11 of 10 =====
19:10:01.212	info	javascript.0 (14362) script.js.E-Test.ERR_setObject: 10 intervals completed. We stop further execution.

Thanks!
P.S. Using: _js-controller 2.2.7, JS Adapter 4.3.4

@Mic-M
Copy link
Contributor Author

Mic-M commented Jan 17, 2020

By the way, my workaround for checking if a state is not existing is as follows:

if( ($(FULL_STATE_ID).length < 1) || (!existsState(FULL_STATE_ID)) ) {

@stale
Copy link

stale bot commented Jul 27, 2020

This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs within the next 7 days. Please check if the issue is still relevant in the most current version of the adapter and tell us. Also check that all relevant details, logs and reproduction steps are included and update them if needed. Thank you for your contributions.
Dieses Problem wurde automatisch als veraltet markiert, da es in letzter Zeit keine Aktivitäten gab. Es wird geschlossen, wenn nicht innerhalb der nächsten 7 Tage weitere Aktivitäten stattfinden. Bitte überprüft, ob das Problem auch in der aktuellsten Version des Adapters noch relevant ist, und teilt uns dies mit. Überprüft auch, ob alle relevanten Details, Logs und Reproduktionsschritte enthalten sind bzw. aktualisiert diese. Vielen Dank für Eure Unterstützung.

@stale stale bot added the wontfix label Jul 27, 2020
@stale
Copy link

stale bot commented Aug 3, 2020

This issue has been automatically closed because of inactivity. Please open a new issue if still relevant and make sure to include all relevant details, logs and reproduction steps. Thank you for your contributions.
Dieses Problem wurde aufgrund von Inaktivität automatisch geschlossen. Bitte öffnet ein neues Issue, falls dies noch relevant ist und stellt sicher das alle relevanten Details, Logs und Reproduktionsschritte enthalten sind. Vielen Dank für Eure Unterstützung.

@stale stale bot closed this as completed Aug 3, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant