manes hat geschrieben: ↑23. Nov 2022 13:09
Ah, jetzt verstehe ich. Typ Number:Power steht drin. Ich habe es angelegt, direkt als ich es dem Thing zugeordnet habe. Und der Grund warum es so über Telegeram laufen soll ist ganz einfach: Das Teil ist an einem Kühlschrank dran, der etwas wild kühlt. Ich möchte nur eine genauere Info bekommen, wann und wie oft der Kühlschrank anspringt um dann etwas anderes zu kontrollieren.
Also geht es eigentlich nicht um den wert selbst. Das ist gut

Wobei... Wenn man den Kühlschrank öffnet, geht ja meist eine Funzel an (oder bei neueren Modellen ein besserer Baustrahler, da LED-Technik)
Mein Vorschlag dazu: Nutze ein Proxy Item für die Meldung. Das Item legst Du einfach an, ohne eine Verknüpfung zu einem Channel vorzunehmen. Lege es als Switch Item an. In den Rules unten habe ich
KuehlschrankAktiv als Item verwendet.
Eine Rule kümmert sich um die Werterfassung bzw. Auswertung:
Code: Alles auswählen
configuration: {}
triggers:
- id: "1"
configuration:
itemName: P110SmartPlug_Power
type: core.ItemStateChangeTrigger
conditions: []
actions:
- inputs: {}
id: "2"
configuration:
type: application/vnd.openhab.dsl.rule
script: >-
val power = (P110SmartPlug_Power.state as Number).floatValue
var new = OFF
if(power > 20)
new = ON
if(KuehlschrankAktiv.state != new)
KuehlschrankAktiv.postUpdate(new.toString)
type: script.ScriptAction
Die Rule triggert immer, wenn sich der Messwert ändert.
Zunächst wandelt sie den Messwert in eine einfache Zahl und speichert diese in der lokalen Konstanten power.
Anschließend definiert sie eine lokale Variable und füllt sie mit dem State OFF.
Nun folgt ein Vergleich, ob power > 20 ist. Ist das der Fall, wird new auf ON gewechselt.
Zum Schluss wird der Status des Items KuehlschrankAktiv geändert, falls er vom neuen Status abweicht.
Die 20 sind von mir willkürlich ausgesucht, der Wert sollte auf jeden Fall über 0 gewählt werden, am einfachsten prüfst Du die Stromaufnahme bei abgeschaltetem Kompressor und geöffneter Tür und nimmst einen leicht höheren Wert.
Eine weitere Rule kümmert sich darum, die Nachricht zu verschicken:
Code: Alles auswählen
configuration: {}
triggers:
- id: "1"
configuration:
itemName: KuehlschrankAktiv
type: core.ItemStateChangeTrigger
conditions: []
actions:
- inputs: {}
id: "2"
configuration:
type: application/vnd.openhab.dsl.rule
script: >-
val timestamp = KuehlschrankAktiv.lastUpdate.toEpochSecond
val iDiff = (now.toEpochSecond - timestamp).intValue
val iSec = iDiff % 60
val iMin = ((iDiff - iSec) / 60).intValue % 60
val iHour = ((iDiff - iSec - iMin * 60) / 3600).intValue
var strDauer = iHour.toString + ":" +
if(iMin < 10) "0" else "" +
iMin.toString + ":" +
if(iSec < 10) "0" else "" +
iSec.toString
var strMessage = "Ein"
if(KuehlschrankAktiv.state == ON)
strMessage = "Aus"
var strMessage = strMessage + "schaltdauer des Kühlschranks war " + strDauer
val telegramAction = getActions("telegram","telegram:telegramBot:XXXXXXXXXXX")
telegramAction.sendTelegram(strMessage)
type: script.ScriptAction
Es wird in jeder Meldung ausgegeben, wie lang die vorherige Phase gedauert hat.
Der Code ist nicht geprüft

kann also sein, dass er so nicht funktioniert, die Umrechnung von Seklunden in Stunden, Minuten und Sekunden ist manchmal etwas tricky. Zur Not könnte man aber zunächst die Differenz einfach direkt ausgeben, das wären dann halt Sekunden.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet