Seite 1 von 1

Rule: getDayOfMonth() funktioniert mal und mal nicht

Verfasst: 9. Jan 2023 19:17
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é

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

Verfasst: 9. Jan 2023 22:53
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.

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

Verfasst: 10. Jan 2023 10:50
von KellerK1nd
Darum habe ich angefangen meine Regeln durchzunummerieren. In openHAB 2 statt im Log noch der Name der Regel die den Fehler auswirft.

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

Verfasst: 10. Jan 2023 13:45
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

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

Verfasst: 10. Jan 2023 19:22
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é

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

Verfasst: 10. Jan 2023 23:55
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

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

Verfasst: 12. Jan 2023 19:20
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
 
 

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

Verfasst: 13. Jan 2023 00:14
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.