Rule: getDayOfMonth() funktioniert mal und mal nicht

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
Andre_H_
Beiträge: 10
Registriert: 15. Apr 2022 08:16
Answers: 1

Rule: getDayOfMonth() funktioniert mal und mal nicht

Beitrag von Andre_H_ »

Hey Leute,

ich habe hier ein komisches Phänomen. Ich möchte mir den Tag des Monats ausgeben lassen um damit nachher weiter arbeiten zu können. Es scheitert aber schon an now.getDayOfMonth(). Ich habe hier mal zum Test folgendes Script geschrieben, was mir den Tag des Monats alle 10 Minuten per E-Mail schicken soll. Komischerweise wird das Script ca. 5-6 mal am Tag erfolgreich ausgeführt. Sonst führt das Script immer zu fehlern. Kann ich so nicht nachvollziehen, denn warum sollte es mal funktionieren und mal nicht? Jmd eine Idee?

Code: Alles auswählen

rule "Zaehlerstaende test"
when
	 Time cron "0 0/10	 * * * ?"

then
  
var heute = now.getDayOfMonth() // 11 (11.09.2022)
mailtext = mailtext + heute

val mailActions = getActions("mail","mail:smtp:webxxl")
val success = mailActions.sendHtmlMail("email@blabla.com", "Energiestatistik Haus", mailtext)

end

Code: Alles auswählen

Fehler:
Error in Log: 2023-01-08 10:55:00.850 [ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID ‘benachrichtigungen-3’ failed: An error occurred during the script execution: Could not invoke method: org.openhab.core.model.script.actions.Log.logError(java.lang.String,java.lang.String,java.lang.Object[]) on instance: null in benachrichtigungen
Danke für die Hilfe!
LG André

J-N-K
Beiträge: 126
Registriert: 20. Jun 2020 12:21
Answers: 4
Wohnort: Gelsenkirchen, NRW

Re: Rule: getDayOfMonth() funktioniert mal und mal nicht

Beitrag von J-N-K »

Das passt aber nicht zusammen. Die Rule soll alle zehn Minuten, beginnen mit Minute 0 triggern. Das Log ist von 10:55, was offensichtlich nicht dazu passt.
openHAB 4.0.0-SNAPSHOT - - local build -
APU2, 4GB RAM, 32GB SSD, Debian Buster
openHAB Core/Distro/Addons & SmartHome/J Maintainer

Benutzeravatar
KellerK1nd
Beiträge: 432
Registriert: 17. Jun 2019 16:45
Answers: 1
Wohnort: Griesheim

Re: Rule: getDayOfMonth() funktioniert mal und mal nicht

Beitrag von KellerK1nd »

Darum habe ich angefangen meine Regeln durchzunummerieren. In openHAB 2 statt im Log noch der Name der Regel die den Fehler auswirft.
Betriebssystem: Proxmox 7.3-4
openHAB Container: debian11 LXC
openHAB Version: 3.4
Hardware: HomeServer Eigenbau mit einem Intel i5 9600K
Smarthome-Equipment:
- Rasperrymatic
- deConz
- HUE
- Shellys
- Mosquitto
- AVM Fritz!Box

EmptySoft
Beiträge: 247
Registriert: 7. Jan 2020 14:45
Answers: 2
Kontaktdaten:

Re: Rule: getDayOfMonth() funktioniert mal und mal nicht

Beitrag von EmptySoft »

die Zeile

Code: Alles auswählen

mailtext = mailtext + heute
greift auf mailtext zu, der nicht initialisiert ist, deswegen steht im Error, dass er wegen null nicht kann
BYe
Harald

Andre_H_
Beiträge: 10
Registriert: 15. Apr 2022 08:16
Answers: 1

Re: Rule: getDayOfMonth() funktioniert mal und mal nicht

Beitrag von Andre_H_ »

Ich hab das Script jetzt nochmal etwas umgebaut erhalte aber weiterhin die gleiche Fehlermeldung:

Code: Alles auswählen

rule "Zaehlerstaende test"
when
	 Time cron "0 0/1	 * * * ?"
then

var heute = now.getDayOfMonth() 
var mailtext = heute

val mailActions = getActions("mail","mail:smtp:webxxl")
val success = mailActions.sendHtmlMail("email@blabla.de", "Energiestatistik Haus", mailtext)


end

Code: Alles auswählen

2023-01-10 19:21:04.839 [ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID 'benachrichtigungen-6' failed: An error occurred during the script execution: Could not invoke method: org.openhab.binding.mail.internal.action.SendMailActions.sendHtmlMail(org.openhab.core.thing.binding.ThingActions,java.lang.String,java.lang.String,java.lang.String) on instance: null in benachrichtigungen
Müsste doch alles passen? mhmh...

Danke für eure Hilfe!
LG André

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

Re: Rule: getDayOfMonth() funktioniert mal und mal nicht

Beitrag von udo1toni »

Nö.

Du übergibst der Funktion sendHtmlMail() die Variable mailtext.
Die Variable mailtext wird mit dem Inhalt von heute gefüllt.
heute ist ebenfalls eine Variable, die mit .getDayOfMonth() gefüllt wird.

Das heute ein Objekt ist, welches mit einer Zahl gefüllt wird, dürfte es sich um ein Number Objekt handeln.
Damit wird mailtext ebenfalls zum Number Objekt.
Die Funktion sendHtmlMail() erwartet allerdings Strings als Parameter.

Code: Alles auswählen

rule "Zaehlerstaende test"
when
    Time cron "0 0/10 * * * ?"
then
    val heute = now.getDayOfMonth().toString // lokale Konstante als String erzeugen
    val mailtext = "Heute ist der " + heute + ". Tag im Monat!"
    val mailActions = getActions("mail","mail:smtp:webxxl")
    val success = mailActions.sendHtmlMail("email@blabla.com", "Energiestatistik Haus", mailtext)
end
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Andre_H_
Beiträge: 10
Registriert: 15. Apr 2022 08:16
Answers: 1

Re: Rule: getDayOfMonth() funktioniert mal und mal nicht

Beitrag von Andre_H_ »

Vielen Dank für den Tip :-) - das hilft mir schon mal weiter. Dennoch scheint sich noch ein Fehler in meinem Gesamtscript eingeschleust zu haben. Ich möchte mit der Regel eine Tabelle erzeugen die mir von jeden Tag des Monats die Energiewerte liefert. Damit ich now.getDayOfMonth in der Whileschleife nutzen kann benötige ich es doch als Number Objekt. Es scheint aber noch woanders ein Problem zu sein:

Code: Alles auswählen


rule "Energiestatistik Mail"
when
	 Time cron "0 0/1	 * * * ?"
	 //Time cron "0 50 23 ? * MON-SUN *" 
	// Time cron "0 55 23 L * ?" // letzter Tag im Monat
then


var mailtext = "<table border='0'>
  <tr>
    <td width='100'>Datum</td>
    <td width='250'><div align='right'>Gas</div></td>
    <td width='150'><div align='right'>W&auml;rmestrom</div></td>
    <td width='150'><div align='right'>Hausstrom</div></td>
    <td width='150'><p align='right'>Au&szlig;entemperatur</p>    </td>
  </tr>"
  

var i = 0
var x = 0
var heute = now.getDayOfMonth  // 11 (11.09.2022)


 while ((i=i+1) <= heute) {
  	mailtext = mailtext + " <tr>
   	<td width='100'>" + i + "." + now.getMonth().getValue + "</td>
   	<td width='250'><div align='right'>"+ gas_Verbrauch_Tag.historicState(now.minusDays(heute-i)).state.toString + " kWh (" + 			gas_Kosten_Tag.historicState(now.minusDays(heute-i)).state.format("%.2f").toString + " €) </div></td>
  	<td width='150'><div align='right'>"+ Stromzaehler_Waerme_Verbrauch_gesamt_Tag.historicState(now.minusDays(heute-i)).state.toString + " kWh (" + Stromzaehler_Waerme_gesamt_Kosten_Tag.historicState(now.minusDays(heute-i)).state.format("%.2f").toString + " €)</div></td>
  	<td width='150'><div align='right'>"+ Stromzaehler_Hausstrom_Verbrauch_Tag.historicState(now.minusDays(heute-i)).state.toString + " kWh (" + Stromzaehler_Hausstrom_Kosten_Tag.historicState(now.minusDays(heute-i)).state.format("%.2f").toString + " €)</div></td>
   	<td width='150'><p align='right'>"+ Wetterstation_AktuelleTemperatur.historicState(now.minusDays(heute-i).minusHours(8)).state.format("%.1f %unit%").toString + " (14 Uhr)</p>    </td>
  
 

 </tr>"
 }
 mailtext = mailtext + " </table>"
 



val mailActions = getActions("mail","mail:smtp:webxxl")
val success = mailActions.sendHtmlMail("email@ablabla.de", "Energiestatistik Haus", mailtext)


end

Code: Alles auswählen

2023-01-12 19:17:10.715 [ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID 'benachrichtigungen-7' failed: cannot invoke method public abstract org.openhab.core.types.State org.openhab.core.persistence.HistoricItem.getState() on null in benachrichtigungen
 
 

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

Re: Rule: getDayOfMonth() funktioniert mal und mal nicht

Beitrag von udo1toni »

Du nutzt minusDays() als Funktion, das erwartet unsinged Integer. Mein Tipp wäre, statt heute - i lieber (heute - 1).intValue zu nehmen.
Es böte sich an (weil Du den Ausdruck sieben Mal nutzt) da für eine lokale Variable einzuführen.
Außerdem stehen die Werte in umgekehrter Reihenfolge in der Tabelle, es wäre also geschickter, in umgekehrter Reihenfolge zu zählen:

Code: Alles auswählen

var x = 0
var heute = now.getDayOfMonth  // 11 (11.09.2022)
var i = heute

while ((i=i-1) >= 0) {
    mailtext = mailtext + " <tr>
    <td width='100'>" + (heute-1).toString + "." + now.getMonth().getValue + ".</td>
    <td width='250'><div align='right'>"+ gas_Verbrauch_Tag.historicState(now.minusDays(i)).state.toString + " kWh (" + gas_Kosten_Tag.historicState(now.minusDays(i)).state.format("%.2f").toString + " €) </div></td>
    <td width='150'><div align='right'>"+ Stromzaehler_Waerme_Verbrauch_gesamt_Tag.historicState(now.minusDays(i)).state.toString + " kWh (" + Stromzaehler_Waerme_gesamt_Kosten_Tag.historicState(now.minusDays(i)).state.format("%.2f").toString + " €)</div></td>
    <td width='150'><div align='right'>"+ Stromzaehler_Hausstrom_Verbrauch_Tag.historicState(now.minusDays(i)).state.toString + " kWh (" + Stromzaehler_Hausstrom_Kosten_Tag.historicState(now.minusDays(i)).state.format("%.2f").toString + " €)</div></td>
    <td width='150'><p align='right'>"+ Wetterstation_AktuelleTemperatur.historicState(now.minusDays(i).minusHours(8)).state.format("%.1f %unit%").toString + " (14 Uhr)</p>    </td>
    ...
Dann erübrigt sich das mit der Variablen natürlich...
Ohne Gewähr.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Antworten