Ferien und Feiertage via ICAL

Für welche Projekte verwendet Ihr OpenHAB? Was habt Ihr automatisiert? Stellt eure Projekte hier vor.

Moderatoren: Cyrelian, seppy

michaL
Beiträge: 16
Registriert: 13. Apr 2018 22:43

Re: Ferien und Feiertage via ICAL

Beitrag von michaL »

Hallo,

danke. Ich bräuchte nur noch einen deutlichen Hinweis darauf, welches Binding ic loggen soll. Ich kann Auszüge auf der event.log oder der openhab.log angeben, aber ich weiß nicht, welchen Aspekt des loggings ich einstellen muss?!

Mfg Michael

michaL
Beiträge: 16
Registriert: 13. Apr 2018 22:43

Re: Ferien und Feiertage via ICAL

Beitrag von michaL »

Hallo noch einmal,

bitte gebt mir doch noch einen deutlichen Tipp, welche Logs ich hier einstellen soll. Interesse besteht weiterhin.

Danke im Voraus.

Mfg Michael

StefanH.
Beiträge: 162
Registriert: 28. Dez 2017 11:37

Re: Ferien und Feiertage via ICAL

Beitrag von StefanH. »

Gegenfrage, was zeigt denn deine sitemap in der basic ui an?

PS: Ich wuerde die Datei nicht immer vom orginal server runterladen, sondern local ablegen und einlesen (z.B. lokaler nginx)

michaL
Beiträge: 16
Registriert: 13. Apr 2018 22:43

Re: Ferien und Feiertage via ICAL

Beitrag von michaL »

Hallo,

danke für die Anregungen.

Ich habe nun in meine sitemap folgendes eingefügt:

Code: Alles auswählen

   Frame label="Ferien" {
        Text item=GlobalHolidayName label="Ferien/Feiertag [%s]" icon="calendar" visibility=[GlobalHoliday==ON]
   }
Zu sehen bekomme ich beim Aufrufen der entsprechenden Sitemap in der BasicUI ein ansonsten leeres Feld mit der Beschriftung "Ferien".

Ich nehme an, dass sollte nicht so aussehen?

Mfg Michael

StefanH.
Beiträge: 162
Registriert: 28. Dez 2017 11:37

Re: Ferien und Feiertage via ICAL

Beitrag von StefanH. »

tja, da wird wohl nur seppy weiterhelfen können. Ich habe das Script nicht im Einsatz. Logs wäre sicherlich auch hilfreich. Vielleicht crashed das Script bei dir und setzt deshalb die Variable nicht.

michaL
Beiträge: 16
Registriert: 13. Apr 2018 22:43

Re: Ferien und Feiertage via ICAL

Beitrag von michaL »

Hallo,

Logs will ich gerne liefern, weiß nur nicht genau, welche Logs, welche Einstellungen für die Logs, etc.
Ich bin beim eingesetzten OS (Linux) genug bewandert, Auszüge relevanter Dateien zu geben. Ich habe aber schon selbst nach Einträgen gesucht (in /var/log/openhab2/openhab.log und /var/log/openhab2/events.log), aber keine gefunden. Daher suche ich um Hilfe. Ich kenne die openhab-Konsole rudimentär, weiß aber nicht, für welchen Bereich ich das Debuglevel hochsetzen muss.

Ich bin durchaus willig, im Moment aber wirklich unterinformiert. :(

Mfg Michael

Benutzeravatar
seppy
Beiträge: 738
Registriert: 24. Sep 2015 20:25
Answers: 4
Wohnort: Bonn

Re: Ferien und Feiertage via ICAL

Beitrag von seppy »

Hi,
hast Du geprüft ob die Regel überhaupt getriggert wird? Dann sollte im openhab.log der folgende Auszug zu finden sein:

Code: Alles auswählen

HomeBox.SystemRules:Event_Holiday GlobalSpecialDayICAL changed: Updated Holiday Status: NEUERSTATUS (" + GlobalHolidayName.state + ")")
Wenn Du keinen entsprechenden Logeintrag findest läuft Dein HTTP Binding nicht sauber.
Grüße,
Seppy
Homematic und HomematicIP über Raspberrymatic (RaspPi 4 4GB) mit 2x HMLAN. Steuerung und Visualisierung durch OpenHAB2 auf RaspPi in Hutschienengehäuse im Sicherungskasten. Rund 100 Aktoren/Sensoren

- Abgesichert durch APC USV
- Bewässerungssteuerung mit Hunter Magnetventilen (HM-LC-Sw4-DR)
- Beleuchtungssteuerung Innen und Aussen (HM-LC-Sw4-DR + HM-LC-SW1-FM + HMW-IO-12-SW7-DR)
- Rolladensteuerung mit Beschattungsautomatik über Temperaturdifferenzsensor (HM-LC-Bl1PBU-FM)
- Wetter und Unwetterinformationen von wunderground
- Benachrichtigung der Bewohner via Pushover
- Multimediawand und Dreambox Steuerung (HM-LC-SW1-FM)
- Heizungssteuerung mit Komfort und Energiesparfunktionen (HM-CC-RT-DN + HM-Sec-SC-2 + HMIP-eTRV-2)
- Werkstatt Kompressorsteuerung (HMW-IO-12-SW7-DR)
- Weihnachtsbeleuchtung außen
- Präsenzerkennung über Geolocation (iCloud Binding), iBeacon und WLAN (Unifi Binding)
- Philips HUE & Tasmota Devices (Tuya) Einbindung

michaL
Beiträge: 16
Registriert: 13. Apr 2018 22:43

Re: Ferien und Feiertage via ICAL

Beitrag von michaL »

Hallo,

danke seppy.

Code: Alles auswählen

cat /var/log/openhab2/openhab.log | grep Holiday
ergibt keine Ausgabe, genau wie

Code: Alles auswählen

cat /var/log/openhab2/events.log | grep Holiday
.

Ok, dann also das http-binding. Was könnte ich da machen?

Mfg Michael


PS: Ups, war nicht installiert. Ich dachte, ich hätte. Entschuldigt die Unruhe.

Jetzt habe ich auch Ausgaben:

Code: Alles auswählen

root@nuc:~# cat /var/log/openhab2/events.log | grep oliday
2018-04-25 17:28:21.904 [vent.ItemStateChangedEvent] - GlobalHolidayICAL changed from NULL to BEGIN:VCALENDAR
2018-04-25 17:28:22.030 [vent.ItemStateChangedEvent] - GlobalHoliday changed from NULL to ON
2018-04-25 17:28:22.034 [vent.ItemStateChangedEvent] - GlobalHolidayName changed from NULL to BEGIN:VCALENDAR

Code: Alles auswählen

root@nuc:~# cat /var/log/openhab2/openhab.log | grep oliday
2018-04-25 17:28:22.038 [INFO ] [pt.HomeBox.SystemRules:Event_Holiday] - GlobalSpecialDayICAL changed: Updated Holiday Status: ON (BEGIN:VCALENDAR
2018-04-25 17:28:22.045 [INFO ] [pt.HomeBox.SystemRules:Event_Holiday] - GlobalSpecialDayICAL changed: Updated Holiday Status: ON (BEGIN:VCALENDAR
Mal sehen, was nu ist.

Danke einstweilen.

Mfg Michael

PPS: Nun zeigt das Item in der sitemap:

Code: Alles auswählen

BEGIN:VCALENDAR VERSION:2.0 METHOD:PUBLISH PRODID:-//sc...
Hier noch einmal die Definition in meiner sitemap:

Code: Alles auswählen

Frame label="Informationen" visibility=[GlobalHoliday==ON] {
      Text item=GlobalHolidayName label="Ferien/Feiertag [%s]" icon="calendar" visibility=[GlobalHoliday==ON]
Vermutlich noch nicht ganz korrekt, gell?

Mfg Michael

PPPS: Nun habe ich mal die Zeile mit dem 3. Oktober auskommentiert und in der Definition die Zeit (?) auf 72 herunter gesetzt.
Nun zeigt sich regelmäßig im Log:

Code: Alles auswählen

root@nuc:/etc/openhab2# tail -f /var/log/openhab2/openhab.log
2018-04-25 18:38:18.799 [WARN ] [.core.transform.TransformationHelper] - Cannot get service reference for transformation service of type JS
2018-04-25 18:38:18.799 [WARN ] [ab.binding.http.internal.HttpBinding] - Couldn't transform response because transformationService of type 'JS' is unavailable
Die Meldung wird regelmäßig wiederholt.

Kann damit jemand etwas anfangen?

Danke im Voraus.

Mfg Michael

Benutzeravatar
seppy
Beiträge: 738
Registriert: 24. Sep 2015 20:25
Answers: 4
Wohnort: Bonn

Re: Ferien und Feiertage via ICAL

Beitrag von seppy »

Hi,
ich der letzten Fehlermeldung steht Dein Problem beschrieben ;)

Code: Alles auswählen

Cannot get service reference for transformation service of type JS
Du hast den JS Transform Service nicht installiert/aktiviert.

Grüße,
Seppy
Homematic und HomematicIP über Raspberrymatic (RaspPi 4 4GB) mit 2x HMLAN. Steuerung und Visualisierung durch OpenHAB2 auf RaspPi in Hutschienengehäuse im Sicherungskasten. Rund 100 Aktoren/Sensoren

- Abgesichert durch APC USV
- Bewässerungssteuerung mit Hunter Magnetventilen (HM-LC-Sw4-DR)
- Beleuchtungssteuerung Innen und Aussen (HM-LC-Sw4-DR + HM-LC-SW1-FM + HMW-IO-12-SW7-DR)
- Rolladensteuerung mit Beschattungsautomatik über Temperaturdifferenzsensor (HM-LC-Bl1PBU-FM)
- Wetter und Unwetterinformationen von wunderground
- Benachrichtigung der Bewohner via Pushover
- Multimediawand und Dreambox Steuerung (HM-LC-SW1-FM)
- Heizungssteuerung mit Komfort und Energiesparfunktionen (HM-CC-RT-DN + HM-Sec-SC-2 + HMIP-eTRV-2)
- Werkstatt Kompressorsteuerung (HMW-IO-12-SW7-DR)
- Weihnachtsbeleuchtung außen
- Präsenzerkennung über Geolocation (iCloud Binding), iBeacon und WLAN (Unifi Binding)
- Philips HUE & Tasmota Devices (Tuya) Einbindung

michaL
Beiträge: 16
Registriert: 13. Apr 2018 22:43

Re: Ferien und Feiertage via ICAL

Beitrag von michaL »

Hallo,

danke für die Rükmeldung.
Ich habe es nun installiert.

Die holiday.js sieht zu Testzwecken so aus:

Code: Alles auswählen

/**
* Javascript Transformator, der prüft ob das heutige Datum auf einen ICAL Eintrag fällt.
* Wenn ja wird die Kalenderbezeichnung des Tages zurückgegeben, wenn nicht ein false
*/
var holiday = false;
/**
* ijp - iCalendar javascript parser
* https://code.google.com/p/ijp/
*/
(function(i) {
        var Ical = function Ical(){
                this.version = '';
                this.prodid = '';
                this.events = [];
                this.todos = [];
                this.journals = [];
                this.freebusys = [];
        }
        var xprops = 'x-[^:;]+';
        var ianaprops = '[\\w]+[^:;]+'
        var icalParser = {
                icals : [],
                propsList : {
                        'event':'(dtstamp|uid|dtstart|class|created|description|geo|last-mod|location|organizer|priority|seq|status|summary|transp|url|recurid|rrule|dtend|duration|attach|attendee|categories|comment|contact|exdate|rstatus|related|resources|rdate|'+xprops+'|'+ianaprops+')',
                        'freebusy':'(dtstamp|uid|contact|dtstart|dtend|organizer|url|attendee|comment|freebusy|rstatus|'+xprops+'|'+ianaprops+')',
                        'journal':'(dtstamp|uid|class|created|dtstart|last-mod|organizer|recurid|seq|status|summary|url|rrule|attach|attendee|categories|comment|contact|description|exdate|related|rdate|rstatus|'+xprops+'|'+ianaprops+')',
                        'todo':'(dtstamp|uid|class|completed|created|description|dtstart|geo|last-mod|location|organizer|percent|priority|recurid|seq|status|summary|url|rrule|due|duration|attach|attendee|categories|comment|contact|exdate|rstatus|related|resources|rdate|'+xprops+'|'+ianaprops+')'
                },
                parseIcal : function(icsString){
                        var cals = icsString.match(/BEGIN:VCALENDAR\r?\n(.*\r?\n)+?END:VCALENDAR/ig);
                        for(var index in cals){
                                var ical = new Ical(); 
                                ical.version = this.getValue('VERSION',cals[index]);
                                ical.prodid = this.getValue('PRODID',cals[index]);
                                cals[index] = cals[index].replace(/\r\n /g,'');
                                cals[index] = cals[index].replace(/BEGIN:VCALENDAR\r?\n/ig,'');
                                var reg = /BEGIN:(V.*?)\r?\n(.*\r?\n)+?END:\1/gi;
                                matches = cals[index].match(reg);
                                if(matches){
                                        for(i=0;i<matches.length;i++){
                                                this.parseVComponent(matches[i],ical);
                                        }
                                }
                                this.icals[this.icals.length] = ical;
                        }
                },
                parseVComponent : function(vComponent,ical){
                        var nameComponent = vComponent.match(/BEGIN:V([^\s]+)/i)[1].toLowerCase();
                        vComponent = vComponent.replace(/\r?\n[\s]+/igm,''); //unfolding
                        vComponent = vComponent.replace(/(^begin|^end):.*/igm,'');
                        var props = vComponent.match(new RegExp(this.propsList[nameComponent]+'[:;].*','gim'));
                        if(props){
                                var component=[];
                                for(var index in props){
                                        var nom = props[index].replace(/[:;].*$/,'');
                                        var propKey = /*'prop_'+*/nom.toLowerCase();
                                        if(component[propKey]===undefined) component[propKey] = [];
                                        component[propKey][component[propKey].length] = this.getValue(nom,props[index]);
                                        component['raw'] = vComponent;
                                }
                                if(ical[nameComponent+'s'] !== undefined)
                                        ical[nameComponent+'s'][ical[nameComponent+'s'].length] = component;
                        }
                },
                getValue: function(propName,line){
                        var prop={};
                        line = line.replace(/^\s+/g,'').replace(/\s+$/gi,'');
                        reg = new RegExp('('+propName+')((?:;[^=]*=[^;:\n]*)*):([^\n\r]*)','gi');
                        var matches = reg.exec(line);
                        if(matches){
                                var valeur = RegExp.$3;
                                var tab_params=[];
                                if(RegExp.$2.length>0){ 
                                        var params = RegExp.$2.substr(1).split(';');
                                        var pair;
                                        for(k=0;k<params.length;k++){
                                                pair = params[k].split('=');
                                                if(!pair[1]) pair[1] = pair[0];
                                                tab_params[pair[0]] = pair[1];
                                        }
                                }
                                prop = { value:valeur,name:propName };
                                if(Object.keys(tab_params).length>0)
                                        prop.params = tab_params;
                        }
                        return prop;
                },
        }

        /**
        * Funktion um ical Datumsstring (YYYYMMDD) in Date Objekt zu wandeln
        */
        function calenDate(icalStr)  {
                var strYear = icalStr.substr(0,4);
                var strMonth = parseInt(icalStr.substr(4,2),10)-1;
                var strDay = icalStr.substr(6,2);
                var strHour = 0;
                var strMin = 0;
                var strSec = 0;

                var oDate =  new Date(strYear,strMonth, strDay, strHour, strMin, strSec)

                return oDate;
        }

    icalParser.parseIcal(input);
        var event = icalParser.icals[0].events[0];
        icalParser.icals[0].events.forEach(function (currentValue, index, originalArray) {
                /**
                *       Prüfen ob das aktuelle Datum zwischen zwei Daten liegt, bzw. auf einen Tag fällt
                */
                var dateFrom = calenDate(currentValue.dtstart[0].value);
                var dateTo = calenDate(currentValue.dtend[0].value);
                var dateCheck = new Date();
                var dateCheck = calenDate("20151225");

                if (dateCheck >= dateFrom && dateCheck < dateTo){
                        holiday = currentValue.summary[0].value;
                }
        });
    return holiday;
})(input);
Ich meint, damit das aktuelle Datum auf den 25.12.2015 gesetzt zu haben: gemeinhin sowohl ein Ferien- als auch ein Feiertag ist.

Das Log spricht:

Code: Alles auswählen

2018-04-26 16:58:53.493 [vent.ItemStateChangedEvent] - GlobalHolidayName changed from NULL to false
2018-04-26 17:09:11.125 [vent.ItemStateChangedEvent] - GlobalHolidayICAL changed from NULL to false
Zwische den beiden Uhrzeiten lag ein restart.

Danke für die Tipps und die (frei-)Zeit, die du in meine Problemchen investierst.

Mfg Michael

Antworten