Skip to content

Regression introduced in v25.3.0 for thermostat_weekly_schedule when sending number as dayofweek #11233

@uiopak

Description

@uiopak

Prior to changes in Koenkk/zigbee-herdsman#1479
Received dayofweek value was at start assigned in payload, later in code was logic for handling strings/arrays, but if it did not run payload still had value from start.

After changes from v25.3.0 if dayofweek contains number (value for bitmap) payload will have 0 if dayofweek, because it is set as default value and only logic for string/array of days can override it.

I propose simple change of https://github.com/Koenkk/zigbee-herdsman-converters/blob/master/src/converters/toZigbee.ts#L1612-L1626:

let dayofweek: number;

if (typeof daysofweek === "number") {
    dayofweek = daysofweek;
} else if (Array.isArray(daysofweek)) {
    dayofweek = 0;
    for (let d of daysofweek) {
        if (typeof d === "object") {
            if (d.day == null) {
                throw new Error(`weekly_schedule: expected dayofweek to be string or {"day": "str"}, but got '${JSON.stringify(d)}'!`);
            }
            d = d.day;
        }
        // lookup dayofweek bit
        d = utils.getKey(constants.thermostatDayOfWeek, d.toLowerCase(), d, Number);
        dayofweek |= 1 << d;
    }
} else {
    dayofweek = 0;
}

From what i understand valid number should have value between 0 and 255 (zigbee cluster documentation section 6. 3. 2 .3 .2 . 4 Figure 6-7. states map8 as data type) , and maybe we could throw Error when it is outside this range.

let dayofweek: number;

if (typeof daysofweek === "number") {
    if (daysofweek < 0 || daysofweek > 255) {
        throw new Error(`weekly_schedule: expected dayofweek to be between 0 and 255, but got '${daysofweek}'!`);
    }
    dayofweek = daysofweek;
} else if (Array.isArray(daysofweek)) {
    dayofweek = 0;
    for (let d of daysofweek) {
        if (typeof d === "object") {
            if (d.day == null) {
                throw new Error(`weekly_schedule: expected dayofweek to be string or {"day": "str"}, but got '${JSON.stringify(d)}'!`);
            }
            d = d.day;
        }
        // lookup dayofweek bit
        d = utils.getKey(constants.thermostatDayOfWeek, d.toLowerCase(), d, Number);
        dayofweek |= 1 << d;
    }
} else {
    dayofweek = 0;
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions