Updatewunsch Parameterübergabe

Bugreports und Updatewünsche an die Firma contronics
Keine allgemeinen Fragen!

Moderator: Co-Administratoren

Antworten
PapaWolf
Beiträge: 584
Registriert: 19.10.2007, 09:17
Wohnort: Aschaffenburg (Deutschland)
Hat sich bedankt: 5 Mal
Danksagung erhalten: 1 Mal

Updatewunsch Parameterübergabe

Beitrag von PapaWolf » 10.02.2016, 17:58

Hallo Contronics,

ich würde mir Parameterübergaben beim Aufrufen von Makros wünschen, so wie bei "benutzerdefinierten Funktionen" in Hochsprachen - dies würde Vieles vereinfachen. Beim Aufruf von bestimmten Hardware-Geräten (wie z.B. den MP3-Modulen) geht das doch auch - wieso dann nicht bei Makros ?
Viele Grüße !
PapaWolf

Ich betreibe das HPCL-Studio für Homematic und FHZ(FS20) auf einem RaspberryPi 3B+ unter piVCCU3 und der FHZ2000, sowie mit 2 LAN-Gateways

Familienvater
Beiträge: 7151
Registriert: 31.12.2006, 15:18
System: Alternative CCU (auf Basis OCCU)
Wohnort: Rhein-Main
Danksagung erhalten: 34 Mal

Re: Updatewunsch Parameterübergabe

Beitrag von Familienvater » 10.02.2016, 18:29

Hi,

Übergabe und Returnwert von Funktionen sind doch kein Problem:
Du setzt vor dem Aufruf des Makros Variablen innerhalb des "Zielmakros", dann wird es mit aufrufen() gestartet, und in der nächsten Zeile kannst Du die Rückgabewerte abholen. Es darf nur im aufgerufenen Makro keine "Zeit" verbraucht werden (Sprünge nach oben, getsite, sysvar-Operationen).

Hier ein Beispiel, wie ich eine Pushover Nachricht verschicke:

Code: Alles auswählen

  // Pushovernachricht versenden
  m_SendPushover.strAppToken := const.AppTokenInfo
  m_SendPushover.strUserToken := const.UserTokenCS
  m_SendPushover.strTitle := "Reset FHZ2000"
  m_SendPushover.strMessage := "Es wurde Einschalten registriert!"
  m_SendPushover.strMessage := m_SendPushover.strMessage + "<<Kommunikationsfehler: "+comerror(SW_UG_FHZ2000)
  m_SendPushover.strMessage := m_SendPushover.strMessage + "<<Batterie leer: "+lowbat(SW_UG_FHZ2000)
  m_SendPushover.lngPriority := -1
  m_SendPushover.strDevice := "galaxynexus"
  m_SendPushover.strSound := "none"
  aufrufen(m_SendPushover)

Oder hier das ganze mit Rückgabe-Werten:

Code: Alles auswählen

    // Wartezeit berechnen...
    fktCalcRolloZeit.rolStatus      := vRS_EG_Kueche
    fktCalcRolloZeit.strRolloName   := "RS_EG_Kueche"
    fktCalcRolloZeit.uhrWEHoch      := slWEHochRS_EG_Kueche.uhrZeitpunkt
    fktCalcRolloZeit.uhrWERunter    := slWERunterRS_EG_Kueche.uhrZeitpunkt
    fktCalcRolloZeit.uhrWTHoch      := slWTHochRS_EG_Kueche.uhrZeitpunkt
    fktCalcRolloZeit.uhrWTRunter    := slWTRunterRS_EG_Kueche.uhrZeitpunkt
    fktCalcRolloZeit.uhrFunkversatz := "00:00:05"
    fktCalcRolloZeit.swBetriebsart  := temp.strTemp
    if comerror(RS_EG_Kueche) then
      fktCalcRolloZeit.lngDebugAktor  := 1
    else
      fktCalcRolloZeit.lngDebugAktor  := RS_EG_Kueche.lngDebug -1
    endif

    call fktCalcRolloZeit

    // Ergebnisse abholen
    uhrWartezeit  := fktCalcRolloZeit.uhrWartezeit
    zeitWartetBis := fktCalcRolloZeit.zeitWartetBis
Es ist vielleicht ein bisschen Gewöhnungsbedürftig, aber mal ganz ehrlich:
Der Editor von HPCL ja auch aus der Pre-Intellisense Epoche stammt, finde ich das mit den "sprechenden Parameternamen" gar nicht so verkehrt, das versteht theoretisch jeder sofort, wohingegen der Aufruf

aufrufen m_SendPushover(const.AppTokenInfo, const.UserTokenCS, "Reset FHZ2000", "blabla" ,-1, "galaxynexus", "none")

zwar im Prinzip das selbe tun würde, aber wesentlich schwerer zu lesen ist.
Und dann kommt das noch mit den optionalen Parametern... Mein Pushover braucht nicht wirklich jeden Parameter, bei Prio 2 muss z.B. noch die Retry-Dauer etc. angegben werden, das Device ist hingegen optional, falls ich gezielt ein- oder mehrere Ansprechen will.

Ich würde sagen, es gibt viel wichtigere Dinge!

Ups, und ich habe gegen meine Ankündigung verstoßen, mich aus HPCL rauszuhalten.

Der Familienvater

PapaWolf
Beiträge: 584
Registriert: 19.10.2007, 09:17
Wohnort: Aschaffenburg (Deutschland)
Hat sich bedankt: 5 Mal
Danksagung erhalten: 1 Mal

Re: Updatewunsch Parameterübergabe

Beitrag von PapaWolf » 10.02.2016, 19:43

Hallo Familienvater,

danke zunächst für Deine Rückmeldung. Sicher geht es so, wie Du es beschrieben hast - so mache ich das aktuell auch, weil´s nunmal nicht anders geht. Dennoch muß man aber auch erst (ggfs. sogar) mehrere Zeilen mit Variableninhalten in die Variablen des Zielmakros definieren, dann das Makro aufrufen und dort dann natürlich erstmal die Werte wieder aus den Variablen auslesen. "Proceduren" oder noch besser "Funktionen" sind da halt mit einer einzigen Zeile aufzurufen und das Ergebnis (falls man eines braucht, benutzt man eine Funktion) kann in einer einzigen Empfangsvariablen gespeichert werden - der Vorteil liegt also klar auf der Hand, sonst gäbe es diese Möglichkeiten ja erst gar nicht.
Und sorry, aber Dein Argument mit der eher kryptischen Lesbarkeit bei der Parameterübergabe kann ich nicht akzeptieren. Ich habe etliche Jahre Datenbanken programmiert und hatte damit selten ein Problem. Aber Du hast natürlich Recht damit, dass HPCL eher an die Programmierung der 80er Jahre erinnert und im damaligen Basic usw. gab es das auch nicht. Aber HPCL durchläuft auch einen Compiler und insofern sollte das doch wohl eher kein Problem sein, Parameterübergaben und im Idealfall auch Funktionen mit Rückgabewerten einzubinden.

Mein Argument liegt darin, mit einer einzigen Zeile Programmierung sowohl alle benötigten Parameterwerte an einen Makro zu senden und "im Idealfall" bei der Möglichkeit einer Funktion sogar dessen Rückgabewert in einer einzigen Variablen aufzufangen. var1:=<funktion>("eingabewert",par1,par2, par3) speichert insofern das Rechenergebnis in dem aufrufenden Programmteil in der Variablen var1. Ich denke, Du kennst das selbst sehr genau - sonst hättest Du so nicht schreiben können - Respekt also . Aber mal ehrlich - wäre das nicht toll, wenn das in HPCL auch ginge ? Da würde viel Programmierarbeit wegfallen, die Programme kürzer sein und schneller arbeiten. Ich bin auch kein Freund von Drumherum-Programmiererei, weil´s halt nicht anders geht - wir schreiben das Jahr 2016 und nicht 1980 - das sollte auch HPCL erreichen. Daher kommt mein Updatewunsch !
Viele Grüße !
PapaWolf

Ich betreibe das HPCL-Studio für Homematic und FHZ(FS20) auf einem RaspberryPi 3B+ unter piVCCU3 und der FHZ2000, sowie mit 2 LAN-Gateways

Familienvater
Beiträge: 7151
Registriert: 31.12.2006, 15:18
System: Alternative CCU (auf Basis OCCU)
Wohnort: Rhein-Main
Danksagung erhalten: 34 Mal

Re: Updatewunsch Parameterübergabe

Beitrag von Familienvater » 10.02.2016, 23:22

Hi,

prinzipiell sehe ich da keinen Unterschied, ob ich das mehrzeilig und mit "benamter" Parameterübergabe mache, oder ob das einzeilig und "blind" erfolgt.

Vielleicht habe ich nach 10 Jahren homeputer studio und CL einfach eine gewisse Teflon-Mentalität ausgebildet, vielleicht liegt es auch an meiner "normalen" Arbeit, bei der ich seit über 20 Jahren auch die Wahl zwischen einem Pre-Intellisense-Editor habe, oder einem "gemodeten" Notepad++, der mir Dank eigenem Tool die selbstdefinierten Funktionsnamen mit erwarteten Parametern, Array-Definitionen etc. zumindest anzeigt. Und die dahinterliegende Eventengine ist von der grundsätzlichen Funktionsweise HPCL sehr ähnlich.
Vielleicht liegt es an meiner Faulheit, das ich HPCL normalerweise mit den SPG-Tools nutze, und mir mein Editor (in diesem Falle Editplus) unendlich viel-Tipparbeit abnimmt, weil ich nur "mail<LEERTASTE>" schreibe, und dann einfach der folgende Codeblock auftaucht, und der Cursor steht schon im Subject:

Code: Alles auswählen

// eMail versenden
mail.strSubject := ""
mail.strTo      := settings.EMail
mail.strMessage := ""
mail.strMessage := mail.strMessage + "<<"
call mail
oder eben "push<LEERTASTE>"

Code: Alles auswählen

// Pushovernachricht versenden
m_SendPushover.strAppToken := const.AppTokenInfo AppTokenWarn  AppTokenAlarm
m_SendPushover.strUserToken := const.UserTokenCS
m_SendPushover.strTitle := ""
m_SendPushover.strMessage := ""
m_SendPushover.strMessage := m_SendPushover.strMessage + "<<"
m_SendPushover.lngPriority := -1 0 1 2
// Nur für Priority 2
//  m_SendPushover.lngExpire := 900
//  m_SendPushover.lngRetry := 30
// Sounds: bike, bugle (+), cashregister, classical, cosmic, falling, gamelan, incoming, intermission, magic, mechanical, pianobar, siren (+), spacealarm, tugboat (+)
// Long-Sound: alien, climb, persistent (++), echo, updown (++)
// Silent: none
// m_SendPushover.strDevice := "galaxynexus" "nexus7"
m_SendPushover.strSound := "bugle"
call m_SendPushover
Und so habe ich "zig" Codeschnippsel, die mit wenigen Buchstaben dann den entsprechenden Schnippsel automatisch einfügen. Privat habe ich seit Urzeiten eine Editplus-Lizenz, weshalb das eigentlich noch mein Favorit ist, weil ich die aber auf dem Firmennotebook nicht nutzen kann, habe ich mir da das kostenlose Notepad++ zurechtgebogen, und ich suche noch nach dem Editor, der die Vorteile von beiden unter einem Dach vereint, sowohl für die tägliche Arbeit, als auch für die privaten Späße.

Klar programmiere ich auch mit Datenbanken/SQL und auch c# (der Editor/die VS2015 IDE ist so ziemlich das beste, was ich kenne), und ich muss auch ab und zu mit Ecllipse was in Java anpassen, und wenn's schnell gehen muss, dann wird es eben Ratz-Fatz in Excel-VBA hingeklöppelt.
Aber nochmal, da HPCL keine Vererbung, keine Überladung, keine Klassen und noch nicht mal OBJEKT-Referenzen als Variablen-Typ unterstützt, ist es mir egal, ob ich Parameter vorher "auf den Stack" packen muss, und nachher wieder abhole, oder ob das in einer Zeile geht, Hauptsache es geht überhaupt, mit den gegebenen Einschränkungen annähernd funktional zu programmieren (laut SPG hat mein HPCL-Projekt ca. 66.000 programmierte Makro-Zeilen, ich weiß also, wie Programmieren auf dem Zahnfleisch funktioniert).

Aber egal,
der Familienvater

Antworten

Zurück zu „homeputer CL - Bugs & Updatewünsche“