HmIP Schalt-/Mess Steckdose nach Leistung schalten

Moderator: seppy

Antworten
CeBe
Beiträge: 2
Registriert: 28. Mär 2026 20:42
Answers: 0

HmIP Schalt-/Mess Steckdose nach Leistung schalten

Beitrag von CeBe »

Liebe Community,
ich dachte ich hätte mit Hilfe dieser Community eine Lösung für meinen Anwendungsfall gefunden. Obwohl der Anwendungsfall genau passt, will es bei mir aber nicht funktionieren. Ich habe einen Akku der geladen werden soll. Das Ladegerät hängt an einer Homematic IP Schalt- und Messsteckdose. Wenn der Akku voll ist geht die Leistungsaufnahme des Ladegerätes auf unter 5 W. Das Ladegerät soll dann möglichst bald getrennt werden. Das soll meine Steckdose nun automatisch machen. D.h. wenn der Power Wert unter 5 W fällt soll die HmIP-Steckdose das Ladegerät vom Netz trennen. Von udo1toni gab es genau dafür eine Lösung, aber irgendetwas mach ich wohl falsch. Hier der von mir angepasste Code:

Code: Alles auswählen

configuration: {}
triggers:
  - id: "1"
    configuration:
      itemName: HmIPPSM2Horwin_Power
      state: Any
    type: core.ItemStateChangeTrigger
conditions:
  - inputs: {}
    id: "3"
    configuration:
      itemName: HmIPPSM2Horwin_Power
      state: "5"
      operator: <=
    type: core.ItemStateCondition
actions:
  - inputs: {}
    id: "2"
    configuration:
      itemName: HmIPPSM2Horwin_3_STATE
      command: OFF
    type: core.ItemCommandAction
Frontail zeigt auch dass der Powerwert unter die 5 W fällt:

2026-03-28 20:56:06.848 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'HmIPPSM2Horwin_Power' changed from 44.15 W to 0.22 W

Das Item "HmIPPSM2Horwin_Power" ist vom Typ Number:Power mit der Unit "W" aber auch die Angabe mit state: "5 W" funktioniert nicht. Die Steckdose wird nicht abgeschalten. Hat hier jemand eine Idee was ich falsch mache?

Benutzeravatar
udo1toni
Beiträge: 15666
Registriert: 11. Apr 2018 18:05
Answers: 254
Wohnort: Darmstadt

Re: HmIP Schalt-/Mess Steckdose nach Leistung schalten

Beitrag von udo1toni »

Die Condition kannst Du in dem Zusammenhang mit QuantityType Items (Number:<irgendwas>) nicht verwenden, weil die Typumwandlung hier nicht greift.
Stattdessen musst Du eine Rule mit Script erstellen und innerhalb des Scripts die Prüfung vornehmen, z.B.

Code: Alles auswählen

configuration: {}
triggers:
  - id: "1"
    configuration:
      itemName: HmIPPSM2Horwin_Power
      state: Any
    type: core.ItemStateChangeTrigger
conditions: []
actions:
  - inputs: {}
    id: script
    configuration:
      type: application/vnd.openhab.dsl.rule
      script: >
        if((HmIPPSM2Horwin_Power.state instanceof Number) && (HmIPPSM2Horwin_Power.state as Number).floatValue < 5)
          HmIPPSM2Horwin_3_STATE.sendCommand(OFF)
    type: script.ScriptAction
Der Unterschied besteht also lediglich darin, dass Du die Condition weg lässt und statt des einfachen Commands ein Script ausführen lässt.
Und innerhalb des Scripts ist dann die Condition eingebettet, nur kann man an dieser Stelle viel genauer definieren, was passieren soll.
Der Code (Item.state as Number).floatValue nimmt den Itemstatus und castet ihn in einen Number Type. Danach wird der Float Wert dieses NumberType verwendet. Float kennt keine Units, die wird also abgeschnitten.
Die Prüfung, ob es sich beim Status um den Datentyp Number handelt, verhindert, dass die Rule eine Fehlermeldung generiert, wenn das Item keinen gültigen Status hat.

Eine Alternative wäre, explizit mit den Units zu arbeiten:

Code: Alles auswählen

if((Item.state instancceof Number) && (Item.state as QuantityType<Power>) < 5|W)
Allerdings muss man dabei sehr genau auf die korrekte Schreibweise achten und teilweise für "simple" mathematische Operatoren Funktionsaufrufe verwenden, das ist also eher etwas für Fortgeschrittene. Dennoch wäre das die "saubere" Lösung, weil die Einheit mit berücksichtigt wird. .floatValue schneidet sie einfach ab, egal welche Einheit geliefert wurde, und es besteht nun mal ein Unterschied zwischen W und mW (um nur ein Beispiel zu zeigen)
openHAB5.1.3 stable in einem Debian-Container (trixie, OpenJDK 21 headless runtime - LXC, 4 Kerne, 3 GByte RAM)
Hostsystem Proxmox VE 9.1.6 - AMD Ryzen 5 3600 6 Kerne, 12 Threads - 64 GByte RAM - ZFS Pools: Raid Z1, 3 x 20 TB HDD -> 40 TByte und Raid Z0-Mirrored 4 x 1 TByte NVMe -> 2 TByte

Benutzeravatar
peter-pan
Beiträge: 2859
Registriert: 28. Nov 2018 12:03
Answers: 30
Wohnort: Schwäbisch Gmünd

Re: HmIP Schalt-/Mess Steckdose nach Leistung schalten

Beitrag von peter-pan »

Es gibt eine relativ einfache Lösung mit einer DSL-Rule (Text) durch Entfernung der Einheit.

Code: Alles auswählen

rule "Test Umwandlung Einheit"
 when 
   Item HmIP_socket2_6POWER changed
//   Item Socket_Fritz_02_Temp changed
 then 

   if ((HmIP_socket2_6POWER.state as Number).floatValue < 5)
        logInfo("homematic","Wert ist kleiner als 5")
    else   logInfo("homematic","Wert ist grösser als 5 {}", (HmIP_socket2_6POWER.state as Number).floatValue)   
end
Wobei du das Item-Name noch verändern musst.

Mein Item sieht so aus:

Code: Alles auswählen

Number:Power             HmIP_socket2_6POWER                         "Power - Leistung"                                             <poweroutlet>    (gPSM_E265)                           ["Power"]                        {channel="homematic:HMIP-PSM:3014F711A0001F98A9AABCAF:0001DD8993E265:6#POWER"}
Eventuell könnte auch ein Vergleich in der Form (117.0 | kWh) , also ohne Umwandlung funktionieren.

Wie das allerdings über die Main-UI geht, fällt mir gerade nicht ein bzw. weiss ich nicht :oops: :roll:

Edit:
Sorry, Udo hat das Problem schon gelöst, während ich noch "gebastelt" habe.
Pi5/8GB(PiOS Lite 64-bit(trixie)/SSD 120GB - OH5.1.3 openhabian
(Test openHAB 5.2.0-SNAPSHOT - Build #5272)

CeBe
Beiträge: 2
Registriert: 28. Mär 2026 20:42
Answers: 0

Re: HmIP Schalt-/Mess Steckdose nach Leistung schalten

Beitrag von CeBe »

Vielen Dank, das hat mich schon ein ganzes Stück weiter gebracht. Ich habe die von Udo vorgeschlagene Variante 1 mit dem Abschneiden der Einheit als float type versucht:

Die Rule schaltet immer noch nicht automatisch ab. Ich vermute, dass mein Trigger noch falsch ist. Wenn der Power Wert (angezeigt in Frontail) größer 5 ist und ich die Rule manuell ausführe, dann bleibt die Steckdose wunschgemäß an. Liegt der Power Wert unter 5 schaltet die Steckdose bei manueller Ausführung der Rule ab.

Das müsste bedeuten dass die Condition im Inline Script nun funktioniert, die Rule aber trotz der Änderung der Leistung . . .

2026-03-29 14:13:20.477 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'HmIPPSM2Horwin_Power' changed from 44.29 W to 0.22 W

. . . gar nicht aufgerufen wird, weil eben mein Trigger noch nicht stimmt, oder?

Nachtrag:
Habe gerade den Trigger von change auf update geändert:

configuration: {}
triggers:
- id: "1"
configuration:
itemName: HmIPPSM2Horwin_Power
type: core.ItemStateUpdateTrigger

Jetzt schaltet die Steckdose wie gewünscht.

Herzlichen Dank nochmal an euch beide für eure Mühe und die ausführliche Erklärung.

Gibt es in Openhab eigentlich eine Möglichkeit ein Script zu tracen und die Variablen während des Ablaufs in einem Watch Fenster zu kontrollieren? Es wäre dann viel einfacher so einen Fehler zu finden.

Antworten