Erzeugte States, Nachrichten und Log-Meldungen
Wo finde ich gestern, letzte Woche, letzten Monat (previous-States)?
Kurz: Die abgeschlossenen Perioden stehen unter sourceanalytix.0.<Gerät>.currentYear.<Kategorie> in den States 01_previousDay (gestern), 02_previousWeek (letzte Woche), 03_previousMonth (letzter Monat), 04_previousQuarter (letztes Quartal) und 05_previousYear (letztes Jahr). Sie werden beim Periodenwechsel um Mitternacht gefüllt, also erst nach dem ersten Wechsel, und nur, wenn in der Instanz „Vorheriger Zeitraum" eingeschaltet ist.
Wo die States liegen
<Kategorie> hängt davon ab, was du am Datenpunkt eingeschaltet hast und ob die Preisdefinition Kosten oder Erträge beschreibt:
Ordner unter currentYear | Inhalt | Wann vorhanden |
|---|---|---|
consumed | Verbrauch | „Verbrauch berechnen" an, Preisdefinition vom Typ Kosten |
delivered | Einspeisung oder Erzeugung | „Verbrauch berechnen" an, Preisdefinition vom Typ Erträge |
costs | Kosten | „Kosten berechnen" an, Preisdefinition vom Typ Kosten |
earnings | Erträge | „Kosten berechnen" an, Preisdefinition vom Typ Erträge |
meterReadings | Zählerstand am Ende der Periode | „Zählerwerte speichern" an |
Jeder dieser Ordner hat dieselben fünf Vorperioden-States. Beispiel für den Stromverbrauch von gestern: sourceanalytix.0.<Gerät>.currentYear.consumed.01_previousDay, die Kosten dazu stehen in sourceanalytix.0.<Gerät>.currentYear.costs.01_previousDay. In meterReadings steht kein Verbrauch, sondern der Zählerstand (cumulativeReading) im Moment des Wechsels.
Ist zusätzlich „Wochentag" eingeschaltet, findest du die Tage der letzten Woche einzeln unter currentYear.<Kategorie>.previousWeek, z. B. previousWeek.01_Monday bis previousWeek.07_Sunday.
Dieselben Werte stehen auch im JSON-State sourceanalytix.0.<Gerät>.statisticsJson, siehe JSON mit allen Werten.
Ab v0.7.0 zeigt die Detailansicht der Quelle in den Instanz-Einstellungen diese Werte in der Tabelle „Werte“, mit den Zeilen „Gestern“, „Letzte Woche“, „Vormonat“, „Vorquartal“ und „Vorjahr“ für Verbrauch und Kosten.
Wann sie gefüllt werden
Beim Periodenwechsel kopiert SourceAnalytix den Wert der laufenden Periode in den passenden Vorperioden-State, zum Beispiel 01_currentDay nach 01_previousDay. Danach beginnt die laufende Periode wieder bei 0.
| State | Zum ersten Mal gefüllt |
|---|---|
01_previousDay | nach der ersten Mitternacht |
02_previousWeek | am ersten Montag um 0:00 Uhr (Wochen beginnen montags) |
03_previousMonth | am 1. des nächsten Monats um 0:00 Uhr |
04_previousQuarter | am 1. Januar, 1. April, 1. Juli oder 1. Oktober um 0:00 Uhr |
05_previousYear | am 1. Januar um 0:00 Uhr |
Bis zum ersten Wechsel steht in den States 0. Das ist kein Fehler. Der Wechsel richtet sich nach der Uhrzeit des Rechners oder Containers, auf dem ioBroker läuft.
Der Wert ist genau das, was zum Zeitpunkt des Wechsels in der laufenden Periode stand. Hast du einen Datenpunkt mitten in der Woche aktiviert und keine Startwerte eingetragen, enthält die erste 02_previousWeek nur die Tage seit der Aktivierung.
War ioBroker um Mitternacht aus, holt SourceAnalytix den Wechsel beim nächsten Start nach, außerdem prüft es stündlich, ob ein Wechsel fehlt. Mehr dazu unter Tageswechsel nachholen.
Zeitstempel
Seit v0.5.5 tragen die Vorperioden-States nicht die Uhrzeit des Wechsels, sondern 23:59:59 Uhr am letzten Tag der Periode, zu der sie gehören. Der Wert von gestern steht also bei gestern 23:59:59 Uhr. So zeichnen History-Adapter und Diagramme den Wert in der richtigen Periode ein.
WARNING
War ioBroker mehrere Tage aus, steht in 01_previousDay nach dem Start nicht der Verbrauch von gestern, sondern der des letzten Tages, den SourceAnalytix noch gezählt hat. Der Zeitstempel ist trotzdem gestern 23:59:59 Uhr. Für die Tage dazwischen gibt es keine eigenen Werte. Prüfe nach einem längeren Ausfall die Werte im History-Adapter.
Weil der Zeitstempel in der Vergangenheit liegt, kann ein History-Adapter den Wert anders behandeln als einen gewöhnlichen neuen Wert. Wird der Wechsel erst später am Tag nachgeholt, bekommt der Wert trotzdem den Zeitstempel von gestern 23:59:59 Uhr.
Wenn die States fehlen oder leer bleiben
- Öffne die Instanz-Einstellungen von SourceAnalytix, Reiter „Haupteinstellungen", Bereich „Laufendes Jahr".
- Prüfe, ob „Vorheriger Zeitraum" eingeschaltet ist (Standard: an). Für die einzelnen Wochentage der Vorwoche muss auch „Wochentag" an sein.
- Prüfe an der Quelle, ob „Verbrauch" oder „Kosten" eingeschaltet ist (ab v0.7.0 in der Detailansicht der Quelle, bis v0.6.x im Objekt-Dialog „Verbrauch berechnen" und „Kosten berechnen"). Nur für diese Ordner entstehen Vorperioden-States.
- Warte den nächsten Periodenwechsel ab. Bis dahin steht 0 im State.
WARNING
Schaltest du „Vorheriger Zeitraum" aus, löscht SourceAnalytix die Vorperioden-States beim nächsten Start der Instanz. Schaltest du es wieder ein, beginnen sie bei 0 und werden erst beim nächsten Wechsel wieder gefüllt. Aufzeichnungen in einem History-Adapter bleiben erhalten.
Ab v0.6.2: War ioBroker oder der Datenpunkt über Mitternacht aus, verteilt SourceAnalytix den Verbrauch der Lücke nach Zeit auf beide Tage. Sobald der erste Wert nach dem Ausfall kommt, wird der Anteil, der auf den alten Tag fällt, nachträglich zu 01_previousDay (und bei Wochen-, Monats- oder Jahreswechsel zu den anderen Vorperioden) addiert. Bis v0.6.1 zählte die ganze Lücke zum neuen Tag (#1260).
Ab v0.6.2: Bei Leistungsquellen in W wird die Energie bis Mitternacht dem endenden Tag zugerechnet. Bis v0.6.1 ging sie bei jedem Wechsel verloren, 01_previousDay war dadurch etwas zu niedrig (#1254).
Siehe auch: Welche Wochen-, Monats- und Quartals-States gibt es? · Wann werden Werte aktualisiert? · Was passiert beim Jahreswechsel?
Welche Wochen-, Monats- und Quartals-States und Wochentage gibt es?
Kurz: Unter sourceanalytix.0.<Gerät>.currentYear.<Kategorie> stehen neben Tag, Woche, Monat, Quartal und Jahr auf Wunsch die Werte jedes Wochentags, jeder Kalenderwoche, jedes Monats und jedes Quartals des laufenden Jahres. Welche es gibt, legst du in den Instanz-Einstellungen im Tab „Haupteinstellungen“, Bereich „Laufendes Jahr“ fest. Gleitende Werte wie „die letzten 7 Tage“ gibt es nicht.
Der Baum des laufenden Jahres
sourceanalytix.0.<Gerät>
├── cumulativeReading
├── statisticsJson
└── currentYear
└── <Kategorie>
├── 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<Kategorie> ist consumed oder delivered (Verbrauch oder Einspeisung), costs oder earnings (Kosten oder Erlös) und meterReadings (Zählerstände). Unter meterReadings gibt es keine 0X_current…-States, der aktuelle Stand steht in cumulativeReading.
| States | Inhalt | Option unter „Laufendes Jahr“ | Wird auf 0 gesetzt |
|---|---|---|---|
01_currentDay bis 05_currentYear | laufender Tag, Woche, Monat, Quartal, Jahr | immer da | beim Wechsel der Periode |
01_previousDay bis 05_previousYear | abgeschlossene Vorperiode | „Vorheriger Zeitraum“ | nie, beim nächsten Wechsel überschrieben |
currentWeek.01_Monday bis 07_Sunday | Wert jedes Tages der laufenden Woche | „Wochentag“ | montags um 0:00 Uhr |
previousWeek.01_Monday bis 07_Sunday | Wert jedes Tages der Vorwoche | „Wochentag“ und „Vorheriger Zeitraum“ | nie, montags überschrieben |
weeks.01 bis 53 | Wert der Kalenderwoche nach ISO 8601, Montag bis Sonntag | „Wochen“ | am 1. Januar |
months.01_January bis 12_December | Wert des Monats | „Monate“ | am 1. Januar |
quarters.Q1 bis Q4 | Wert des Quartals | „Quartale“ | am 1. Januar |
Die Wochentage heißen 01_Monday, 02_Tuesday, 03_Wednesday, 04_Thursday, 05_Friday, 06_Saturday und 07_Sunday, die Monate 01_January bis 12_December. Es gibt immer 53 Wochen-States, auch in Jahren mit 52 Kalenderwochen. Die Tage vom 29. bis 31. Dezember, die schon zur Woche 01 des neuen Jahres gehören, stehen nicht unter weeks, siehe Warum zeigt Woche 52/53 Werte im neuen Jahr?.
Werte über das Jahr hinaus behalten
Am 1. Januar setzt SourceAnalytix weeks, months und quarters unter currentYear auf 0. Willst du die Werte der Vorjahre behalten, schalte im Bereich „Jahresstatistik“ „Wochen“, „Monate“ oder „Quartale“ ein. Dann entsteht für jedes Jahr ein eigener Ordner sourceanalytix.0.<Gerät>.<Jahr>.<Kategorie>.weeks, .months oder .quarters, der erhalten bleibt. Mehr dazu unter Was passiert beim Jahreswechsel?.
Die letzten 7 Tage
Einen gleitenden Wert über die letzten 7 Tage berechnet SourceAnalytix nicht. currentWeek.<Wochentag> enthält die Tage der laufenden Woche ab Montag, previousWeek.<Wochentag> die Tage der ganzen Vorwoche. Für die letzten 7 Tage nimmst du die passenden Tage aus beiden Ordnern. Stundenwerte und gleitende Werte sind geplant (#424).
Wann gewechselt wird
SourceAnalytix wechselt die Perioden um 0:00 Uhr nach der Uhrzeit des Systems. Es prüft außerdem jede Stunde und beim Start, ob ein Wechsel fehlt, und holt ihn nach. Von Hand geht das ab v0.7.0 mit der Aktion „Perioden nachholen“ bei einer Quelle oder mit dem State info.recoverPeriods, siehe ioBroker war um Mitternacht aus.
Ab v0.6.2: Das Wochenarchiv im Jahresordner richtet sich nach dem Jahr der ISO-Kalenderwoche. Die Woche 01, die schon Ende Dezember beginnt, landet im Ordner des neuen Jahres und überschreibt nicht mehr die Woche 01 des alten Jahres (#1256).
Siehe auch: Wo finde ich gestern, letzte Woche, letzten Monat? · Welche Instanz-Einstellungen gibt es? · Warum unterscheiden sich Wochen-, Monats-, Quartals- und Jahreswerte?
Gibt es ein JSON mit allen Werten (für VIS)?
Kurz: Ja. Jede Quelle hat den State sourceanalytix.0.<Gerät>.statisticsJson. Er enthält alle Werte des laufenden Jahres als ein JSON: Verbrauch, Kosten und Zählerstände, jeweils für die laufenden Perioden, die Vorperioden und die Wochentage, Wochen, Monate und Quartale. Du musst dafür nichts einschalten.
Aufbau
Ein gekürztes Beispiel für eine Stromquelle:
{
"schemaVersion": 1,
"year": 2026,
"source": { "id": "<Datenpunkt-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": {} }
}
}| Feld | Inhalt |
|---|---|
schemaVersion | Version des Aufbaus, derzeit 1 |
year | das laufende Jahr |
source | id des Datenpunkts, name der Quelle, unit = Zieleinheit |
quantity | Verbrauch (type: consumed) oder Einspeisung (delivered); null, wenn „Verbrauch“ aus ist |
financial | Kosten (costs) oder Erlös (earnings) mit currency; null, wenn „Kosten“ aus ist |
meterReadings | Zählerstände; current ist der Gesamtstand aus cumulativeReading; null, wenn „Zählerstände speichern“ aus ist |
current | laufende Perioden day bis year, aus 01_currentDay bis 05_currentYear |
previous | Vorperioden aus 01_previousDay bis 05_previousYear; null, wenn „Vorheriger Zeitraum“ aus ist |
periods.weekdays, periods.previousWeekdays | Wochentage der laufenden Woche und der Vorwoche, Schlüssel 1 (Montag) bis 7 (Sonntag) |
periods.weeks | Kalenderwochen, Schlüssel 01 bis 53 |
periods.months | Monate, Schlüssel 01 bis 12 |
periods.quarters | Quartale, Schlüssel 1 bis 4 |
Eine Gruppe unter periods ist null, wenn die Option unter „Laufendes Jahr“ aus ist. Ein Wert, den es noch nicht gibt, fehlt oder ist null. Das Jahresarchiv (<ID>.<Jahr>) steht nicht im JSON.
Wann es geschrieben wird
SourceAnalytix sammelt die Änderungen eines Werts und schreibt das JSON höchstens alle 300 ms, und nur, wenn sich der Inhalt geändert hat. Beim Start baut es das JSON aus den vorhandenen States neu auf. Ist die Quelle deaktiviert, bleibt das letzte JSON stehen, wird aber nicht mehr aktualisiert. Der State ist nur lesbar (role json).
TIP
In einem Skript liest du das JSON mit JSON.parse(getState('sourceanalytix.0.<Gerät>.statisticsJson').val). So brauchst du für eine Tabelle in VIS nur einen State statt vieler einzelner.
Siehe auch: Wie visualisiere ich die Werte in VIS, Flot, HabPanel und der Historie? · Wie lese ich SourceAnalytix-Werte im Skript? · Welche Wochen-, Monats- und Quartals-States gibt es?
Was passiert beim Jahreswechsel?
Kurz: Am 1. Januar um 0:00 Uhr wandert der Jahreswert nach 05_previousYear, alle laufenden Perioden beginnen bei 0, und die Wochen, Monate und Quartale unter currentYear werden auf 0 gesetzt. Der Gesamtstand cumulativeReading läuft weiter. Monats- und Wochenwerte des alten Jahres behältst du nur mit der „Jahresstatistik“ im eigenen Jahresordner.
Was beim Wechsel passiert
- Tag, Woche, Monat, Quartal und Jahr wechseln gleichzeitig. Mit „Vorheriger Zeitraum“ kopiert SourceAnalytix die Werte nach
01_previousDaybis05_previousYear, mit dem Zeitstempel 31. Dezember 23:59:59 Uhr. - Die Startwerte aller Perioden werden auf den aktuellen Gesamtstand gesetzt.
01_currentDaybis05_currentYearbeginnen bei 0. weeks,monthsundquartersuntercurrentYearwerden für Verbrauch, Kosten und Zählerstände auf 0 gesetzt.- Ist in der „Jahresstatistik“ „Wochen“, „Monate“ oder „Quartale“ an, legt SourceAnalytix den Ordner
sourceanalytix.0.<Gerät>.<neues Jahr>mit diesen States und den Jahressummen (consumedCumulative,costsCumulative,readingCumulative) an. - Die Jahresordner der Vorjahre bleiben unverändert.
WARNING
Ohne „Jahresstatistik“ sind die Monats-, Wochen- und Quartalswerte des alten Jahres nach dem Wechsel nur noch in einem History-Adapter zu finden. Standard ist „Monate“ an, „Wochen“ und „Quartale“ aus.
Alte Jahresordner darfst du gefahrlos löschen, wenn du sie nicht mehr brauchst. SourceAnalytix schreibt nur in den Ordner des laufenden Jahres.
Preise zum Jahreswechsel
Hat ein Preis „Gültig ab“ 1. Januar, rechnet SourceAnalytix ab 0:00 Uhr mit ihm. Der Grundpreis wird am 1. Januar wie an jedem Monatsersten voll gebucht. Ab v0.6.2 springt auch priceDefinitions.<Kategorie>.currentPrice zu diesem Zeitpunkt auf den neuen Preis; bis v0.6.1 erst nach einem Neustart (#1259).
War ioBroker zum Jahreswechsel aus, holt SourceAnalytix den Wechsel beim nächsten Start nach, siehe ioBroker war um Mitternacht aus.
Ab v0.6.2: Die Tage vom 29. bis 31. Dezember, die zur Kalenderwoche 01 des neuen Jahres gehören, landen im Wochenarchiv des neuen Jahres (#1256).
Siehe auch: Wie werte ich Werte über mehrere Jahre aus? · Warum zeigt Woche 52/53 Werte im neuen Jahr? · Wie fange ich mit einem Datenpunkt neu an und räume alte Jahre auf?
Wie sind Preise als States lesbar und setzbar?
Kurz: Für jede Preisdefinition gibt es unter sourceanalytix.0.priceDefinitions.<Kategorie> States mit dem aktuellen und dem eingestellten Preis. currentPrice ist beschreibbar: Schreibst du einen neuen Preis hinein, gilt er sofort für alle Quellen dieser Preisdefinition.
| State | Inhalt | Schreibbar |
|---|---|---|
priceDefinitions.<Kategorie>.currentPrice | Preis pro Einheit, der gerade gilt, in <Währung>/<Einheit> | ja |
priceDefinitions.<Kategorie>.configuredPrice | „Preis pro Einheit“ aus der Tabelle, nur bei „Festpreis“ | nein |
priceDefinitions.<Kategorie>.configuredPriceValidFrom | ab wann dieser Preis gilt, als Zeitstempel in Millisekunden | nein |
priceDefinitions.<Kategorie>.configuredBasicPrice | „Preis pro Monat“ aus der Tabelle | nein |
priceDefinitions.<Kategorie>.configuredBasicPriceValidFrom | ab wann der Grundpreis gilt | nein |
priceHistory.<Kategorie> | Preisverlauf als JSON, zum Beispiel [{"ts":1767222000000,"price":0.32}] | nein |
basicPriceHistory.<Kategorie> | Verlauf des Grundpreises als JSON | nein |
In den State-IDs ersetzt SourceAnalytix jedes Zeichen der Kategorie außer Buchstaben, Ziffern, _ und - durch _. Aus Strom Haus wird also priceDefinitions.Strom_Haus.currentPrice.
Preis über currentPrice setzen
- Schreibe den neuen Preis pro Einheit als Zahl in
sourceanalytix.0.priceDefinitions.<Kategorie>.currentPrice, ohne Bestätigung (ack= false), zum Beispiel aus einem Skript:setState('sourceanalytix.0.priceDefinitions.Strom.currentPrice', 0.29); - SourceAnalytix übernimmt ihn für alle Quellen dieser Preisdefinition, speichert ihn mit dem Zeitpunkt im Preisverlauf und schreibt
Unit price for <Kategorie> was set to <Preis> through <State>ins Log. - Ist der Wert keine Zahl, bleibt der alte Preis, und im Log steht
Writable price state <State> received invalid value ….
Der neue Preis gilt ab dem Zeitpunkt des Schreibens. Kosten, die schon gerechnet sind, ändert er nicht. Dafür gibt es ab v0.7.0 die Aktion „Kosten ab Datum neu rechnen“, siehe Werden Kosten neu berechnet, wenn ich den Preis ändere?.
NOTE
Bei „Preisquelle“ „Datenpunkt“ oder „Tarifumschaltung“ überschreibt der nächste Wert des Preis-Datenpunkts einen von Hand geschriebenen Preis. Änderst du den „Preis pro Einheit“ in der Tabelle und speicherst, gilt danach wieder dieser.
Siehe auch: Wie ist eine Preisdefinition aufgebaut? · Wie berücksichtige ich einen dynamischen Strompreis? · Welche Währung verwendet SourceAnalytix?
Warum sind Meter-Readings kumuliert?
Kurz: Unter meterReadings stehen Zählerstände, keine Verbräuche. Jeder State zeigt den Gesamtstand am Ende seiner Periode. Deshalb wird der Wert von Monat zu Monat größer. Den Verbrauch einer Periode findest du unter consumed (oder delivered).
cumulativeReading und meterReadings
| State | Inhalt |
|---|---|
sourceanalytix.0.<Gerät>.cumulativeReading | Der Gesamtstand: der eigene Zählerstand von SourceAnalytix in der Zieleinheit, ungerundet. Er wird mit jedem neuen Wert geschrieben. |
currentYear.meterReadings.months.<Monat>, .weeks.<NN>, .quarters.Q<n>, .currentWeek.<Wochentag> | Der Gesamtstand, gerundet, zuletzt geschrieben in dieser Periode. Nach dem Ende der Periode bleibt er stehen, ist also der Stand am Periodenende. |
currentYear.meterReadings.01_previousDay bis 05_previousYear | Der Gesamtstand im Moment des Periodenwechsels |
<Jahr>.meterReadings.… und <Jahr>.readingCumulative | Dasselbe im Jahresarchiv, wenn die „Jahresstatistik“ an ist |
Beispiel: Steht in meterReadings.months.02_February 1.250 kWh und in meterReadings.months.03_March 1.480 kWh, hast du im März etwa 230 kWh verbraucht. Den genauen Wert zeigt consumed.months.03_March.
Der Gesamtstand enthält den Offset aus der Reset-Erkennung. Nach einem Reset des Geräts zeigt cumulativeReading also weiter den durchgehenden Stand und nicht den Wert, den das Gerät gerade meldet. Die Begriffe erklärt Was bedeutet „Device reset detected“?. Soll der Gesamtstand zu deinem echten Zähler passen, nutze ab v0.7.0 die Aktion „Zählerstand angleichen“, siehe Falsche Werte korrigieren.
meterReadings entsteht nur mit „Zählerstände speichern“ an der Quelle. Wann der Ordner leer bleibt, steht unter Was bewirken die Einstellungen am Datenpunkt?.
Ab v0.6.2: Auch ein Zählerstand von genau 0 wird unter meterReadings geschrieben. Bis v0.6.1 blieb der State dann leer (#1253).
Siehe auch: Wie wird der Verbrauch berechnet – und warum ist currentYear niedriger als mein Zählerstand? · Wie übernehme ich meinen echten Zählerstand? · JSON mit allen Werten
Welche Währung verwendet SourceAnalytix?
Kurz: Die Währung aus den Systemeinstellungen von ioBroker. Ist dort keine eingetragen, nimmt SourceAnalytix €. Es gibt nur eine Währung für alle Quellen, und SourceAnalytix rechnet nicht um: Die Währung ist nur die Einheit an den Kosten-States.
- Die Währung steht als Einheit an allen States unter
costsundearnings, an den JahressummencostsCumulativeundearningsCumulativeund als<Währung>/<Einheit>anpriceDefinitions.<Kategorie>.currentPrice. - Alle Preise in den Preisdefinitionen gibst du in dieser Währung an, pro Zieleinheit, also zum Beispiel in €/kWh und nicht in Cent/kWh.
- Ein Preis-Datenpunkt muss den Preis ebenfalls in dieser Währung pro Zieleinheit liefern. Einen Umrechnungsfaktor, etwa von Cent in Euro, gibt es nicht; rechne ihn vorher um, zum Beispiel mit einem Alias oder Skript.
IMPORTANT
SourceAnalytix liest die Währung nur beim Start. Änderst du sie in den Systemeinstellungen, starte die Instanz neu. Schon gerechnete Beträge werden dabei nicht umgerechnet.
Siehe auch: Wie ist eine Preisdefinition aufgebaut? · Wie sind Preise als States lesbar und setzbar?
sendTo-Befehle und info-States
Kurz: SourceAnalytix nimmt Befehle per sendTo an. Die Einstellungsseite ab v0.7.0 nutzt sie selbst; du kannst sie auch aus Skripten aufrufen, zum Beispiel recoverPeriods für einen verpassten Periodenwechsel oder setCumulative zum Angleichen des Zählerstands. Instanz-States gibt es nur zwei: info.recoverPeriods und info.costRecalculation. Einen State info.connection gibt es nicht.
Befehle
Alle Werte sind in der Zieleinheit der Quelle. Zahlen dürfen ein Komma oder einen Punkt haben. source ist immer die ID des Quell-Datenpunkts. Mit dryRun: true prüft SourceAnalytix nur und liefert eine Vorschau, ohne etwas zu ändern.
| Befehl | Parameter | Was er tut |
|---|---|---|
recoverPeriods | {source} (optional, ab v0.7.0) | Holt verpasste Tages-, Wochen-, Monats-, Quartals- und Jahreswechsel nach, mit source nur für diese Quelle, sonst für alle. Antwort: {recovered: <Anzahl Quellen>}, bei inaktiver Quelle {error: 'sourceNotActive'} |
getSources / checkProblems | – | Liefert alle Quellen mit Werten, die Probleme, die Preisdefinitionen, die Einheiten und die Währung (beide Befehle liefern dasselbe) |
saveSource | source, settings, dryRun | Legt die SourceAnalytix-Einstellungen eines Datenpunkts an oder ändert sie. settings enthält nur die Felder, die sich ändern, zum Beispiel {deviceResetLogicEnabled: true}. Wirkt ohne Neustart. |
setSourceEnabled | source, enabled | Aktiviert (true) oder deaktiviert (false) eine Quelle. Die Daten bleiben. |
findCandidates | query | Sucht Datenpunkte mit unterstützter Einheit (höchstens 50), für den Assistenten |
setCumulative | source, value, dryRun | „Zählerstand angleichen“: setzt den Gesamtstand auf value |
meterSwap | source, oldEnd, newStart, date, dryRun | „Zähler getauscht“: Endstand des alten Zählers, Startstand des neuen (leer = 0), Datum nur zur Information. Nicht für Leistungsquellen. |
recalcCosts | source oder priceDefinition, from, dryRun | „Kosten ab Datum neu rechnen“ für eine Quelle oder alle Quellen einer Preisdefinition. from als Zeitstempel in ms oder Datum, nicht in der Zukunft. |
deleteSourceData | source oder outputId, dryRun | „Daten löschen“: deaktiviert die Quelle, entfernt ihre SourceAnalytix-Einstellungen und löscht ihren Ordner. Mit outputId auch für Ordner ohne Datenpunkt. |
Außerdem beantwortet SourceAnalytix getPriceDefinitions, getUnits, getStartValueContext, getBasicRateSources und getUsedOutputIds. Der Assistent prüft mit getUsedOutputIds, ob eine technische ID schon vergeben ist. Die übrigen Befehle füllten Auswahllisten und Prüfungen im Objekt-Dialog, der ab v0.7.0 nur noch das Einschalten enthält (#1286).
Beispiel: Zählerstand angleichen, erst als Vorschau.
sendTo('sourceanalytix.0', 'setCumulative', { source: '<Datenpunkt-ID>', value: 12475, dryRun: true }, result => {
log(JSON.stringify(result));
});Geht etwas schief, enthält die Antwort error und message, zum Beispiel sourceNotActive, wenn die Quelle nicht läuft, invalidValue bei einer ungültigen Zahl oder invalidDate bei einem Datum in der Zukunft. saveSource liefert bei ungültigen Feldern invalidSettings und unter errors die betroffenen Felder.
CAUTION
deleteSourceData ohne dryRun löscht den Ordner der Quelle mit allen Werten und Jahren und entfernt ihre Einstellungen am Datenpunkt. Das lässt sich nicht rückgängig machen.
info-States
| State | Inhalt |
|---|---|
sourceanalytix.0.info.recoverPeriods | Knopf (role button). Schreibst du true hinein, holt SourceAnalytix verpasste Periodenwechsel nach und setzt den State auf false zurück. Das geht auch, während SourceAnalytix sonst gerade nicht rechnet. |
sourceanalytix.0.info.costRecalculation | Fortschritt von „Kosten ab Datum neu rechnen“ als JSON: running, done, total, from, sources, ts. Entsteht erst beim ersten Neurechnen (ab v0.7.0). |
Einen State info.connection legt SourceAnalytix nicht an, weil es keine Verbindung zu einem Gerät gibt, die es melden könnte. Fehlt er in der Objektliste, ist das kein Fehler.
Siehe auch: ioBroker war um Mitternacht aus · Wie lese ich SourceAnalytix-Werte im Skript? · Wie korrigiere ich falsche Werte?
Warnungen im Log (Output-ID, Preise)
Kurz: Die wichtigsten Meldungen von SourceAnalytix stehen unten mit ihrer Bedeutung. <Datenpunkt> ist die ID der Quelle, <Kategorie> der Name der Preisdefinition. Für den Dauerbetrieb reicht die Protokollstufe „warn“; Info-Meldungen brauchst du nur bei der Einrichtung oder Fehlersuche.
Start und Einrichtung
| Meldung | Stufe | Bedeutung |
|---|---|---|
Found <n> SourceAnalytix enabled states | info | So viele Quellen sind aktiviert. |
Successfully activated SourceAnalytix for all <n> of <n> states … | info | Alle Quellen laufen. |
Partially activated SourceAnalytix for <n> of <m> states, check error messages! | warn | Einige Quellen laufen nicht; die Ursache steht in den Fehlern davor. |
Initialization of <Datenpunkt> failed, check warn messages ! / Cannot handle calculations for <Datenpunkt>, check log messages and adjust settings! | error | Diese Quelle startet nicht, siehe Initialization failed. |
No unit defined for <Datenpunkt>, cannot execute calculations ! | error | Einheit fehlt oder wird nicht erkannt, siehe No unit defined. |
Unit <Einheit> of <Datenpunkt> cannot be converted to unit <Einheit> of price definition <Kategorie> | error | Einheit der Quelle passt nicht zur Preisdefinition. |
No cost type defined for <Datenpunkt> … / Selected Type <Kategorie> does not exist in Price Definitions | error | Keine oder eine gelöschte Preisdefinition gewählt, siehe No cost type defined. |
Unit "<Schreibweise>" of <Datenpunkt> is used as <Einheit> | info | Ab v0.6.2: Eine Schreibweise wie m3 wird als m³ gelesen. |
Start value <Periode> (<Wert>) of <Datenpunkt> is larger than the current total … | warn | Ein Startwert ist größer als der Gesamtstand; die Werte dieser Periode werden negativ. |
The basic fee of price definition <Kategorie> is included by <n> sources … | info | Mehrere Quellen buchen denselben Grundpreis (ab v0.7.0). |
Ausgabe-ID
| Meldung | Stufe | Bedeutung |
|---|---|---|
Migrated SourceAnalytix output for <Datenpunkt> from <alt> to <neu> | info | Die technische ID wurde geändert, der Ordner ist umgezogen. |
Cannot use output ID "<ID>" for <Datenpunkt>: <Grund>; keeping "<alt>" | warn | Die neue ID ist ungültig, belegt oder der Umzug schlug fehl. Die alte ID bleibt. |
Cannot use output ID … no existing output tree to keep | error | Die ID ist unbrauchbar und es gibt keinen alten Ordner; die Quelle startet nicht. |
Removed incomplete output migration for <Datenpunkt>; migration … will be retried | warn | Ein abgebrochener Umzug wird beim Start wiederholt. |
Preise
| Meldung | Stufe | Bedeutung |
|---|---|---|
Price definition <Kategorie> has no valid unit price …, using 0 … | warn | Der Preis ist keine Zahl, die Kosten bleiben 0. |
Price source state <State> for <Kategorie> has no valid value or tariff, using configured fallback price … | warn | Der Preis-Datenpunkt ist leer oder ungültig; „Preis pro Einheit“ gilt. |
Price definition <Kategorie> uses a state price source but no state ID is configured … | warn | Bei „Datenpunkt“ oder „Tarifumschaltung“ fehlt der „Preis-Datenpunkt“. |
Unit price for <Kategorie> changed from <alt> to <neu> | info | Der Preis hat sich geändert, mit dem Zusatz (valid from date reached) bei einem erreichten „Gültig ab“ (ab v0.6.2). |
Stored unit price <Preis> for <Kategorie> at <Zeit> / Stored monthly basic price … | info | Ein neuer Preis wurde in den Preisverlauf geschrieben. |
Rechnen, Reset und Periodenwechsel
| Meldung | Stufe | Bedeutung |
|---|---|---|
Initiating <Datenpunkt> for the first time in SourceAnalytix | info | Erster Wert einer neuen Quelle. |
Value … of <Datenpunkt> is not a number, reading ignored | warn | Die Quelle liefert Text, der keine Zahl ist, siehe Text statt Zahl. |
[calculationHandler] Waiting for another reading before confirming a possible device reset … | info | Möglicher Reset, SourceAnalytix wartet auf den nächsten Wert. |
Device reset detected for <Datenpunkt>; preserving cumulative value … | warn | Reset bestätigt, der Gesamtstand läuft weiter. |
Rejected a possible device reset … / Rolled back the device reset … | warn | Der niedrige Wert war ein Ausreißer, siehe Device reset detected. |
Known valueAtDeviceReset … is larger than the known cumulative value … / Realigned valueAtDeviceReset … | warn | Offset größer als der Gesamtstand; SourceAnalytix gleicht ihn selbst an (ab v0.6.2). |
No new power value from <Datenpunkt> for <n> min, longer than the maximum gap … | info | Ab v0.7.0: Eine Lücke bei einer Leistungsquelle wird nicht gezählt. |
Processing calendar rollover for <Datenpunkt>: … / Processed calendar rollover for <n> source(s), triggered by … | info | Ein Periodenwechsel wurde verarbeitet, regulär oder nachgeholt. |
Reading gap of <Datenpunkt> from … to …: booking … | info | Ab v0.6.2: Der Verbrauch einer Lücke über Mitternacht wird auf beide Tage verteilt. |
Aktionen der Einstellungsseite (ab v0.7.0)
| Meldung | Bedeutung |
|---|---|
Created … / Changed SourceAnalytix settings of <Datenpunkt> from the settings page | Quelle angelegt oder geändert |
Activated … / Deactivated <Datenpunkt> from the settings page | Quelle aktiviert oder deaktiviert |
Meter reading of <Datenpunkt> aligned from <alt> to <neu> … | „Zählerstand angleichen“ ausgeführt |
Meter swap for <Datenpunkt> applied: … / First reading … of the new meter received … | „Zähler getauscht“ ausgeführt, erster Wert des neuen Zählers da |
Costs of <Datenpunkt> recalculated from <Datum> for <n> periods | „Kosten ab Datum neu rechnen“ fertig |
Deleted the data of <Datenpunkt>: <n> states in <Ordner> | „Daten löschen“ ausgeführt |
Alle Meldungen eines Fehlers im Code beginnen mit [<Funktion>] error: und enthalten den Stack. Ist das Sentry-Plugin aktiv, geht der Fehler zusätzlich an den Entwickler (Error sent to Sentry, thank you for collaborating!). Ab v0.6.2 steht der Fehler immer im Log, auch ohne Sentry (#1261).
Siehe auch: Log-Meldungen und Fehler beim Einrichten · Hohe CPU-/Speicherlast und zu viel Log-Ausgabe
Migration älterer Versionen und Altlasten
Kurz: SourceAnalytix übernimmt Daten älterer Versionen beim Start selbst. Du musst nichts tun. Einige alte Einstellungen gibt es noch in der Instanz, sie haben aber keine Wirkung mehr.
Was SourceAnalytix beim Start umstellt
| Was | Was passiert |
|---|---|
| Technische ID (Ausgabe-ID) | Hat eine Quelle noch keine, nimmt SourceAnalytix die bisherige ID (Datenpunkt-ID mit __ statt Punkten) und schreibt sie in die Einstellungen der Quelle. Der Ordner bleibt, wo er ist. |
| Nachkommastellen | Hat eine Quelle keine eigenen, bekommt sie einmal die Vorlage der Instanz und behält sie danach, siehe Nachkommastellen. |
| Gesamtstand sehr alter Versionen | Fehlt cumulativeReading oder ist er 0, liest SourceAnalytix den Stand aus <ID>.Current_Reading oder <ID>.Meter_Readings.Current_Reading alter Versionen. |
| Kostenspeicher | Ein alter Kostenspeicher, der den Grundpreis enthielt, wird umgestellt, damit der Grundpreis nach einem Neustart nicht doppelt zählt (Migrated dynamic cost memory for <Datenpunkt> to variable-cost schema version 2). |
Umzug der technischen ID
Änderst du die technische ID, kopiert SourceAnalytix den Ordner, prüft die Kopie und löscht danach den alten Ordner, siehe Wie benenne ich den Datenpunkt?. Bricht die Instanz dabei ab, entfernt SourceAnalytix beim nächsten Start eine unvollständige Kopie und versucht es erneut (Removed incomplete output migration … will be retried), oder es räumt den alten Ordner nach einer geprüften Kopie auf (Completed pending output migration cleanup …).
Alte Einstellungen ohne Wirkung
In den Instanz-Daten stehen noch store_days, store_years, store_period, keep_days, keep_weeks, keep_months, keep_quarters, keep_years, impuls und status_logging. Keine Oberfläche zeigt sie, und SourceAnalytix liest sie nicht. Optionen wie „Zu protokollierende Statusmeldungen“ oder „Anzahl Tage“ aus alten Forenbeiträgen gibt es nicht mehr. Impulszähler richtest du ab v0.7.0 an der Quelle ein, siehe Stück und Impulse.
Ab v0.6.2: Der alte Merkwert valueAtDeviceInit wird nicht mehr gebraucht (#1263). Die Einstellungsseite ab v0.7.0 blendet ihn, valueAtDeviceReset und pendingMeterSwap aus und überschreibt sie nie. Diese Werte ändert nur SourceAnalytix selbst oder eine Aktion wie „Zählerstand angleichen“.
Meldungen zu Tages-, Wochen- oder Monatswechseln aus Versionen vor 0.5 sind mit dem Umbau der Perioden in 0.5 erledigt. Läuft bei dir noch eine so alte Version, aktualisiere, siehe Wie aktualisiere ich SourceAnalytix?.
Siehe auch: Bekannte Fehler älterer Versionen · Nach Update oder Restore sind Werte 0
Sonstiges (unfertige/interne Funktionen)
Kurz: Ein paar Dinge im Code sind intern oder unfertig. Für dich wichtig: Ein eigenes VIS-Widget-JSON gibt es nicht, nimm statisticsJson. Eine Debug-Ausgabe der Preis- und Einheiten-Definitionen landet nicht im ioBroker-Log, sondern in der Konsole des Prozesses.
| Funktion | Stand |
|---|---|
| VIS-Widget-JSON | Nur auskommentierter Code. Alle Werte für VIS stehen in statisticsJson. |
| Debug-Ausgabe | Beim Start schreibt SourceAnalytix die geladenen Einheiten und Preise mit console.debug in die Standardausgabe des Prozesses, also zum Beispiel ins Docker- oder Systemd-Log, unabhängig von der Protokollstufe. Im ioBroker-Log erscheint sie nicht. |
| Fehlerberichte (Sentry) | SourceAnalytix meldet Fehler im Code über das Sentry-Plugin von ioBroker an den Entwickler, wenn das Plugin aktiv ist. |
| Impulszähler | Bis v0.6.x nur ein Platzhalter im Code. Ab v0.7.0 gibt es piece, piece/min und „Impulse pro Einheit der Preisdefinition“, siehe Stück und Impulse. |
| Aufräumen alter Ordner | Es gibt kein automatisches Aufräumen. Ab v0.7.0 löschst du den Ordner einer Quelle mit der Aktion „Daten löschen“; Ordner, deren Datenpunkt fehlt, zeigt die „Übersicht“ als „Ordner ohne Datenpunkt“ (#1265). |
| Eigene Zeiträume | Ein Platzhalter im Code (reading_start = 0) ist für frei wählbare Abrechnungszeiträume gedacht. Sie sind nicht umgesetzt, aber geplant (#595). |
| Überwachung aller Objekte | SourceAnalytix abonniert Änderungen an allen Objekten. So bemerkt es ohne Neustart, wenn du eine Quelle aktivierst oder änderst. |
Siehe auch: JSON mit allen Werten · Wie schalte ich einen Datenpunkt ab oder entferne Quellen und States? · Warnungen im Log