Generated states, messages and log entries
Where do I find yesterday, last week, last month (previous states)?
In short: Completed periods are stored under sourceanalytix.0.<device>.currentYear.<category> in the states 01_previousDay (yesterday), 02_previousWeek (last week), 03_previousMonth (last month), 04_previousQuarter (last quarter) and 05_previousYear (last year). They are filled at the period rollover at midnight, so only after the first rollover, and only if "Previous period" is switched on in the instance.
Where the states are
<category> depends on what you switched on for the datapoint and on whether the price definition describes costs or earnings:
Folder under currentYear | Content | When it exists |
|---|---|---|
consumed | Consumption | "Calculate consumption" on, price definition of type Costs |
delivered | Feed-in or generation | "Calculate consumption" on, price definition of type Earnings |
costs | Costs | "Calculate costs" on, price definition of type Costs |
earnings | Earnings | "Calculate costs" on, price definition of type Earnings |
meterReadings | Meter reading at the end of the period | "Store Meter Values" on |
Each of these folders has the same five previous-period states. For example, yesterday's electricity consumption is in sourceanalytix.0.<device>.currentYear.consumed.01_previousDay, and the matching costs are in sourceanalytix.0.<device>.currentYear.costs.01_previousDay. meterReadings doesn't contain consumption but the meter reading (cumulativeReading) at the moment of the rollover.
If "Weekday" is also switched on, you'll find the days of last week individually under currentYear.<category>.previousWeek, e.g. previousWeek.01_Monday to previousWeek.07_Sunday.
The same values are also in the JSON state sourceanalytix.0.<device>.statisticsJson, see JSON with all values.
From v0.7.0, the source detail in the instance settings shows these values in the "Values" table, with the rows "Yesterday", "Last week", "Last month", "Last quarter" and "Last year" for consumption and costs.
When they are filled
At the period rollover, SourceAnalytix copies the value of the current period into the matching previous-period state, for example 01_currentDay to 01_previousDay. The current period then starts at 0 again.
| State | First filled |
|---|---|
01_previousDay | after the first midnight |
02_previousWeek | on the first Monday at 0:00 (weeks start on Monday) |
03_previousMonth | on the 1st of the next month at 0:00 |
04_previousQuarter | on January 1, April 1, July 1 or October 1 at 0:00 |
05_previousYear | on January 1 at 0:00 |
Until the first rollover, the states contain 0. That is not an error. The rollover follows the clock of the machine or container that ioBroker runs on.
The value is exactly what the current period held at the time of the rollover. If you enabled a datapoint in the middle of the week and didn't enter start values, the first 02_previousWeek only contains the days since activation.
If ioBroker was down at midnight, SourceAnalytix catches up the rollover at the next start. It also checks every hour whether a rollover is missing. For more, see Catching up the day rollover.
Timestamps
Since v0.5.5, the previous-period states don't carry the time of the rollover. They carry 23:59:59 on the last day of the period they belong to. So yesterday's value has the timestamp yesterday 23:59:59. This way, history adapters and charts plot the value in the correct period.
WARNING
If ioBroker was down for several days, 01_previousDay doesn't hold yesterday's consumption after the start, but that of the last day SourceAnalytix still counted. The timestamp is still yesterday 23:59:59. There are no separate values for the days in between. After a longer outage, check the values in the history adapter.
Because the timestamp lies in the past, a history adapter may treat the value differently from an ordinary new value. If the rollover is caught up later in the day, the value still gets the timestamp of yesterday 23:59:59.
If the states are missing or stay empty
- Open the SourceAnalytix instance settings, "Main settings" tab, "Current year" section.
- Check that "Previous period" is switched on (default: on). For the individual weekdays of last week, "Weekday" must also be on.
- Check on the source whether "Consumption" or "Costs" is switched on (from v0.7.0 in the source detail, up to v0.6.x in the custom settings dialog of the datapoint under "Calculate consumption" and "Calculate costs"). Previous-period states are only created for these folders.
- Wait for the next period rollover. Until then, the state contains 0.
WARNING
If you switch "Previous period" off, SourceAnalytix deletes the previous-period states the next time the instance starts. If you switch it on again, they start at 0 and are only filled again at the next rollover. Recordings in a history adapter are kept.
From v0.6.2: If ioBroker or the datapoint was down over midnight, SourceAnalytix splits the consumption of the gap between both days by time. As soon as the first value arrives after the outage, the share that falls on the old day is added to 01_previousDay afterwards (and, at a week, month or year rollover, to the other previous periods). Up to v0.6.1, the whole gap counted toward the new day (#1260).
From v0.6.2: For power sources in W, the energy up to midnight is credited to the ending day. Up to v0.6.1, it was lost at every rollover, so 01_previousDay was slightly too low (#1254).
See also: Which week, month and quarter states and weekdays are there? · When are values updated: live or at midnight? · What happens at the turn of the year?
Which week, month and quarter states and weekdays are there?
In short: Under sourceanalytix.0.<device>.currentYear.<category>, besides day, week, month, quarter and year, you can optionally get the values of each weekday, each calendar week, each month and each quarter of the current year. You choose which ones exist in the instance settings on the "Main settings" tab, in the "Current year" section. Rolling values like "the last 7 days" don't exist.
The tree of the current year
sourceanalytix.0.<device>
├── cumulativeReading
├── statisticsJson
└── currentYear
└── <category>
├── 01_currentDay … 05_currentYear
├── 01_previousDay … 05_previousYear
├── currentWeek.01_Monday … 07_Sunday
├── previousWeek.01_Monday … 07_Sunday
├── weeks.01 … 53
├── months.01_January … 12_December
└── quarters.Q1 … Q4<category> is consumed or delivered (consumption or feed-in), costs or earnings (costs or earnings) and meterReadings (meter readings). Under meterReadings there are no 0X_current… states. The current reading is in cumulativeReading.
| States | Content | Option under "Current year" | Reset to 0 |
|---|---|---|---|
01_currentDay to 05_currentYear | current day, week, month, quarter, year | always present | at the period rollover |
01_previousDay to 05_previousYear | completed previous period | "Previous period" | never, overwritten at the next rollover |
currentWeek.01_Monday to 07_Sunday | value of each day of the current week | "Weekday" | Mondays at 0:00 |
previousWeek.01_Monday to 07_Sunday | value of each day of the previous week | "Weekday" and "Previous period" | never, overwritten on Mondays |
weeks.01 to 53 | value of the calendar week per ISO 8601, Monday to Sunday | "Weeks" | on January 1 |
months.01_January to 12_December | value of the month | "Months" | on January 1 |
quarters.Q1 to Q4 | value of the quarter | "Quarters" | on January 1 |
The weekdays are called 01_Monday, 02_Tuesday, 03_Wednesday, 04_Thursday, 05_Friday, 06_Saturday and 07_Sunday, the months 01_January to 12_December. There are always 53 week states, even in years with 52 calendar weeks. The days from December 29 to 31 that already belong to week 01 of the new year are not under weeks, see Why does week 52/53 show values in the new year?.
Keeping values beyond the year
On January 1, SourceAnalytix resets weeks, months and quarters under currentYear to 0. To keep the values of previous years, switch on "Weeks", "Months" or "Quarters" in the "Year statistics" section. SourceAnalytix then creates a separate folder for each year, sourceanalytix.0.<device>.<year>.<category>.weeks, .months or .quarters, which is kept. For more, see What happens at the turn of the year?.
The last 7 days
SourceAnalytix doesn't calculate a rolling value over the last 7 days. currentWeek.<weekday> holds the days of the current week from Monday, and previousWeek.<weekday> holds the days of the whole previous week. For the last 7 days, take the matching days from both folders. Hourly and rolling values are planned (#424).
When the rollover happens
SourceAnalytix switches periods at 0:00 according to the system clock. It also checks every hour and at startup whether a rollover is missing, and catches it up. From v0.7.0 you can also do this by hand with the "Recover periods" action on a source or with the state info.recoverPeriods, see ioBroker was down at midnight.
From v0.6.2: The week archive in the year folder follows the year of the ISO calendar week. Week 01, which already starts at the end of December, ends up in the folder of the new year and no longer overwrites week 01 of the old year (#1256).
See also: Where do I find yesterday, last week, last month (previous states)? · Which instance settings are there (periods, decimals)? · Why do week, month, quarter and year values differ?
Is there a JSON with all values (for VIS)?
In short: Yes. Every source has the state sourceanalytix.0.<device>.statisticsJson. It contains all values of the current year as one JSON: consumption, costs and meter readings, each for the current periods, the previous periods, and the weekdays, weeks, months and quarters. You don't have to switch anything on for it.
Structure
A shortened example for an electricity source:
{
"schemaVersion": 1,
"year": 2026,
"source": { "id": "<datapoint ID>", "name": "Strom Haus", "unit": "kWh" },
"quantity": {
"type": "consumed",
"current": { "day": 4.2, "week": 31.7, "month": 120.4, "quarter": 410.9, "year": 2950.3 },
"previous": { "day": 5.1, "week": 33.2, "month": 140.8, "quarter": 420.5, "year": 3510.6 },
"periods": {
"weekdays": { "1": 5.3, "2": 4.2 },
"previousWeekdays": { "1": 4.9, "2": 5.0, "3": 4.4, "4": 4.6, "5": 4.8, "6": 5.2, "7": 4.3 },
"weeks": { "45": 33.2, "46": 31.7 },
"months": { "10": 140.8, "11": 120.4 },
"quarters": { "3": 420.5, "4": 410.9 }
}
},
"financial": {
"type": "costs",
"currency": "€",
"current": { "day": 1.34, "week": 10.14, "month": 38.53, "quarter": 131.49, "year": 944.1 },
"previous": { "day": 1.63, "week": 10.62, "month": 45.06, "quarter": 134.56, "year": 1123.39 },
"periods": { "weekdays": {}, "previousWeekdays": {}, "weeks": {}, "months": {}, "quarters": {} }
},
"meterReadings": {
"current": 48213.4,
"previous": { "day": 48209.2, "week": 48181.7, "month": 48093, "quarter": 47802.5, "year": 45263.1 },
"periods": { "weekdays": {}, "previousWeekdays": {}, "weeks": {}, "months": {}, "quarters": {} }
}
}| Field | Content |
|---|---|
schemaVersion | Version of the structure, currently 1 |
year | the current year |
source | id of the datapoint, name of the source, unit = target unit |
quantity | Consumption (type: consumed) or feed-in (delivered); null if "Consumption" is off |
financial | Costs (costs) or earnings (earnings) with currency; null if "Costs" is off |
meterReadings | Meter readings; current is the total from cumulativeReading; null if "Store meter readings" is off |
current | current periods day to year, from 01_currentDay to 05_currentYear |
previous | previous periods from 01_previousDay to 05_previousYear; null if "Previous period" is off |
periods.weekdays, periods.previousWeekdays | weekdays of the current and the previous week, keys 1 (Monday) to 7 (Sunday) |
periods.weeks | calendar weeks, keys 01 to 53 |
periods.months | months, keys 01 to 12 |
periods.quarters | quarters, keys 1 to 4 |
A group under periods is null if the option under "Current year" is off. A value that doesn't exist yet is missing or null. The year archive (<ID>.<year>) is not part of the JSON.
When it is written
SourceAnalytix collects the changes of a value and writes the JSON at most every 300 ms, and only if the content has changed. At startup, it rebuilds the JSON from the existing states. If the source is deactivated, the last JSON stays in place but is no longer updated. The state is read-only (role json).
TIP
In a script, read the JSON with JSON.parse(getState('sourceanalytix.0.<device>.statisticsJson').val). That way, a table in VIS needs only one state instead of many individual ones.
See also: How do I visualize the values in VIS, Flot, HabPanel and the history? · How do I read SourceAnalytix values in a script? · Which week, month and quarter states and weekdays are there?
What happens at the turn of the year?
In short: On January 1 at 0:00, the year value moves to 05_previousYear, all current periods start at 0, and the weeks, months and quarters under currentYear are reset to 0. The total cumulativeReading keeps running. You only keep the monthly and weekly values of the old year with "Year statistics", in a year folder of their own.
What happens at the rollover
- Day, week, month, quarter and year roll over at the same time. With "Previous period", SourceAnalytix copies the values to
01_previousDaythrough05_previousYear, with the timestamp December 31, 23:59:59. - The start values of all periods are set to the current total.
01_currentDayto05_currentYearstart at 0. weeks,monthsandquartersundercurrentYearare set to 0 for consumption, costs and meter readings.- If "Weeks", "Months" or "Quarters" is on under "Year statistics", SourceAnalytix creates the folder
sourceanalytix.0.<device>.<new year>with these states and the annual totals (consumedCumulative,costsCumulative,readingCumulative). - The year folders of previous years stay unchanged.
WARNING
Without "Year statistics", the monthly, weekly and quarterly values of the old year can only be found in a history adapter after the rollover. By default, "Months" is on, and "Weeks" and "Quarters" are off.
You can safely delete old year folders if you no longer need them. SourceAnalytix only writes to the folder of the current year.
Prices at the turn of the year
If a price is "Valid from" January 1, SourceAnalytix uses it from 0:00. The basic fee is booked in full on January 1, as on the first of every month. From v0.6.2, priceDefinitions.<category>.currentPrice also jumps to the new price at that moment. Up to v0.6.1, this only happened after a restart (#1259).
If ioBroker was down at the turn of the year, SourceAnalytix catches up the rollover at the next start, see ioBroker was down at midnight.
From v0.6.2: The days from December 29 to 31 that belong to calendar week 01 of the new year end up in the week archive of the new year (#1256).
See also: How do I evaluate values across several years without adjusting everything every year? · Why does week 52/53 show values in the new year? · How do I start over with a datapoint and clean up old years?
How can I read and set prices as states?
In short: For every price definition there are states under sourceanalytix.0.priceDefinitions.<category> with the current and the configured price. currentPrice is writable: if you write a new price to it, it applies immediately to all sources of that price definition.
| State | Content | Writable |
|---|---|---|
priceDefinitions.<category>.currentPrice | Price per unit that currently applies, in <currency>/<unit> | yes |
priceDefinitions.<category>.configuredPrice | "Price per unit" from the table, only for "Fixed price" | no |
priceDefinitions.<category>.configuredPriceValidFrom | from when this price applies, as a timestamp in milliseconds | no |
priceDefinitions.<category>.configuredBasicPrice | "Price per month" from the table | no |
priceDefinitions.<category>.configuredBasicPriceValidFrom | from when the basic fee applies | no |
priceHistory.<category> | Price history as JSON, for example [{"ts":1767222000000,"price":0.32}] | no |
basicPriceHistory.<category> | History of the basic fee as JSON | no |
In state IDs, SourceAnalytix replaces every character of the category other than letters, digits, _ and - with _. So Strom Haus becomes priceDefinitions.Strom_Haus.currentPrice.
Setting the price via currentPrice
- Write the new price per unit as a number to
sourceanalytix.0.priceDefinitions.<category>.currentPrice, without acknowledgment (ack= false), for example from a script:setState('sourceanalytix.0.priceDefinitions.Strom.currentPrice', 0.29); - SourceAnalytix applies it to all sources of that price definition, stores it with the time in the price history and writes
Unit price for <category> was set to <price> through <state>to the log. - If the value is not a number, the old price stays, and the log shows
Writable price state <state> received invalid value ….
The new price applies from the moment of writing. It doesn't change costs that have already been calculated. For that, v0.7.0 and later have the "Recalculate costs from date" action, see Are calculated costs recalculated when I change the price, and how do I change it from a certain date?.
NOTE
With "Price source" set to "State value" or "Tariff selector", the next value of the price datapoint overwrites a price you wrote by hand. If you change the "Price per unit" in the table and save, that price applies again.
See also: How is a price definition structured (categories, basic fee, decimal mark)? · How do I use a dynamic electricity price (Tibber, Awattar)? · Which currency does SourceAnalytix use?
Why are meter readings cumulative?
In short: Under meterReadings you find meter readings, not consumption. Each state shows the total at the end of its period. That's why the value grows from month to month. You find the consumption of a period under consumed (or delivered).
cumulativeReading and meterReadings
| State | Content |
|---|---|
sourceanalytix.0.<device>.cumulativeReading | The total: SourceAnalytix's own meter reading in the target unit, unrounded. It is written with every new value. |
currentYear.meterReadings.months.<month>, .weeks.<NN>, .quarters.Q<n>, .currentWeek.<weekday> | The total, rounded, as last written in this period. It stays in place after the period ends, so it is the reading at the end of the period. |
currentYear.meterReadings.01_previousDay to 05_previousYear | The total at the moment of the period rollover |
<year>.meterReadings.… and <year>.readingCumulative | The same in the year archive, if "Year statistics" is on |
Example: if meterReadings.months.02_February holds 1,250 kWh and meterReadings.months.03_March holds 1,480 kWh, you consumed about 230 kWh in March. The exact value is in consumed.months.03_March.
The total includes the offset from reset detection. After a device reset, cumulativeReading therefore keeps showing the continuous reading, not the value the device currently reports. The terms are explained in What does "Device reset detected" mean and how does reset detection work?. If you want the total to match your real meter, use the "Align meter reading" action from v0.7.0, see Correcting wrong values.
meterReadings is only created if "Store meter readings" is on for the source. For when the folder stays empty, see What do the datapoint settings do (Costs, Consumption, Meter values)?.
From v0.6.2: A meter reading of exactly 0 is now also written under meterReadings. Up to v0.6.1, the state stayed empty in that case (#1253).
See also: How is consumption calculated, and why is currentYear lower than my meter reading? · How do I apply my real meter reading (cumulativeReading, RAW object)? · JSON with all values
Which currency does SourceAnalytix use?
In short: The currency from the ioBroker system settings. If none is set there, SourceAnalytix uses €. There is only one currency for all sources, and SourceAnalytix doesn't convert: the currency is just the unit on the cost states.
- The currency is the unit on all states under
costsandearnings, on the annual totalscostsCumulativeandearningsCumulative, and appears as<currency>/<unit>onpriceDefinitions.<category>.currentPrice. - You enter all prices in the price definitions in this currency, per target unit, so for example in €/kWh and not in cents/kWh.
- A price datapoint must also deliver the price in this currency per target unit. There is no conversion factor, for example from cents to euros. Convert beforehand, for example with an alias or a script.
IMPORTANT
SourceAnalytix only reads the currency at startup. If you change it in the system settings, restart the instance. Amounts that have already been calculated are not converted.
See also: How is a price definition structured (categories, basic fee, decimal mark)? · How can I read and set prices as states?
sendTo commands and info states
In short: SourceAnalytix accepts commands via sendTo. The settings page from v0.7.0 uses them itself, and you can also call them from scripts, for example recoverPeriods for a missed period rollover or setCumulative to align the meter reading. There are only two instance states: info.recoverPeriods and info.costRecalculation. There is no info.connection state.
Commands
All values are in the target unit of the source. Numbers may use a comma or a dot. source is always the ID of the source datapoint. With dryRun: true, SourceAnalytix only validates and returns a preview without changing anything.
| Command | Parameters | What it does |
|---|---|---|
recoverPeriods | {source} (optional, from v0.7.0) | Catches up missed day, week, month, quarter and year rollovers, with source only for this source, otherwise for all. Response: {recovered: <number of sources>}, for an inactive source {error: 'sourceNotActive'} |
getSources / checkProblems | – | Returns all sources with values, the problems, the price definitions, the units and the currency (both commands return the same) |
saveSource | source, settings, dryRun | Creates or changes the SourceAnalytix settings of a datapoint. settings contains only the fields that change, for example {deviceResetLogicEnabled: true}. Takes effect without a restart. |
setSourceEnabled | source, enabled | Activates (true) or deactivates (false) a source. The data stays. |
findCandidates | query | Searches for datapoints with a supported unit (50 at most), for the wizard |
setCumulative | source, value, dryRun | "Align meter reading": sets the total to value |
meterSwap | source, oldEnd, newStart, date, dryRun | "Meter swapped": end reading of the old meter, start reading of the new one (empty = 0), date for information only. Not for power sources. |
recalcCosts | source or priceDefinition, from, dryRun | "Recalculate costs from date" for one source or all sources of a price definition. from as a timestamp in ms or a date, not in the future. |
deleteSourceData | source or outputId, dryRun | "Delete data": deactivates the source, removes its SourceAnalytix settings and deletes its folder. With outputId, it also works for folders without a datapoint. |
SourceAnalytix also answers getPriceDefinitions, getUnits, getStartValueContext, getBasicRateSources and getUsedOutputIds. The wizard uses getUsedOutputIds to check whether a technical ID is already taken. The other commands used to fill selection lists and checks in the custom settings dialog of the datapoint, which from v0.7.0 only contains the switch to enable the source (#1286).
Example: align the meter reading, first as a preview.
sendTo('sourceanalytix.0', 'setCumulative', { source: '<datapoint ID>', value: 12475, dryRun: true }, result => {
log(JSON.stringify(result));
});If something goes wrong, the response contains error and message, for example sourceNotActive if the source isn't running, invalidValue for an invalid number or invalidDate for a date in the future. For invalid fields, saveSource returns invalidSettings and lists the affected fields under errors.
CAUTION
deleteSourceData without dryRun deletes the folder of the source with all values and years and removes its settings on the datapoint. This cannot be undone.
Info states
| State | Content |
|---|---|
sourceanalytix.0.info.recoverPeriods | Button (role button). If you write true to it, SourceAnalytix catches up missed period rollovers and resets the state to false. This also works while SourceAnalytix is otherwise not calculating. |
sourceanalytix.0.info.costRecalculation | Progress of "Recalculate costs from date" as JSON: running, done, total, from, sources, ts. Only created the first time you recalculate (from v0.7.0). |
SourceAnalytix doesn't create an info.connection state, because there is no connection to a device that it could report. If it's missing from the object list, that is not an error.
See also: ioBroker was down at midnight · How do I read SourceAnalytix values in a script? · How do I correct wrong, too high or negative values after a reset?
Log warnings (output ID, prices)
In short: The most important SourceAnalytix messages are listed below with their meaning. <datapoint> is the ID of the source, <category> the name of the price definition. For normal operation, the log level "warn" is enough. You only need info messages during setup or troubleshooting.
Startup and setup
| Message | Level | Meaning |
|---|---|---|
Found <n> SourceAnalytix enabled states | info | This many sources are enabled. |
Successfully activated SourceAnalytix for all <n> of <n> states … | info | All sources are running. |
Partially activated SourceAnalytix for <n> of <m> states, check error messages! | warn | Some sources aren't running. The cause is in the errors before this message. |
Initialization of <datapoint> failed, check warn messages ! / Cannot handle calculations for <datapoint>, check log messages and adjust settings! | error | This source doesn't start, see Initialization failed. |
No unit defined for <datapoint>, cannot execute calculations ! | error | Unit missing or not recognised, see No unit defined. |
Unit <unit> of <datapoint> cannot be converted to unit <unit> of price definition <category> | error | The unit of the source doesn't match the price definition. |
No cost type defined for <datapoint> … / Selected Type <category> does not exist in Price Definitions | error | No price definition selected, or a deleted one, see No cost type defined. |
Unit "<spelling>" of <datapoint> is used as <unit> | info | From v0.6.2: a spelling such as m3 is read as m³. |
Start value <period> (<value>) of <datapoint> is larger than the current total … | warn | A start value is larger than the total. The values of this period become negative. |
The basic fee of price definition <category> is included by <n> sources … | info | Several sources book the same basic fee (from v0.7.0). |
Output ID
| Message | Level | Meaning |
|---|---|---|
Migrated SourceAnalytix output for <datapoint> from <old> to <new> | info | The technical ID was changed and the folder has been moved. |
Cannot use output ID "<ID>" for <datapoint>: <reason>; keeping "<old>" | warn | The new ID is invalid, already in use, or the move failed. The old ID stays. |
Cannot use output ID … no existing output tree to keep | error | The ID is unusable and there is no old folder. The source doesn't start. |
Removed incomplete output migration for <datapoint>; migration … will be retried | warn | An interrupted move is retried at startup. |
Prices
| Message | Level | Meaning |
|---|---|---|
Price definition <category> has no valid unit price …, using 0 … | warn | The price is not a number. Costs stay at 0. |
Price source state <state> for <category> has no valid value or tariff, using configured fallback price … | warn | The price datapoint is empty or invalid. The "Price per unit" applies. |
Price definition <category> uses a state price source but no state ID is configured … | warn | With "State value" or "Tariff selector", the "Price state" is missing. |
Unit price for <category> changed from <old> to <new> | info | The price has changed. With the addition (valid from date reached) when a "Valid from" date has been reached (from v0.6.2). |
Stored unit price <price> for <category> at <time> / Stored monthly basic price … | info | A new price was written to the price history. |
Calculation, reset and period rollover
| Message | Level | Meaning |
|---|---|---|
Initiating <datapoint> for the first time in SourceAnalytix | info | First value of a new source. |
Value … of <datapoint> is not a number, reading ignored | warn | The source delivers text that isn't a number, see Text instead of number. |
[calculationHandler] Waiting for another reading before confirming a possible device reset … | info | Possible reset. SourceAnalytix waits for the next value. |
Device reset detected for <datapoint>; preserving cumulative value … | warn | Reset confirmed. The total keeps running. |
Rejected a possible device reset … / Rolled back the device reset … | warn | The low value was an outlier, see Device reset detected. |
Known valueAtDeviceReset … is larger than the known cumulative value … / Realigned valueAtDeviceReset … | warn | Offset larger than the total. SourceAnalytix aligns it itself (from v0.6.2). |
No new power value from <datapoint> for <n> min, longer than the maximum gap … | info | From v0.7.0: a gap in a power source is not counted. |
Processing calendar rollover for <datapoint>: … / Processed calendar rollover for <n> source(s), triggered by … | info | A period rollover was processed, either regularly or caught up. |
Reading gap of <datapoint> from … to …: booking … | info | From v0.6.2: the consumption of a gap over midnight is split between both days. |
Actions on the settings page (from v0.7.0)
| Message | Meaning |
|---|---|
Created … / Changed SourceAnalytix settings of <datapoint> from the settings page | Source created or changed |
Activated … / Deactivated <datapoint> from the settings page | Source activated or deactivated |
Meter reading of <datapoint> aligned from <old> to <new> … | "Align meter reading" was run |
Meter swap for <datapoint> applied: … / First reading … of the new meter received … | "Meter swapped" was run, first value of the new meter has arrived |
Costs of <datapoint> recalculated from <date> for <n> periods | "Recalculate costs from date" finished |
Deleted the data of <datapoint>: <n> states in <folder> | "Delete data" was run |
All messages about an error in the code start with [<function>] error: and include the stack. If the Sentry plugin is active, the error is also sent to the developer (Error sent to Sentry, thank you for collaborating!). From v0.6.2, the error is always in the log, even without Sentry (#1261).
See also: Log messages and errors during setup · High CPU/memory load and too much log output
Migrating from older versions and legacy settings
In short: SourceAnalytix takes over data from older versions by itself at startup. You don't have to do anything. Some old settings still exist in the instance, but they no longer have any effect.
What SourceAnalytix changes at startup
| What | What happens |
|---|---|
| Technical ID (output ID) | If a source doesn't have one yet, SourceAnalytix uses the previous ID (datapoint ID with __ instead of dots) and writes it to the settings of the source. The folder stays where it is. |
| Decimals | If a source has no decimals of its own, it gets the instance template once and keeps it afterwards, see Decimals. |
| Total from very old versions | If cumulativeReading is missing or 0, SourceAnalytix reads the reading from <ID>.Current_Reading or <ID>.Meter_Readings.Current_Reading of old versions. |
| Cost memory | An old cost memory that included the basic fee is converted so that the basic fee isn't counted twice after a restart (Migrated dynamic cost memory for <datapoint> to variable-cost schema version 2). |
Moving the technical ID
If you change the technical ID, SourceAnalytix copies the folder, checks the copy and then deletes the old folder, see How do I name the datapoint (alias, output ID)?. If the instance stops in the middle, SourceAnalytix removes an incomplete copy at the next start and tries again (Removed incomplete output migration … will be retried), or it cleans up the old folder after a verified copy (Completed pending output migration cleanup …).
Old settings without effect
The instance data still contains store_days, store_years, store_period, keep_days, keep_weeks, keep_months, keep_quarters, keep_years, impuls and status_logging. No user interface shows them, and SourceAnalytix doesn't read them. Options such as "Status messages to log" or "Number of days" from old forum posts no longer exist. From v0.7.0, you set up pulse counters on the source, see Pieces and pulses.
From v0.6.2: The old stored value valueAtDeviceInit is no longer needed (#1263). From v0.7.0, the settings page hides it, valueAtDeviceReset and pendingMeterSwap, and never overwrites them. Only SourceAnalytix itself or an action such as "Align meter reading" changes these values.
Messages about day, week or month rollovers from versions before 0.5 are obsolete since the period rework in 0.5. If you're still running a version that old, update, see How do I update SourceAnalytix (and what is a downgrade)?.
See also: Known bugs in older versions · After an update or restore, values are 0
Other (unfinished/internal functions)
In short: A few things in the code are internal or unfinished. What matters to you: there is no separate VIS widget JSON, use statisticsJson. Debug output of the price and unit definitions doesn't go to the ioBroker log but to the console of the process.
| Function | Status |
|---|---|
| VIS widget JSON | Commented-out code only. All values for VIS are in statisticsJson. |
| Debug output | At startup, SourceAnalytix writes the loaded units and prices with console.debug to the standard output of the process, for example to the Docker or systemd log, regardless of the log level. It doesn't appear in the ioBroker log. |
| Error reports (Sentry) | SourceAnalytix reports errors in the code to the developer through the ioBroker Sentry plugin, if the plugin is active. |
| Pulse counters | Up to v0.6.x only a placeholder in the code. From v0.7.0 there are piece, piece/min and "Pulses per unit of the price definition", see Pieces and pulses. |
| Cleaning up old folders | There is no automatic cleanup. From v0.7.0 you delete the folder of a source with the "Delete data" action. Folders whose datapoint is missing are shown in the "Overview" as "Folder without datapoint" (#1265). |
| Custom periods | A placeholder in the code (reading_start = 0) is meant for freely selectable billing periods. They are not implemented but planned (#595). |
| Monitoring all objects | SourceAnalytix subscribes to changes of all objects. That way it notices without a restart when you enable or change a source. |
See also: JSON with all values · How do I switch off a datapoint or remove sources and states? · Log warnings