Seite 1 von 2
Widget mit Switch analyzer schalt zeit berechnen .
Verfasst: 17. Sep 2022 08:23
von marci-cr
hallo liebe gemeinde
ich bräuchte eure hilfe bei einem widget
im großen und ganzen funktioniert es NUR ein paar kleinigkeiten möchte ich noch verbessern.
Standart Ansicht in der Overview
https://bilderupload.org/bild/c4f794992-solar1
Ansicht wen ich das Widget öffne
https://bilderupload.org/bild/c2ed95088-solar2
SRY wegen dem bilder upload aber beim einfügen steht später nur BILD??
soweit so gut !! Die schaltvorgänge der Steckdose (mit MQTT) wird angezeigt.
Das ist der Code aus dem Widget..
Code: Alles auswählen
component: oh-label-card
config:
actionAnalyzerCoordSystem: time
actionAnalyzerItems:
- Curantee00_Curantee00
background: "linear-gradient(to bottom right, #d6d5d5 0%, #4969a8 100%)"
dataZoom:
- component: oh-chart-datazoom
config:
type: inside
expandable: true
grid:
- component: oh-chart-grid
config:
includeLabels: true
icon: oh:energy
iconUseState: false
item: Curantee00_Curantee00
legend:
- component: oh-chart-legend
config:
bottom: 3
type: scroll
series:
- component: oh-time-series
config:
areaStyle:
opacity: 0.2
gridIndex: 0
item: SolarBatterie_SolarBatterie
markLine:
data:
- type: average
markPoint:
data:
- name: min
type: min
- name: max
type: max
label:
backgroundColor: auto
name: SolarBatterie
type: line
xAxisIndex: 0
yAxisIndex: 0
stateAsHeader: true
title: Solar Ladegerät
tooltip:
- component: oh-chart-tooltip
config:
confine: true
smartFormatter: true
trendGradient:
- "#000000"
trendItem: Curantee00_Curantee00
trendStrokeWidth: 5px
vertical: true
xAxis:
- component: oh-time-axis
config:
gridIndex: 0
yAxis:
- component: oh-value-axis
config:
gridIndex: 0
max: 15
min: 10
minorSplitLine:
show: true
minorTick:
show: true
scale: false
splitArea:
show: true
action: analyzer
slots: null
was ich jetzt noch gerne möchte ist das es mir die gesamtzeit des schlatvorganges in Stunden ggf in KWh zusammen rechnet.
da ich weis das es um 80 - 85 Watt verbrauch in der Stunde handelt.
Um lösungs und verbesserungs vorschläge bin ich offen.
Auch wenn mir jemand sagt das der Code so ungeignet ist. Ich habe ihn aus einem anderem Forum um ursprünglich ein DHT11 thermo sensor anzeigen zu lassen. mit Graph line.
Mfg
Re: Widget mit Switch analyzer schalt zeit berechnen .
Verfasst: 17. Sep 2022 12:23
von udo1toni
Ich schätze, das wird so nicht gehen. Die Datenbank gibt Dir solche Informationen einfach nicht raus. Du könntest mit einem Hilfsitem arbeiten, welches Du minütlich mit einer 1 oder einer 0 befüllst, je nachdem, ob der Aktor ON oder OFF ist. Dann kannst Du über die Persistence dieses Items mittels sumSince(Zeitstempel) die Summe der Werte ausgeben, was dann eben der Anzahl an Minuten entspricht. Allerdings weiß ich nicht, was mit längeren Zeiträumen passiert (rrd4j ist die Default Persistence, welche dann gewöhnlich angewendet wird - sie fasst aber die Historie in mehreren Schritten zusammen).
Was die Bilder betrifft, so kannst Du Bilder direkt hier hochladen, über den vollständigen Editor. Dort besteht auch die Möglichkeit, ein hochgeladenes Bild direkt einzubetten. Oder Du nutzt die hochgeladenen Bilder, aber nicht den von Bilderupload angegebenen Link, sondern den direkten Link zur Grafik (dabei wird soweit ich gesehen habe lediglich ein Teil der URL ersetzt - statt bild steht dann dort image, am Ende muss noch die Endung .png ergänzt werden. Im Zweifel wählst Du aus dem Kontextmenü der Grafik "Grafik in neuem Tab anzeigen" und kopierst diesen Link)
Externe Bilder kannst Du einfach mit dem img-Tag einbetten img=http-adresse in eckigen Klammern plus schließendes img-Tag:
![Bild](https://bilderupload.org/image/c4f794992-solar1.png)
Re: Widget mit Switch analyzer schalt zeit berechnen .
Verfasst: 17. Sep 2022 15:52
von marci-cr
das mit rrdj4 weis ich das die daten mit der zeit ungenauer werden (glaube Komprimiert auf das wichtigste) ... mir würde reichen was in einer woche oder besser pro Monat währe. habe es auch nebenher mit influxdb und grafana probieret ( NOCH AM PROBIEREN)
Aber wie schreibe ich das mit dem ZITAT... Du könntest mit einem Hilfsitem arbeiten, welches Du minütlich mit einer 1 oder einer 0 befüllst, je nachdem, ob der Aktor ON oder OFF ist. Dann kannst Du über die Persistence dieses Items mittels sumSince(Zeitstempel) die Summe der Werte ausgeben, was dann eben der Anzahl an Minuten entspricht. ...
wenn Sie / du mir da ewas hilfes gibst oder ggf ein guten Link mit dem ich Arbeiten kann währe sehr hilfreich.
MFG
Re: Widget mit Switch analyzer schalt zeit berechnen .
Verfasst: 17. Sep 2022 17:57
von udo1toni
Immer gerne
Du ![Smile :)](./images/smilies/icon_e_smile.gif)
wir sind hier eher Kumpel als Lehrer...
rrd4j speichert intern die Werte in unterschiedlicher zeitlicher Auflösung. Dabei werden jeweils in der nächstschlechteren Auflösung Werte zusammengefasst. Wenn die höchste Auflösung also z.B. 1 Minute ist und die zweithöchste Auflöung 10 Minuten, so wird rrd4j aus zehn 1-Werten einen 1-Wert machen. Eventuell macht es aus 5 1-Werten plus 5 0-Werten ein 0,5, kann aber auch sein, dass es auch hier eine 1 macht, aber aus 4 1-Werten und 6 0-Werten eine 0. Wie genau die Werte miteinander verrechnet werden, weiß ich halt nicht. Und beim Auslesen kann es eben sein, dass dann nur eine 1 gezählt wird, obwohl es eigentlich 10 sein müssten.
Das ist eben die Frage...
Hilfsitem:
Du legst einfach ein Numbver Item an (über die Einstellungen->Items->rechts unten das weiße plus im blauen Kreis) und dieses Item wird mit keinem Channel verlinkt.
Stattdessen legst Du eine Rule an (ich verwende hier die DSL in Textform, geht aber auch über die UI)
Code: Alles auswählen
rule "update item"
when
Time cron "1 * * * * ?"
then
if(MeinSwitch.state != ON)
MeinNumberItem.postUpdate(0)
else
MeinNumberItem.postUpdate(1)
end
Das Item MeinNumberItem ist das ungebundene Item, welches extra angelegt wurde. Das Item muss mit everyUpdate als Persistence Strategy persistiert werden. Fortan landet einmal pro Minute eine eins oder eine null im Item und damti auch in der Persistence.
Und dann kannst Du in einer anderen Rule die Summe auslesen und berechnen:
Code: Alles auswählen
rule "get sum"
when
Time cron "2 * * * * ?"
then
Anzeige24h.postUpdate(MeinNumberItem.sumSince(now.minusDays(1)))
Anzeige7d.postUpdate(MeinNumberItem.sumSince(now.minusDays(7)))
end
Diese Berechnung könnte man natürlich auch in der ersten Rule mit einbauen, wobei die Persistence immer ein paar Millisekunden braucht, kann alos sein, dass die Anzeige dann immer etwas hinterher hinkt.
Um den Verbrauch zu berechnen, könntest Du die Zahl mit der Leistung multiplizieren und durch 60 teilen, um Wh zu erhalten.
Re: Widget mit Switch analyzer schalt zeit berechnen .
Verfasst: 17. Sep 2022 18:23
von marci-cr
Vielen Dank
ich werde es später oder morgen vormittag mal testen.
ich hoffe das alles gut geht. werde mich zurück melden.
hoffe das es auch anderen Usern weiterhilft.
Re: Widget mit Switch analyzer schalt zeit berechnen .
Verfasst: 18. Sep 2022 08:25
von marci-cr
habe es jetzt versucht komme aber nicht ganz zurecht.
das ist der Code um die Steckdose für das ladegerät einzuschalten
Code: Alles auswählen
configuration: {}
triggers:
- id: "1"
configuration:
cronExpression: 0 0/5 * * * ? *
type: timer.GenericCronTrigger
conditions:
- inputs: {}
id: "3"
configuration:
itemName: SolarBatterie_SolarBatterie
state: "11.90"
operator: <
type: core.ItemStateCondition
actions:
- inputs: {}
id: "2"
configuration:
itemName: Curantee00_Curantee00
command: ON
type: core.ItemCommandAction
das ist der Code um es aus zu schalten der 60 sec timer ist für die lade schlußspannung da sie am schluss schwankt.
Code: Alles auswählen
configuration: {}
triggers:
- id: "1"
configuration:
cronExpression: "* 0/5 * * * ? *"
type: timer.GenericCronTrigger
conditions:
- inputs: {}
id: "3"
configuration:
itemName: SolarBatterie_SolarBatterie
state: "14.38"
operator: ">="
type: core.ItemStateCondition
actions:
- inputs: {}
id: "2"
configuration:
command: OFF
itemName: Curantee00_Curantee00
type: core.ItemCommandAction
- inputs: {}
id: "4"
configuration:
blockSource: <xml xmlns="https://developers.google.com/blockly/xml"><block
type="oh_sleep" id="yn(`IG:iE:[h}Ub9?Ync" x="85" y="4"><field
name="milliseconds">600000</field></block></xml>
type: application/javascript
script: |
var thread = Java.type('java.lang.Thread')
thread.sleep(600000);
type: script.ScriptAction
das ist der code Rule die ich versucht habe von dir aber er zeigt nichts im item an.
Code: Alles auswählen
configuration: {}
triggers:
- id: "1"
configuration:
cronExpression: 0 * * * * ? *
type: timer.GenericCronTrigger
conditions: []
actions:
- inputs: {}
id: "2"
configuration:
type: application/vnd.openhab.dsl.rule
script: |-
rule "update item"
when
Time cron "1 * * * * ?"
then
if(Curantee00_Curantee00.state != ON)
SolarTracker.postUpdate(0)
else
SolarTracker.postUpdate(1)
end
type: script.ScriptAction
- inputs: {}
id: "3"
configuration:
type: application/vnd.openhab.dsl.rule
script: |-
rule "get sum"
when
Time cron "2 * * * * ?"
then
Anzeige24h.postUpdate(SolarTracker.sumSince(now.minusDays(1)))
Anzeige7d.postUpdate(SolarTracker.sumSince(now.minusDays(7)))
end
type: script.ScriptAction
habe ich da etwas grundsätzlcih falsch gemacht?
da das SolarTracker (number) item nichts anzeigt.
kann ich ggf auch meine vorhanden ersten 2 Codes passend abändern? den so wie sie sind funktionieren Sie ja wie ja auch im ersten post gezeigt mit den ScreenShots.
Mfg
Re: Widget mit Switch analyzer schalt zeit berechnen .
Verfasst: 19. Sep 2022 04:40
von udo1toni
Dein Time cron Ausdruck in Deiner 2. Regel ist falsch. "* 0/5 * * * ? *" bedeutet: alle fünf Minuten jede Sekunde. Was das Sleep da soll, erschließt sich mir nicht, denn es hat keinerlei Auswirkungen. Allenfalls verhindert es, dass die Rule dann sekündlich gestartet wird, weil es die Rule blockiert. Aber das wäre leichter zu erreichen, wenn Du den ersten Stern mit einer Zahl ersetzt, wie in der ersten Rule.
Was meine Rules betrifft, so hatte ich ja darauf hingewiesen, dass die Rules für DSL in Textform geschrieben sind.
Das bedeutet, dass der Trigger mit in der jeweiligen Rule steht.
Wenn Du den Code über die UI eingeben willst, musst Du nur den Teil zwischen
then und
end einfügen (ohne diese beiden Schlüsselworte). Der Teil zwischen
when und
then entspricht dem Trigger der Rule.
Der Trigger wurde von mir auf eine Sekunde bzw. zwei Sekunden nach der vollen Minute festgelegt, um sicherzustellen, dass das Item schon den passenden Zustand hat.
Es handelt sich um zwei Rules, die du auch getrennt anlegen musst.
Re: Widget mit Switch analyzer schalt zeit berechnen .
Verfasst: 19. Sep 2022 05:47
von marci-cr
Titat... Dein Time cron Ausdruck in Deiner 2. Regel ist falsch. "* 0/5 * * * ? *" bedeutet: alle fünf Minuten jede Sekunde ....
wie soll ich es sonst einstellen das alle 5 min geprüft wird und dann 60 sekunden warten ob der wert wirklich unter 11.90 geht.
dies soll alle 5 min Prüfen ob Die Volt Zahl im bereich ist von 11.90 Volt wenn es daruter geht für 60 sekunden (zweite rule) dann soll die steckdose
itemName: Curantee00_Curantee00 geschaltet werden.
Deine Rule habe ich in 2 rule´s geschrieben mit der UI funktion DSL (v1)
Code: Alles auswählen
configuration: {}
triggers: []
conditions: []
actions:
- inputs: {}
id: "1"
configuration:
type: application/vnd.openhab.dsl.rule
script: |-
rule "update item"
when
Time cron "1 * * * * ?"
then
if(Curantee00_Curantee00.state != ON)
SolarTracker.postUpdate(0)
else
SolarTracker.postUpdate(1)
end
type: script.ScriptAction
die 2 Rule
Code: Alles auswählen
configuration: {}
triggers: []
conditions: []
actions:
- inputs: {}
id: "1"
configuration:
type: application/vnd.openhab.dsl.rule
script: |-
rule "get sum"
when
Time cron "2 * * * * ?"
then
Anzeige24h.postUpdate(SolarTracker.sumSince(now.minusDays(1)))
Anzeige7d.postUpdate(SolarTracker.sumSince(now.minusDays(7)))
end
type: script.ScriptAction
SolarTracker ist das Number Item
Curantee00_Curantee00 ist die Steckdose
Bis jetz geht es nicht
gäbe es ggf die Möglichkeit per Teamviever zu helfen oder mal kurz drüber zuschauen.
Re: Widget mit Switch analyzer schalt zeit berechnen .
Verfasst: 19. Sep 2022 05:57
von udo1toni
Und immer noch lässt Du den Teil rule .... when ... then und das letzte Wort end mit im Rule Code stehen. Das gehört da nicht hin!
Deine zweite Rule prüft alle fünf Minuten jede Sekunde, ob der Wert über der Ladeschlussspannung liegt (14.38). Bzw. Du möchtest, dass das so passiert. Das ist aber nicht der Fall. da Du als Action ein Sleep über 60 Sekunden angegeben hast, passiert genau das: Die Rule wird gestartet, prüft auf 14.38 oder größer und schaltet gegebenenfalls aus und löst den Sleep aus. Ansonsten prüft es halt innerhalb dieser 60 Sekunden jede Sekunden ob der Wert 14.38 erreicht wurde.
Du möchtest aber, dass der wert 14.38 mindestens eine Minute erreicht bzw. überschritten wird, das ist etwas anderes.
Beispielrule folgt...
Re: Widget mit Switch analyzer schalt zeit berechnen .
Verfasst: 19. Sep 2022 07:53
von udo1toni
So, etwas nachgedacht.
Es gibt über die UI Rules sicher auch andere Möglichkeiten, aber ich versuche mal eine möglichst einfache Lösung zu präsentieren.
openHAB hat eine Funktion, die expiration Timer heißt. Jedes Item kann mit einer Expiration versehen werden und löst dann nach Ablauf der eingetragenen Zeit entweder einen Befehl oder auch nur einen Statuswechsel aus. Dabei reicht es, das Item regelmäßig zu retriggern, um den expire Befehl zu verhindern (das kann man auch verhindern, hier brauchen wir diesen Retrigger aber).
Die Idee ist nun, den Schalter Curantee00_Curantee00 mit einer expiration von 6 Minuten und dem Befehl OFF zu versehen. Wahlweise gehen auch kürzere Zeiten, es muss nur sichergestellt werden, dass der Messwert SolarBatterie_SolarBatterie in einem kürzeren Abstand aktualisiert wird.
Die Einschaltrule triggert, wenn die Spannung unter 11.9 Volt gesunken ist und schaltet den Schalter ein.
Eine zweite Rule (die für das Halten im eingeschalteten Zustand zuständig ist) triggert, wenn die Spannung unter 14.38 Volt ist, aber nur, wenn Curantee00_Curantee00 den Zustand ON hat. Sie tut nichts anderes, als per postUpdate den Status des Items Curantee00_Curantee00 auf ON zu halten.
Diese Rule wird nach Erreichen der Ladeschlussspannung nicht mehr getriggert und in der Folge schaltet Curantee00_Curantee00 über die Expiration nach 6 Minuten (oder entsprechend früher) ab.
Am besten arbeitest Du nicht mit Time cron, sondern mit Wertänderung als Trigger (mindestens für die zweite Rule - dort könnte sogar das reine Update des Messwerts als Trigger geeignet sein, kommt etwas auf die Messmethode an). Ändert sich der Messwert kurz, so muss der Wert 14.38 mindestens 6 Minuten am Stück nicht unterschritten werden.
Ich bin momentan noch auf der Arbeit, aber wenn ich zuhause bin, kann ich die Rules mal über die UI einklappern, damit Du siehst, wie der Code aussehen muss.