Wartungsarbeiten!

Folgende Info habe ich eben von unserem Serverbetreiber erhalten:

Sehr geehrte Kundin,
sehr geehrter Kunde,

aufgrund von wichtigen Sicherheits- und Stabilitätskorrekturen müssen wir kurzfristige Wartungsarbeiten an unseren Virtualisierungs-Plattformsystemen durchführen.

Die Arbeiten werden am 21.05.2019 ab 08:00 beginnen und am 24.05.2019 um 20:00 Uhr beendet sein.

Im Zuge dieser Wartungsarbeiten werden die Systeme rebootet, so dass Ihr virtueller Server kurzfristig nicht erreichbar sein kann.
Da die Systeme nacheinander aktualisiert werden, ist der genaue Zeitpunkt des Rebootvorgangs von System zu System verschieden.

Bitte beachten Sie auch die Information zu Wartungsarbeiten/Sicherheitsupdates in den Technischen News.

EibPC

Der EibPC stellt eine programmierbare Steuerung für das EIB/KNX-System dar, die sich durch einfache Konfigurierbarkeit, hohe Flexibilität in der Anwendung, Hutschienenmontage (6 TE) und geringe Leistungsaufnahme (1,2 W) auszeichnet. Darüber hinaus lässt sich das Gerät in eine individuelle LAN-Automatisierungsumgebung integrieren und stellt mit seinem Webserver eine einfache, benutzerdefinierbare Visualisierung zur Verfügung.
TichaWutz
Beiträge: 21
Registriert: Fr 1. Apr 2016, 21:38

EibPC

Beitrag von TichaWutz » Sa 2. Apr 2016, 07:21

Hallo zusammen,

ich benutze einen Enertex EibPC und werde die Steuerung hier implementieren.
Das ganze möchte ich aber relative einfach halten, bei Interesse werde ich den Quellcode hier posten.

klaus007
Beiträge: 16
Registriert: Mo 28. Mär 2016, 18:55
Wohnort: Hallein
Mäher: Husqvarna Automower 305
Firmware des Mähers (MSW): MSW 5.xx.xx
Herstellungsjahr: 2014
Robonect-Modul: Robonect H30x (Rev.1)
Robonect Firmware: 0.9e

Re: EibPC

Beitrag von klaus007 » Sa 9. Apr 2016, 10:08

Hallo TichaWutz!

Ja bitte, auch ich habe einen EibPC und möchte, wenn ich Robonect hoffentlich bald bekomme (das Warten ist meine Schwäche), mein Akkuschaf darüber steuern.

LG Klaus

Galileo
Beiträge: 15
Registriert: Sa 1. Okt 2016, 12:16
Mäher: Husqvarna Automower 330X
Firmware des Mähers (MSW): MSW 5.xx.xx
Herstellungsjahr: 2014
Robonect-Modul: Robonect Hx (Rev.0)
Robonect Firmware: V1.0 Beta 6

Re: EibPC

Beitrag von Galileo » Di 18. Okt 2016, 10:36

Hallo TichaWutz!
Hast du etwas weitergebracht ? Würde mich freuen wenn du es veröffentlichen könntest.
LG
Eduard
Husqvarna 330x Firmware V0.9 MSW-Version V5.03.00 SUB-Version 5.00.00

fox007
Beiträge: 41
Registriert: Mo 20. Feb 2017, 15:55
Mäher: Gardena R40Li
Firmware des Mähers (MSW): MSW 4.xx.xx
Herstellungsjahr: 2014
Robonect-Modul: Robonect Hx (Rev.3)
Robonect Firmware: V1.0 Beta 7a

Re: EibPC

Beitrag von fox007 » Mo 6. Mär 2017, 12:39

Hallo zusammen

Hat da jemand schon etwas gemacht?

Ich möchte über KNX/EIB via der Schnittstelle linknx ansteuern....

Danke fürs Feedback.

Gruss
Reto
Gardena R40Li / Firmware MSW 4.02.00
Robonext Hx (Rev.3) / Firmware 4.0 Beta
Automation KNX

fox007
Beiträge: 41
Registriert: Mo 20. Feb 2017, 15:55
Mäher: Gardena R40Li
Firmware des Mähers (MSW): MSW 4.xx.xx
Herstellungsjahr: 2014
Robonect-Modul: Robonect Hx (Rev.3)
Robonect Firmware: V1.0 Beta 7a

Re: EibPC

Beitrag von fox007 » Di 28. Mär 2017, 14:09

Meine Hausautomatisierung KNX läut auf einem Raspberry PI.
Die Logik wird im Linknx in einem xml File zusammengestellt und dann auf den EIB Bus gesendet.

Anbei mal einen Anfang für die Logik Home bei Regen, leider schlägt der xml Parser noch fehl, suche noch nach einer Lösung......
Das Problem beim Parser habe ich nur mit der Zeichenübergabe von &

Code: Alles auswählen

[/<!-- :::::::::::::::::::::::::::: Robi Home ::::::::::::::::::::::::::::: -->        
<rule id="Robi_home">
 <condition type="and">
   <condition type="timer" trigger="true">
    <at hour="07" min="00" wdays="12345" />
    <until hour="21" min="00" />
 </condition>
 <condition type="object" id="Regen" value="1" trigger="true" />
</condition>
<actionlist type="if-true">
<action type="shell-cmd" cmd= "curl(http://192.99.99.99/xml?cmd=mode&mode=home)" />
</actionlist>
</rule>code]

Gruss
Reto
Gardena R40Li / Firmware MSW 4.02.00
Robonext Hx (Rev.3) / Firmware 4.0 Beta
Automation KNX

fox007
Beiträge: 41
Registriert: Mo 20. Feb 2017, 15:55
Mäher: Gardena R40Li
Firmware des Mähers (MSW): MSW 4.xx.xx
Herstellungsjahr: 2014
Robonect-Modul: Robonect Hx (Rev.3)
Robonect Firmware: V1.0 Beta 7a

Re: EibPC

Beitrag von fox007 » Fr 31. Mär 2017, 13:00

Hallo zusammen

Leider kann die URL nicht direkt ab linknx mit einer action aufgerufen werden, aber mit einem Bash Skript funktionierts:

Code: Alles auswählen

#!/bin/robi_home
curl http://DeineIPvomRobi/xml\?cmd\=mode\&mode\=home
echo $?  > /etc/linknx/persist/robi-home
Gruss
Reto
Gardena R40Li / Firmware MSW 4.02.00
Robonext Hx (Rev.3) / Firmware 4.0 Beta
Automation KNX

Galileo
Beiträge: 15
Registriert: Sa 1. Okt 2016, 12:16
Mäher: Husqvarna Automower 330X
Firmware des Mähers (MSW): MSW 5.xx.xx
Herstellungsjahr: 2014
Robonect-Modul: Robonect Hx (Rev.0)
Robonect Firmware: V1.0 Beta 6

Re: EibPC

Beitrag von Galileo » So 2. Apr 2017, 09:37

Ich habe es geschafft, die Basis-Funktionalitäten in den EibPc zu integrieren. Ich poste das hier einmal, auch wenn es noch nicht vollständig ist.
Die meiste Zeit hat es gebraucht, die IP Kommunikation stabil hinzubekommen. Das Problem liegt hier in der (Enertex EibPC) Software, welche
mit dem "Validierungsschema" und der kryptischen Syntax zwar gerade noch eine State-Machine erlaubt, aber bei mehrfach-Aufrufen
(Instanzen - von verschiedenen Bedienelementen aus) seine liebe Not hat... Jetzt ist es also EINE globale Kommunikations-Funktion geworden, welche (mühsam) über ebenso globale Variablen gesteuert wird.

Hier einmal die Kommunikation als Makro.

Code: Alles auswählen

//=================================================================
//
//                       RobonectQuery
//
//=================================================================
// When Start is EIN, a TCP connection is established and Command is
// sent to this address. The answer is received in ReceiveData.
// The connection is then closed and the variable Done changes to EIN
// However, if the process does not finish within some time, the
// connection is closed, Done will change to EIN but ReceiveData will
// contain $$.
//=================================================================
:begin RobonectQuery(Command,ReceiveData,Start,Done)

Ro_IP=192.168.1.70
Ro_Port=80u16
Ro_ConnectionState=99u08
Ro_RemotePort=0u16
Ro_RemoteIP=0u32
Ro_Next=0u16
Ro_Timeout=0u64
Ro_SendStr=$$

// (0) Built up TCP Connection
// ===========================
if Start and Ro_ConnectionState>=2u08 then {
    Done=AUS;
    Start=AUS;
    ReceiveData=$$;
    Ro_ConnectionState = connecttcp(Ro_Port,Ro_IP);
	} endif

// (0) Wait until connected
// ========================
if change(Ro_ConnectionState) and Ro_ConnectionState==0u08 then {
    Ro_Next=1u16;
    }endif

// (1) Send Request to TCP Server
// ==============================
if after(change(Ro_Next),1u64) and Ro_Next==1u16 then {
    Ro_SendStr=$GET /xml?$+Command+$ HTTP/1.1$+CRLF+CRLF;
    sendtcparray(Ro_Port,Ro_IP,Ro_SendStr,size(Ro_SendStr));
    Ro_Next=2u16;
    } endif

// (2) Collect received data (event is triggered asynchronously)
// =============================================================
if event(readtcp(Ro_RemotePort,Ro_RemoteIP,ReceiveData)) then {
    Ro_Next=3u16;
    }endif

// (3) Close Connection
// ====================
if after(change(Ro_Next),1u64) and Ro_Next==3u16 then {
    closetcp(Ro_Port,Ro_IP);
    Ro_ConnectionState=99u08;
    Ro_Timeout=0u64;
    Ro_Next=0u16;
    Done=EIN;
    } endif

// Close Connection anyway after 3 seconds after start
// ===================================================
if afterc(Start,3000u64,Ro_Timeout) then {
    ReceiveData=$$;
    Ro_Next=3u16;
    } endif

:end

Die Variable Ro_IP muss natürlich auf die jeweiligen Gegebenheiten angepasst werden.
Für die nachfolgende Verarbeitung gibt's noch einen primitven XML-Parser. Der funktioniert natürlich nur wenn man schon im Vorhinein weiss
wie die Syntax aussieht (z.B. doppeltes Vorkommen des Strings "status") und man daher auch Vorkommen überspringen kann

Code: Alles auswählen

//=================================================================
//
//                    XmlExtract
//
//=================================================================
// Extract an XML Element located between <Ident> und </Ident>.
// Since it is possible that an input like
// <status>
//      <status>123</status>
//      <data>456</data>
// </status>
// exists, a parameter Skip will specify how many closing targets
// to skip before the element is extracted. This will work correctly
// only if the syntax is known in advance, as it will be for
// e.g. Robonect.
//=================================================================
:begin XmlExtract(XmlString,Ident,Skip)
:return split(XmlString,find(XmlString,$<$+Ident+$>$,0u16)+size(Ident)+2u16,find(XmlString,$</$+Ident+$>$,convert(Skip,0u16))-1u16)
:end

Diese beiden Makros gehören in eine externe Datei und müssen im EibStudio z.B. so eingebunden werden:

Code: Alles auswählen

[MacroLibs]
C:/Program Files (x86)/EibStudio/Program/MeineMacros.lib
Der Makro XmlExtract ist eine Funktion und wird einfach im Code verwendet. Der Makro "RobonectQuery" dagegen ist global und
muss daher 1x im Code platziert werden:

Code: Alles auswählen

#addto [Macros]
RobonectQuery(RobonectSend, RobonectData, RobonectStart, RobonectDone);
Das eigentliche Programm kommt in die Sektion [EibPc]:

Code: Alles auswählen

#addto [EibPC]

RobonectSend=$$
RobonectData=$$
RobonectStart=AUS
RobonectDone=AUS
RobonectString=$$
RobonectStatus=$$
RobonectTimer=$$
RobonectWlan=$$
RobonectStatusNum=$$
RobonectStatusTxt=$$
RobonectModeNum=$$
RobonectModeTxt=$$
RobonectTimerStatNum=$$
RobonectTimerStatTxt=$$


// start update of Robonect data every minute or if button pressed manually
if stime(22) or pbutton(LidRobonectStatus,PageIdRobonect)==1 then {
    pdisplay(LidRobonectStatus,$UPDATING$,FORWARD,BRIGHTRED,GREEN,PageIdRobonect);
    RobonectSend = $cmd=status$;
    RobonectStart = EIN;
    } endif

// if update done, display the result
if RobonectDone and RobonectSend==$cmd=status$ then {
    if RobonectData==$$ then {
    pdisplay(LidRobonectStatus,$ERROR$,FORWARD,INACTIVE,GREEN,PageIdRobonect);
    weboutput(DidInfo2, \\
        $<h3>$ +\\
        $<i>Error</i>$ +\\
        $</h3>$);
    } else {
    pdisplay(LidRobonectStatus,$$,FORWARD,INACTIVE,GREEN,PageIdRobonect);
    RobonectString=XmlExtract(RobonectData,$robonect$,0);
    RobonectStatus=XmlExtract(RobonectString,$status$,1);
    RobonectTimer=XmlExtract(RobonectString,$timer$,0);
    RobonectWlan=XmlExtract(RobonectString,$wlan$,0);

    RobonectStatusNum=XmlExtract(RobonectStatus,$status$,0);
    if RobonectStatusNum==$0$ then RobonectStatusTxt=$wird ermittelt$ endif;
    if RobonectStatusNum==$1$ then RobonectStatusTxt=$parkt$ endif; 
    if RobonectStatusNum==$2$ then RobonectStatusTxt=$mäht$ endif;
    if RobonectStatusNum==$3$ then RobonectStatusTxt=$sucht Ladestation$ endif;
    if RobonectStatusNum==$4$ then RobonectStatusTxt=$lädt$ endif;
    if RobonectStatusNum==$5$ then RobonectStatusTxt=$sucht$ endif;
    if RobonectStatusNum==$7$ then RobonectStatusTxt=$Fehler$ endif;
    if RobonectStatusNum==$8$ then RobonectStatusTxt=$Schleifensignal verloren$ endif;
    if RobonectStatusNum==$16$ then RobonectStatusTxt=$abgeschaltet$ endif;
    if RobonectStatusNum==$17$ then RobonectStatusTxt=$schläft$ endif;
    
    RobonectModeNum=XmlExtract(RobonectStatus,$mode$,0);
    if RobonectModeNum==$0$ then RobonectModeTxt=$Auto$ endif;
    if RobonectModeNum==$1$ then RobonectModeTxt=$Manuell$ endif;
    if RobonectModeNum==$2$ then RobonectModeTxt=$Home$ endif;
    if RobonectModeNum==$3$ then RobonectModeTxt=$Demo$ endif;

    RobonectTimerStatNum=XmlExtract(RobonectTimer,$status$,0);
    if RobonectTimerStatNum==$0$ then RobonectTimerStatTxt=$Deaktiviert$ endif;
    if RobonectTimerStatNum==$1$ then RobonectTimerStatTxt=$Aktiv$ endif;
    if RobonectTimerStatNum==$2$ then RobonectTimerStatTxt=$Standby$ endif;

    weboutput(DidInfo2, \\
        $<h3>$ +\\
        $<i>Robonect Status:</i>$ +\\
        $</h3>$ +\\
        $<ul style="list-style-type:disc">$ +\\
        $<li>Name : $+XmlExtract(RobonectString,$name$,0)+$</li>$ +\\
        $<li>Status : $+RobonectStatusNum+$ ($+RobonectStatusTxt+$)</li>$ +\\
        $<li>Stopped : $+XmlExtract(RobonectStatus,$stopped$,0)+$</li>$ +\\
        $<li>Duration : $+XmlExtract(RobonectStatus,$duration$,0)+$</li>$ +\\
        $<li>Mode : $+RobonectModeNum+$ ($+RobonectModeTxt+$)</li>$ +\\
        $<li>Battery : $+XmlExtract(RobonectStatus,$battery$,0)+$</li>$ +\\
        $<li>Hours : $+XmlExtract(RobonectStatus,$hours$,0)+$</li>$ +\\
        $<li>Timer Status : $+RobonectTimerStatNum+$ ($+RobonectTimerStatTxt+$)</li>$ +\\
        $<li>Wlan Signal : $+XmlExtract(RobonectWlan,$signal$,0)+$</li>$ +\\
        $</ul>$ );

    } endif;
    } endif

// Button Stop & Parken
if pbutton(LidRobonectGoHome,PageIdRobonect)==1 then {
    pdisplay(LidRobonectGoHome,$UPDATING$,HALT,BRIGHTRED,GREEN,PageIdRobonect); 
    RobonectSend = $cmd=mode&mode=home$;
    RobonectStart = EIN;
    } endif
if RobonectDone and RobonectSend==$cmd=mode&mode=home$ then {
    if RobonectData==$$ \\
        then pdisplay(LidRobonectGoHome,$ERROR$,HALT,INACTIVE,GREEN,PageIdRobonect) \\
        else pdisplay(LidRobonectGoHome,$OK$,HALT,INACTIVE,GREEN,PageIdRobonect) endif;
    pdisplay(LidRobonectGoEod,$$,PREVIOUS,INACTIVE,GREEN,PageIdRobonect); 
    pdisplay(LidRobonectGoAuto,$$,FORWARD,INACTIVE,GREEN,PageIdRobonect); 
    } endif

// Button Feierabend
if pbutton(LidRobonectGoEod,PageIdRobonect)==1 then {
    pdisplay(LidRobonectGoEod,$UPDATING$,PREVIOUS,BRIGHTRED,GREEN,PageIdRobonect); 
    RobonectSend = $cmd=mode&mode=eod$;
    RobonectStart = EIN;
    } endif
if RobonectDone and RobonectSend==$cmd=mode&mode=eod$ then {
    if RobonectData==$$ \\
        then pdisplay(LidRobonectGoEod,$ERROR$,PREVIOUS,INACTIVE,GREEN,PageIdRobonect) \\
        else pdisplay(LidRobonectGoEod,$OK$,PREVIOUS,INACTIVE,GREEN,PageIdRobonect) endif;
    pdisplay(LidRobonectGoAuto,$$,FORWARD,INACTIVE,GREEN,PageIdRobonect); 
    pdisplay(LidRobonectGoHome,$$,HALT,INACTIVE,GREEN,PageIdRobonect); 
    } endif

// Button Auto Start
if pbutton(LidRobonectGoAuto,PageIdRobonect)==1 then {
    pdisplay(LidRobonectGoAuto,$UPDATING$,FORWARD,BRIGHTRED,GREEN,PageIdRobonect); 
    RobonectSend = $cmd=mode&mode=auto$;
    RobonectStart = EIN;
    } endif
if RobonectDone and RobonectSend==$cmd=mode&mode=auto$ then {
    if RobonectData==$$ \\
        then pdisplay(LidRobonectGoAuto,$ERROR$,FORWARD,INACTIVE,GREEN,PageIdRobonect) \\
        else pdisplay(LidRobonectGoAuto,$OK$,FORWARD,INACTIVE,GREEN,PageIdRobonect) endif;
    pdisplay(LidRobonectGoEod,$$,PREVIOUS,INACTIVE,GREEN,PageIdRobonect); 
    pdisplay(LidRobonectGoHome,$$,HALT,INACTIVE,GREEN,PageIdRobonect); 
    } endif
Für das WEB-Interface gibt es noch diese Definitonen:

Code: Alles auswählen

#addto [WebServer]
// Webserver Bewässerung
page (PageIdRobonect) [$Zentral$,$Robonect$]
header(0)
footer(0)

line $ROBONECT$
weboutput(DidInfo2)[QUAD,NOICON] pbutton(LidRobonectStatus)[FORWARD]$Update$
pbutton(LidRobonectGoHome)[HALT]$Stop & Parken$ pbutton(LidRobonectGoEod)[PREVIOUS]$Feierabend$ pbutton(LidRobonectGoAuto)[FORWARD]$Auto Start$

Und noch der Vollständigkeit halber die Konstanten (als Beispiel) - aber die muss sich sowieso jeder selbst festlegen:

Code: Alles auswählen

PageIdRobonect = 4
DidInfo2 = 31
LidRobonectStatus = 20
LidRobonectGoHome = 21
LidRobonectGoEod  = 22
LidRobonectGoAuto = 23
Wie das dann im WEB Interface aussieht, kann man im Dateianhang sehen.
Wie gesagt, das ist nur die Basis-Funktionalität, aber darauf könnte man natürlich alle anderen Funktionen aufbauen
(soferne der EibPC das zulässt :( ).

Falls jemand meinen Code verwendet und weiterentwickelt wäre es natürlich nett wenn das hier gepostet würde.

Liebe Grüße
Eduard
Dateianhänge
Robonect.jpg
Robonect.jpg (37.03 KiB) 2085 mal betrachtet
Husqvarna 330x Firmware V0.9 MSW-Version V5.03.00 SUB-Version 5.00.00

TichaWutz
Beiträge: 21
Registriert: Fr 1. Apr 2016, 21:38

Re: EibPC

Beitrag von TichaWutz » Mo 25. Mär 2019, 10:51

Wow, schön das sich hier einiges getan hat.
Sobald mein Modul wieder funktioniert werde ich mich noch mal mit dem Thema beschäftigen und auf Basis von Galileo hier weitermachen. Vielen Dank!

TichaWutz
Beiträge: 21
Registriert: Fr 1. Apr 2016, 21:38

Re: EibPC

Beitrag von TichaWutz » Mi 27. Mär 2019, 16:00

Nach dem ich mir das hier noch mal angeschaut habe stelle ich fest, das die Anbindung über MQTT zum EibPC wesentlich einfacher ist. Ich kann jetzt schon bidirektional vom EibPC zu MQTT Daten austauschen und das wäre dann nur die entsprechende Erweiterung.
Somit ist das ganze Thema der Konnektivität nicht im EibPC von Nöten.

TichaWutz
Beiträge: 21
Registriert: Fr 1. Apr 2016, 21:38

Re: EibPC

Beitrag von TichaWutz » Do 11. Apr 2019, 08:50

Ich habe das jetzt ausprobiert und das funktioniert über MQTT wirklich perfekt.
Ich bekomme alle Infos vom Mäher und kann ihn bei Regen über das MQTT Kommando dann auch wieder in die Station fahren lassen - ohne großen Programmieraufwand. Daneben lass ich mir die ganzen Infos auch noch mal auf einem Grafana Board anzeigen (da die Darstellung von Graphen auf dem EibPC echt schlecht ist und mir noch nie gefallen hat...) - Kommandos zum MQTT Broker kann man ganz einfach mit sendudp machen.

LG

Antworten

Zurück zu „Enertex® EibPC“