Fehler im Visual Studio Nach Umstieg auf OH3

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Benutzeravatar
djuscha
Beiträge: 130
Registriert: 14. Mai 2016 00:12
Answers: 0

Fehler im Visual Studio Nach Umstieg auf OH3

Beitrag von djuscha »

Bin immer noch am Umziehen auf OH 3
Meine rules die ich hatte gehen teilweise und teilweise sind Fehler im Code ist wohl einiges anders im OH 3 im vergleich zu OH2.5
ich versende email mit Uhrzeit wenn ich die Garage lüfte

Code: Alles auswählen

mailActions.sendHtmlMail("innogysmart@gmail.com", "Garage wird gelüftet.", "Garage wird gelüftet"+now.toString ("HH:mm:ss"), attachmentUrlList)


now.toString wird als Fehler angezeigt

Code: Alles auswählen

[{
	"resource": "/V:/rules/garage.rules",
	"owner": "_generated_diagnostic_collection_name_#0",
	"code": "org.eclipse.xtext.xbase.validation.IssueCodes.invalid_number_of_arguments",
	"severity": 8,
	"message": "Invalid number of arguments. The method toString() is not applicable for the arguments (String)",
	"startLineNumber": 55,
	"startColumn": 108,
	"endLineNumber": 55,
	"endColumn": 116
}]
dann hab ich noch in anderen rules

Code: Alles auswählen

if(now.getMinuteOfDay > 5 || now.getHourOfDay < 22)      // Falls Uhrzeit   
hab ich Fehler

Code: Alles auswählen

[{
	"resource": "/V:/rules/garage.rules",
	"owner": "_generated_diagnostic_collection_name_#0",
	"code": "org.eclipse.xtext.diagnostics.Diagnostic.Linking",
	"severity": 8,
	"message": "The method or field getMinuteOfDay is undefined for the type ZonedDateTime",
	"startLineNumber": 69,
	"startColumn": 20,
	"endLineNumber": 69,
	"endColumn": 34
}]
[{
	"resource": "/V:/rules/garage.rules",
	"owner": "_generated_diagnostic_collection_name_#0",
	"code": "org.eclipse.xtext.diagnostics.Diagnostic.Linking",
	"severity": 8,
	"message": "The method or field getHourOfDay is undefined for the type ZonedDateTime",
	"startLineNumber": 69,
	"startColumn": 46,
	"endLineNumber": 69,
	"endColumn": 58
}]
ist die schreibweise jetzt anders?
Zuletzt geändert von djuscha am 8. Apr 2022 22:00, insgesamt 1-mal geändert.

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

Re: Fehler im Visual studio

Beitrag von udo1toni »

Ja. openHAB vor Version 3 nutzte Joda Time als Bibliothek für komfortables Arbeiten mit Datum und Zeit. Dies rührte noch aus Zeiten als Oracle hier nichts bot. Mit Java 8 ist aber JavaTime mit eingezogen. openHAB seit Version 2.x (bin mir absolut unsicher, wann das war) hat deshalb JavaTime eingeführt. Beide Bibliotheken waren also eine ganze Zeit parallel verfügbar. Leider wurde das aber nicht großartig kommuniziert (stand aber irgendwo in den Change Notes drin...) Mit openHAB 3, welches auf Java11 aufsetzt, wurde Joda Time entfernt. Joda Time war auch schon geraume Zeit als deprecated gekennzeichnet und auch die Programmierer von Joda Time empfehlen den Schwenk auf JavaTime.

Oracle hat eigene Vorstellungen davon, wie solche Funktionen auszusehen haben. Deshalb sind beide Bibliotheken nicht funktionsgleich. .getMinuteOfDay gibt es nicht. Du kannst mit (now.getHour * 60 + now.getMinute) den Wert einfach berechnen.
Alternativ müsste auch now.get(Chronofield.MINUTE_OF_DAY) gehen.

Was die Formatierung mittels .toString angeht, so bin ich verwundert, dass das so funktioniert hat.
Ich würde stattdessen ein String::format("HH:MM:SS",now) probieren.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Benutzeravatar
djuscha
Beiträge: 130
Registriert: 14. Mai 2016 00:12
Answers: 0

Re: Fehler im Visual studio

Beitrag von djuscha »

das mit String

Code: Alles auswählen

 mailActions.sendHtmlMail("innogysmart@gmail.com", "Garage wird gelüftet.", "Garage wird gelüftet"+ String::format("HH:MM:SS",now) 
ist jetzt ohne Fehler im Visual Studio aber in der email bekomme ich nur
Garage wird gelüftetHH:MM:SS

das andere hab ich auf

Code: Alles auswählen

if((now.getHour * 60 + now.getMinute) > 5 || now.getHour < 22)   
geändert muss ich morgen testen ob die rules geht

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

Re: Fehler im Visual studio

Beitrag von udo1toni »

Ach, siehste mal... Das da:

Code: Alles auswählen

if(now.getMinuteOfDay > 5 || now.getHourOfDay < 22)      // Falls Uhrzeit   
Kannst Du auch so schreiben:

Code: Alles auswählen

if(true)
|| -> mindestens eine der beiden Bedingungen muss erfüllt sein
now.getMinuteOfDay > 5 ist nach 00:05:59 Uhr für jede Uhrzeit bis 23:59:59 Uhr erfüllt.
now.getHourOfDay < 22 ist von 00:00:00 Uhr bis 21:59:59 Uhr für jede Uhrzeit erfüllt.
Daraus ergibt sich: von 0:00:00 bis 00:05:59 ist die zweite Bedingung erfüllt. Ab 0:06:00 Uhr bis 21:59:59 Uhr sind beide Bedingungen erfüllt. Ab 22:00:00 Uhr bis 23:59:59 Uhr ist die erste Bedingung erfüllt -> es ist immer eine der Bedingungen erfüllt.

In welchem Zeitraum soll die Bedingung tatsächlich erfüllt sein?
djuscha hat geschrieben: 7. Apr 2022 23:14 In der email bekomme ich nur

Garage wird gelüftetHH:MM:SS
Ach, Käse, Notation durcheinander gebracht... So muss es aussehen:

Code: Alles auswählen

 mailActions.sendHtmlMail("innogysmart@gmail.com", "Garage wird gelüftet.", "Garage wird gelüftet"+ String::format("%1T",now) 
%1T ist die Kurzform für %1H:%1M:%1S
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Benutzeravatar
djuscha
Beiträge: 130
Registriert: 14. Mai 2016 00:12
Answers: 0

Re: Fehler im Visual studio

Beitrag von djuscha »

Hm.. wenn ich das nehme

Code: Alles auswählen

 mailActions.sendHtmlMail("innogysmart@gmail.com", "Garage wird gelüftet.", "Garage wird gelüftet"+ String::format("$1T",now) 
dann steht in der email

Garage wird gelüftet§1T bzw Garage wird gelüftet§1H:§1M:§1S :(

was die andere rules angeht ..es soll von 22 bis 5 uhr Überprüft werden ob garage länger wie 10 min offen ist dann gibt es Nachricht mit Telegram un email
die ganze rules sieht so aus

Code: Alles auswählen

import java.util.List
var Timer tGarage = null 

rule "Garage Timer"
when
    Item Sonoffsv2auf changed
then
    if(tGarage !== null) tGarage.cancel                   // falls noch ein Timer existiert, löschen - unabhängig vom Zustand!
    if(Sonoffsv2auf.state == ON)                            //nur falls Garage geöffnet wurde den Timer erstellen
        tGarage = createTimer(now.plusMinutes(10), [|
            if((now.getHour * 60 + now.getMinute) > 5 || now.getHour < 22)      // Falls Uhrzeit 22 bis 5 
        
            executeCommandLine("ffmpeg", "-i", "http://admin:6290@192.168.178.101:81/videostream.cgi?rate=0&user=admin&pwd=6290", "-s", "480x300", "-f", "image2", "-vframes", "1", "pic.jpg", "-y", "/etc/openhab2/html/pic20.jpg")
            Thread::sleep(3000)

        val telegramAction = getActions("telegram","telegram:telegramBot:bot1")
        telegramAction.sendTelegram( "\u26d4 Garage ist laenger als 10 min. OFFEN! \u26d4 ") 
        telegramAction.sendTelegramPhoto( "http://192.168.178.140:8080/static/pic20.jpg", "Kamera Garage")

        val List<String> attachmentUrlList = newArrayList(
        "http://192.168.178.140:8080/static/pic20.jpg")
    
        val mailActions = getActions("mail","mail:smtp:samplesmtp")
        mailActions.sendHtmlMail("innogysmart@gmail.com", "\u26d4 Garage ist laenger als 10 min. OFFEN!", "Bitte schliessen "+ String::format("$1T",now), attachmentUrlList)

        ])
end



Benutzeravatar
djuscha
Beiträge: 130
Registriert: 14. Mai 2016 00:12
Answers: 0

Re: Fehler im Visual studio

Beitrag von djuscha »

zum String Format hab ich die Lösung gefunden ,das geht

Code: Alles auswählen

%1$tH:%1$tM:%1$tS 
so ist die ganze Zeile

Code: Alles auswählen

 mailActions.sendHtmlMail("innogysmart@gmail.com", "Garage wird gelüftet.", "Garage wird gelüftet"+ String::format("%1$tH:%1$tM:%1$tS",now) 

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

Re: Fehler im Visual Studio Nach Umstieg auf OH3

Beitrag von udo1toni »

Ja, Tippfehler meinerseits. :)

Ich korrigiere das oben...
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Benutzeravatar
djuscha
Beiträge: 130
Registriert: 14. Mai 2016 00:12
Answers: 0

Re: Fehler im Visual Studio Nach Umstieg auf OH3

Beitrag von djuscha »

Das mit Zeitraum hab ich irgend wie falsch ich möchte von 22 bis 5 uhr Morgens abfragen ob die Garage länger wie 10 min offen ist.
Bei mir ist irgendwie andersrum von 5 Uhr bis 22

int5749
Beiträge: 1173
Registriert: 4. Nov 2019 22:08
Answers: 9

Re: Fehler im Visual Studio Nach Umstieg auf OH3

Beitrag von int5749 »

Warum Du einmal mit Minuten und den anderen Wert mit Stunden rechnest, hat sich mir nicht erschlossen ;-)
Ich rechne da seit OH3 direkt mit den Sekunden (dann kann ich dies sehr genau einstellen) und Du musst dies tauschen und die Verküpfung ändern.

Code: Alles auswählen

if (now.toLocalTime.toSecondOfDay >= 79200 && now.toLocalTime.toSecondOfDay <= 17999)
Dies sollte dann genau zwischen 22:00 und später aber nur bis 5:00 (also 4:59:59) ausgeführt werden.

Nachtrag:

Da Du in Deiner Rule ausschließlich auf ON triggerst, kannst Du dies auch bereits beim ausführen der Rules abfragen.

Code: Alles auswählen

when
    Item Sonoffsv2auf changed to ON
Dann brauchst Du dies in der Rule nicht mehr machen und die Rule wird nur noch bei Wechsel auf ON ausgeführt.
openHAB 4.1.0 Release mit openHABian in einem Debian Bookworm (LXC) unter Proxmox 8.1.3

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

Re: Fehler im Visual Studio Nach Umstieg auf OH3

Beitrag von udo1toni »

int5749 hat geschrieben: 9. Apr 2022 15:45 Da Du in Deiner Rule ausschließlich auf ON triggerst, kannst Du dies auch bereits beim ausführen der Rules abfragen.

Code: Alles auswählen

when
    Item Sonoffsv2auf changed to ON
Dann brauchst Du dies in der Rule nicht mehr machen und die Rule wird nur noch bei Wechsel auf ON ausgeführt.
Nein, die Rule entfernt einen laufenden Timer, falls sie triggert. Zum einen sind damit marodierende Timer ausgeschlossen, denn der Timer wird immer gelöscht, falls der Zeiger auf den Timer gesetzt ist, zum anderen erfolgt die Alarmierung ausschließlich, wenn das Tor länger als die angegeben Zeit offen steht.
int5749 hat geschrieben: 9. Apr 2022 15:45

Code: Alles auswählen

if (now.toLocalTime.toSecondOfDay >= 79200 && now.toLocalTime.toSecondOfDay <= 17999)
Dies sollte dann genau zwischen 22:00 und später aber nur bis 5:00 (also 4:59:59) ausgeführt werden.
Ein Wert kann nicht gleichzeitig (&&) kleiner als 18000 und größer als 79199 sein :) Hier gehört ein oder (||) hin...

Wenn der Timer abläuft, geschieht dennoch nicht das, was gewünscht ist.
Die Prüfung auf das Zeitfenster geschieht innerhalb des Timers, soweit ist das in Ordnung (obwohl der Timer dann tagsüber vollkommen umsonst läuft).
Wenn das Zeitfenster passt, wird ein Bild erzeugt.
Unabhängig davon, ob ein Bild erzeugt wurde, wartet der Code 3 Sekunden und versendet dann das vorhandene Bild. Sprich: Tagsüber bekommst Du einfach das letzte Bild aus der Nacht gesendet. Ich gehe davon aus, dass dies eigentlich nicht erwünscht ist.

Code: Alles auswählen

import java.util.List
var Timer tGarage = null 


rule "Garage Timer"
when
    Item Sonoffsv2auf changed
then
    tGarage?.cancel                                         // falls noch ein Timer existiert, löschen - unabhängig vom Zustand!

    if(Sonoffsv2auf.state == ON)                            // nur falls Garage geöffnet wurde den Timer erstellen
        if((now.getHour < 5 || now.getHour > 21)            // Falls Uhrzeit 22 bis 5 
            tGarage = createTimer(now.plusMinutes(10), [
                val telegramAction = getActions("telegram","telegram:telegramBot:bot1")
                val mailActions    = getActions("mail","mail:smtp:samplesmtp")

                val writePic = "/etc/openhab2/html/pic20.jpg"
                val readPic  = "http://192.168.178.140:8080/static/pic20.jpg"

                executeCommandLine("ffmpeg", "-i", 
                                   "http://admin:6290@192.168.178.101:81/videostream.cgi?rate=0&user=admin&pwd=6290", 
                                   "-s", "480x300", "-f", "image2", "-vframes", "1", "pic.jpg", "-y", writePic)
                Thread::sleep(3000)
                telegramAction.sendTelegram( "\u26d4 Garage ist laenger als 10 min. OFFEN! \u26d4 ") 
                telegramAction.sendTelegramPhoto(readPic , "Kamera Garage")
                val List<String> attachmentUrlList = newArrayList(readPic)
                mailActions.sendHtmlMail("innogysmart@gmail.com", 
                                         "\u26d4 Garage ist laenger als 10 min. OFFEN!", 
                                         "Bitte schliessen "+ String::format("$1T",now), 
                                         attachmentUrlList)
            ])
end
Formatierung des Codes vor allem, damit er hier gut lesbar bleibt. Die Rules DSL scannt den Code und entfernt in einem ersten Schritt alle Kommentare. Im zweiten Schritt werden alle Indentations (Einrückungen und Umbrüche) durch einzelne Leerzeichen ersetzt. Einrückungen und Umbrüche dienen also ausschließlich der Lesbarkeit des Codes und haben sonst keinerlei Bedeutung (im Gegensatz zu YAML oder auch Python).

Die beiden lokalen Konstanten writePic und readPic habe ich eingeführt, damit Anpassungen an einer Stelle im Code ausgeführt werden können. Es gibt noch einige andere Strings, die statisch sind, z.B. die Adresse des Streams. Oftmals bietet es sich an, solche Strings in lokalen oder globalen Konstanten zu speichern. Im vorliegenden Fall könnte z.B. auch die Liste attachmentUrlList ohne weiteres als globale Konstante definiert werden (so sie an anderer Stelle nicht anders belegt wird) da der Inhalt ja nichts weiter ist, als eine fixe Liste mit einem String. Das geht natürlich nur gut, solange die verwendete Konstante readPic bereits definiert ist, die müsste also dann ebenfalls global angelegt sein, und zwar vor attachmentUrlList. Das Bild muss hingegen zum Zeitpunkt der Definition noch nicht existieren, denn zunächst ist das ja einfach nur eine Liste mit Strings. Erst beim Aufruf der Funktion .sendHtmlMail holt die Funktion das Bild über die URL ab.

Ich bin zu faul zum nachschauen... Was macht \u26d4 ? Gibt es einen besonderen Grund, warum dieses Zeichen in der telegram Message zweimal vorkommt, in der Mail aber nur einmal?
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Antworten