Universelle Zahlentastatur / virtuelles Keypad für AIO Remote

Haussteuerung mittels mediola

Moderator: Co-Administratoren

Antworten
MartinMatic
Beiträge: 99
Registriert: 19.10.2020, 18:34
System: CCU
Hat sich bedankt: 11 Mal
Danksagung erhalten: 29 Mal

Universelle Zahlentastatur / virtuelles Keypad für AIO Remote

Beitrag von MartinMatic » 25.09.2022, 15:06

Hallo,
da ich öfters vor der Aufgabe stand, Zahlenwerte in Systemvariablen einzugeben, habe ich mir ein Pop-up mit einer (hoffentlich) universell verwendbaren Zahlentastatur geschrieben.
Die universelle Zahlentastatur kann überall eingesetzt werden, wo über die AIO Remote – App eine
Zahl in eine Systemvariable eingegeben werden soll.
Die Zahlentastatur ist als Pop-up-Fenster ausgeführt und kann innerhalb einer Fernbedienung an
verschiedenen Stellen für verschiedene Variablen benutzt werden.
Beim Aufruf wird mit Hilfe jeweils eines Makros die Zielvariable angegeben, für welche die
Zahleneingabe bestimmt ist. Über einen Format-String können der zulässige Wertebereich der
Eingabe und die Anzahl der Nachkommastellen festgelegt werden.

Im PDF habe ich den Aufbau des Pop-ups und das zugehörige CCU-Programmskipt beschrieben.

Code: Alles auswählen

=======================================================================================
=  Skript Keypad =
=======================================================================================
Changelog
=======================================================================================
A0: 15.09.2022
- initial

=======================================================================================

=======================================================================================
=== Keypad_entry  ==============================================================
======================================================================================= 

!- ======= Keypad_entry ======
!- ======= Zeichen aus Buffer holen und verarbeiten =======
!- Version A0 

integer buffer_size;
string format_element;
integer format_precision = 0;
real format_min = 0.0;
real format_max = 0.0;
boolean result_valid = false;

string key_in = dom.GetObject("Keypad_Key").Value();   !- neues Zeichen vom Keypad holen
string key_buffer = dom.GetObject("Keypad_Buffer").Value(); !- Buffer Zeicheneingabe holen
string key_format = dom.GetObject("Keypad_Format").Value(); !- Formatierungsstring holen


!-- Formatierungsstring auswerten --
!- Formatierungsstring: <Anzahl Nachkommastellen>;<Minimalwert>;<Maximalwert>
!- Achtung: Kommazahlen mit Dezimalpunkt (.) angeben
!- Minimalwert = Minimalwert : Keine Bereichsprüfung
!- Beispiel: Wertebereich -23,5 bis 50 mit max. 2 Nachkommastellen: "2;-23.5;50"

!- Wenn kein Formatierungsstring dann Integer ohne Bereich annehmen
if (key_format == "")
    {
	 key_format = "0;0;0";
	}

!- Anzahl Nachkommastellen
format_element = key_format.StrValueByIndex(";",0);
format_precision = format_element.ToInteger();
if (format_precision < 0)
	{
	 format_precision = 0;
	}
if (format_precision > 15)
	{
	 format_precision = 15;
	}

!- Minimalwert
format_element = key_format.StrValueByIndex(";",1);
format_min = format_element.ToFloat();

!- Maximalwert
format_element = key_format.StrValueByIndex(";",2);
format_max = format_element.ToFloat();

if (format_max <= format_min)
	{
	 format_max = 0;
	 format_min = 0;
	}

!- aktuelle Anzahl Nachkommastellen ermitteln

integer current_precision = key_buffer.Find(",");
if (current_precision > -1)
    {
     current_precision = (key_buffer.Length() - current_precision) - 1;
	}


!- Fehlermeldung im Buffer? -> Löschen

if (key_buffer.StartsWith("Err"))
    {
	 key_buffer = "0";
	}


!-- Eingaben auswerten --
 
!- Taste Clear Entry 
if (key_in == "CE")
    {
	 key_buffer = "0";
	}

!- Zahlentasten 1..9 auswerten
if ((key_in >= "1") && (key_in <= "9") && (current_precision < format_precision))
    {
	 if (key_buffer == "0")
	     {
		  key_buffer = "";
		 }
	 if (key_buffer == "-0")
	     {
		  key_buffer = "-";
		 }
	 key_buffer = key_buffer + key_in;
	}

!- Zahlentaste 0 auswerten
!- dabei Nullfolgen vor dem Komma unterdrücken
if (key_in == "0")
    {
	 if ((key_buffer <> "0") && (key_buffer <> "-0"))
	     {
		  key_buffer = key_buffer + key_in;
		 }
	}

!- Vorzeichenwechsel auswerten
if (key_in == "SIGN")
    {
	 if (key_buffer.Substr(0,1) <> "-")
         {
		  if (format_min < 0)
			  {
		       key_buffer = "-" + key_buffer;
			  }
         }
     else
         {
		  key_buffer = key_buffer.Substr(1,(key_buffer.Length()-1));
         }		 
	}

!- Dezimalpunkt auswerten
!- nur ein Dezimalpunkt ist zulässig
!- nur wenn Kommastellen zugelassen
if ((key_in == "DEC") && (format_precision > 0))
    {
	 if (key_buffer.Find(",")== -1)
	 {
	  key_buffer = key_buffer + ",";
	 }
	}

!- eine Stelle löschen
!- Sonderfälle: 
!- Minuszeichen und Dezimalpunkt bleiben nicht alleine stehen
!- leeres Feld wird zur 0
if (key_in == "DEL")
    {
	 buffer_size = key_buffer.Length();
	 	 if (buffer_size > 0)
	        {
		     key_buffer = key_buffer.Substr(0,(buffer_size-1));
		    }
		if (key_buffer == "-")
		    {
			 key_buffer = "-0";
			}
		if (key_buffer == ",")
		    {
			 key_buffer = "0";
			}
		if (key_buffer == "")
		    {
			 key_buffer = "0";
			}
	}

!- Eingabetaste auswerten
if (key_in == "ENTER")
    {
	 key_buffer = key_buffer.Replace(",","."); 
	 real key_result = key_buffer.ToFloat();
	 
	 !-- Bereichsprüfung
	 result_valid = true;
	 if (format_min <> format_max)
	 {
	  if (key_result > format_max)
	      {
		   key_result = format_max;
		   result_valid = false;
		  }
	  if (key_result < format_min)
	      {
		   key_result = format_min;
		   result_valid = false;
		  }
	 }	  
	 !-- Ergebnis an Variable übergeben wenn gültig
	 if (result_valid)
	     {
		  string target_var = dom.GetObject("Keypad_Target").Value();   !- Name Zielvariable holen
		  if (target_var == "")
		      {			   
			   dom.GetObject("Keypad_Buffer").State("Err:Var.name leer");
			   result_valid = false;
			   dom.GetObject("Keypad_Valid").State(result_valid);
			   quit;
			  }
			  
		  object oVar= dom.GetObject (ID_SYSTEM_VARIABLES).Get (target_var);
		  if (!oVar)
		      {			   
			   dom.GetObject("Keypad_Buffer").State("Err:Var.nicht vorh.");
			   result_valid = false;
			   dom.GetObject("Keypad_Valid").State(result_valid);
			   quit;
			  }
		   
		   if (oVar.Value().VarType() <> 3)
		      {			   
			   dom.GetObject("Keypad_Buffer").State("Err:Var.typ falsch");
			   result_valid = false;
			   dom.GetObject("Keypad_Valid").State(result_valid);
			   quit;
			  }
		 			  
		   !-- Eingabewert in Ziel-Systemvariable schreiben			
		   dom.GetObject(target_var).State(key_result);		  
		 }
	    !- geprüften Ergebniswert aufbereiten für Ausgabe im Anzeigefeld	 
	    key_buffer = key_result.ToString();
	    key_buffer = key_buffer.Replace(".",",");
	    if (key_buffer.Find(",") > 0)
	        {
		     key_buffer = key_buffer.RTrim("0");
		     key_buffer = key_buffer.RTrim(",");
	    	}
	    
	}

!- wenn Ergebnis in Systemvariable geschrieben, den Buffer fürs nächste Mal löschen 
if (result_valid)
    {
	 key_buffer ="0";
	}

!- Buffer zum Anzeigefeld zurückschreiben
dom.GetObject("Keypad_Buffer").State(key_buffer);

!- Flag für Bearbeitungsstatus schreiben
!- Bei true Trigger zum Schließen des Keypad-PopUps
dom.GetObject("Keypad_Valid").State(result_valid);

Dateianhänge
Skript Keypad A0 formatiert.pdf
(191.18 KiB) 56-mal heruntergeladen
Projektbeschreibung AIO Keypad.pdf
(1.45 MiB) 54-mal heruntergeladen
Ansicht Keypad.jpg
Ansicht Keypad.jpg (12.17 KiB) 1310 mal betrachtet

Chemieka
Beiträge: 649
Registriert: 03.01.2017, 17:39
Hat sich bedankt: 4 Mal
Danksagung erhalten: 9 Mal

Re: Universelle Zahlentastatur / virtuelles Keypad für AIO Remote

Beitrag von Chemieka » 02.10.2022, 12:07

Also das ist mal super. Vielen Dank für die genaue Beschreibung. Läuft super bei mir.

Zwei Kleinigkeiten welche mir aufgefallen sind. Wenn ich den Code aus der PDF nehme bekomme ich dort dann einen Fehler. Nehme ich den Code aus dem Tread hier direkt, dann läufts.

Das zweite ist bei Enter sollte das Fenster sich schließen, wenn es so gedacht war, macht es das bei mir nicht. Gelöst habe ich das in dem ich die Funktion der Enter Taste in ein zusätzliches Makro exportiert habe + Popup schließen.

Eine hätte ich noch. Bei einer Variable welche ich füllen möchte, würde ich gern die Zahl in Minuten eingeben wollen. In der Variable muss es aber als Sekunden ankommen. Also 2 eingeben aber 120 in die Variable. Nicht ganz so einfach da das Skript ja allgemein für alles steht aber bei bestimmten Variablen brauch ich die Umrechnung. Evtl. gibts da auch einen anderen Ansatz.

Nochmal vielen lieben Dank. Da steckte bestimmt viel Arbeit drin. :D

PS das Macro bzw. bei mir zwei habe ich etwas abgeändert. So bekommt man noch eine Rückmeldung nach der Eingabe. Nur Spielerei aber macht Spass.
Screenshot 2022-10-02 122439.jpg
Screenshot 2022-10-02 122114.jpg
PI3+ mit RaspberryMatic; PI4 mit IOBroker; Samsung Tab A mit Mediola Visualisierung; Harmony Hub; Philips Hue; Drei IP Cams; Zwei Leseköpfe an den Stromzählern; Reedkontakt (Arduino) am Wasserzähler; Drucksensor (Arduino); CUL433 für Intertechno und Somfy RTS; Nuki Bridge

MartinMatic
Beiträge: 99
Registriert: 19.10.2020, 18:34
System: CCU
Hat sich bedankt: 11 Mal
Danksagung erhalten: 29 Mal

Re: Universelle Zahlentastatur / virtuelles Keypad für AIO Remote

Beitrag von MartinMatic » 02.10.2022, 15:04

Hallo Chemika,
Läuft super bei mir.
Prima, freut mich :-)
Wenn ich den Code aus der PDF nehme bekomme ich dort dann einen Fehler. Nehme ich den Code aus dem Tread hier direkt, dann läufts.
Liegt wohl daran, dass das PDF die Formatierung zerlegt. Irgendwo bei Zeile 195 rum ist da ein Umbruch im Kommentar, daher kommt warscheinlich der Syntax-Error. Das PDF sollte nur zum Code-Angucken sein, hätte ich besser schreiben können.
(...) bei Enter sollte das Fenster sich schließen, wenn es so gedacht war, macht es das bei mir nicht.
Das Ziel war an dieser Stelle, dass Enter das Fenster nicht in jedem Fall schliesst, sondern nur bei einer gültigen Eingabe. Daher habe ich den Umweg über die Keypad_Valid - Variable genommen.
Wenn es bei Dir nicht funktioniert, könnte das folgende Ursachen haben:
  1. Die Eingabe ist (gemäß der Vorgaben im Format-String) nicht gültig.
    Schaue bitte mal in der CCU nach, ob die Systemvariable Keypad_Valid beim Aufruf des Pop-Up-Fensters falsch ist (nach dem Makro-Aufruf) und nach Enter dann auf wahr wechselt.
    Letzteres sollte das Schließen des Pop-Up-Fensters auslösen.
  2. Bei der Einstellung des Pop-Up-Fensters stimm irgendwas noch nicht.
    Das fand ich auch etwas tricky, wie das im Creator eingestellt wird. Es sind drei Einstellungen beim Pop-Up-Fenster selbst nötig:
    (a) Status zuweisen: Dem Status des Pop-Up-Fensters wird die Variable Keypad_Valid zugewiesen mit dem Status wahr.
    Das legt fest, welche Variable bei welchem Wert eine Aktion des Fensters auslöst.
    (b) Aktion zuweisen: Hier "Pop-up schließen" zuweisen.
    Eigentlich würde man vielleicht gefühlt erwarten, dass dies beides unter "Aktion zuweisen" stehen sollte, ist aber getrennt.
    (c) Autorefresh setzen: Damit der Status von Keypad_Valid überhaupt zyklisch neu eingeslen wird und somit die Aktion auslösen kann, muss hier eine Zeit (z.B. 1s ) eingetragen werden.

    Den letzten Punkt hatte ich auch anfangs übersehen und war davon ausgegangen, dass die Änderung der Variable das Ereignis schon auslöst. Möglicherweise hängt es bei Dir auch am letzten Punkt.
Bei einer Variable welche ich füllen möchte, würde ich gern die Zahl in Minuten eingeben wollen.
Ja, Zeiteingaben habe ich erst mal bewusst rausgelassen (und Texteingaben auch).
Bei Zeit hab ich das Problem gesehen, dass es viele mögliche Eingabeformate gibt (hh:mm:ss, mm:ss, hh:mm usw.) und andererseits viele Möglichkeiten, das in Variablen zu speichern. Dann wird's mit der Bereichsprüfung echt haarig, fürchte ich.
Uhrzeiten habe ich für mich mit zwei Schiebereglern, einen für Stunde, einer für Minute gelöst, das fand ich ganz intuitiv (so ähnlich wie beim Wecker am Handy), z.B. hier: viewtopic.php?f=18&t=67575.

Viele Grüße

Martin

Chemieka
Beiträge: 649
Registriert: 03.01.2017, 17:39
Hat sich bedankt: 4 Mal
Danksagung erhalten: 9 Mal

Re: Universelle Zahlentastatur / virtuelles Keypad für AIO Remote

Beitrag von Chemieka » 02.10.2022, 15:18

Der Status wird richtig nach Enter gewechselt. Fenster schließt sich nicht. Halb so wild mit dem Macro gehts auch.
PI3+ mit RaspberryMatic; PI4 mit IOBroker; Samsung Tab A mit Mediola Visualisierung; Harmony Hub; Philips Hue; Drei IP Cams; Zwei Leseköpfe an den Stromzählern; Reedkontakt (Arduino) am Wasserzähler; Drucksensor (Arduino); CUL433 für Intertechno und Somfy RTS; Nuki Bridge

MartinMatic
Beiträge: 99
Registriert: 19.10.2020, 18:34
System: CCU
Hat sich bedankt: 11 Mal
Danksagung erhalten: 29 Mal

Re: Universelle Zahlentastatur / virtuelles Keypad für AIO Remote

Beitrag von MartinMatic » 02.10.2022, 16:24

Für Deine Minuten / Sekunden - Umrechnung hab ich auf die Schnelle mal etwas universeller folgendes eingebaut:

Werte-Umrechnung der Eingabe nach Drücken von ENTER

Funktioniert folgendermaßen:
Erweitere den Formatierungsstring um folgende Parameter:

ab Version B0 optional: Wertumrechnung mit Geradengleichung
Die Berechnung entspricht einer Geradengleichung mit y(x) = <Faktor> * x + <Summand>

Formatierungsstring: <Anzahl Nachkommastellen>;<Minimalwert>;<Maximalwert>;*<Faktor>;+<Summand>
<Anzahl Nachkommastellen>;<Minimalwert>;<Maximalwert> müssen dabei zwingend angeben werden

zusätzlich optionale Angabe:
4. Formatierungswert: *<Faktor> Eingabewert wird nach Enter mit diesem Wert multipliziert
5. Formatierungswert: +<Summand> wird nach Enter zum Ergebnis addiert

Die Zeichen * und + müssen angeben werden. Die Stellen im String dürfen nicht vertauscht werden

Beispiel: Eingabe von Celsius nach Fahrenheit umrechnen (°F = °C * 1,8 + 32)
Bereich -50°C bis 100°C, eine Nachkommastelle
Formatierungsstring: "1;-50;100;*1.8;+32"

Beispiel: Eingabe in Minuten, Speicherung in Sekunden
Bereich: 0 bis 200 Minuten, keine Nachkommastellen
Formatierungsstring: "0;0;200;*60"

Hier das upgedatete Script dazu:

Code: Alles auswählen

=======================================================================================
=  Skript Keypad =
=======================================================================================
Changelog
=======================================================================================
A0: 15.09.2022
- initial
B0: 02.10.2022
- Wertkonversion hinzugefügt

=======================================================================================

=======================================================================================
=== Keypad_entry  ==============================================================
======================================================================================= 

!- ======= Keypad_entry ======
!- ======= Zeichen aus Buffer holen und verarbeiten =======
!- Version B0 

integer buffer_size;
string format_element;
integer format_precision = 0;
real format_min = 0.0;
real format_max = 0.0;
real format_mul = 1.0; !- Faktor Wertkonversion
real format_add = 0.0; !- Konstante Wertkonversion
boolean result_valid = false;

string key_in = dom.GetObject("Keypad_Key").Value();   !- neues Zeichen vom Keypad holen
string key_buffer = dom.GetObject("Keypad_Buffer").Value(); !- Buffer Zeicheneingabe holen
string key_format = dom.GetObject("Keypad_Format").Value(); !- Formatierungsstring holen


!-- Formatierungsstring auswerten --
!- Formatierungsstring: <Anzahl Nachkommastellen>;<Minimalwert>;<Maximalwert>
!- Achtung: Kommazahlen mit Dezimalpunkt (.) angeben
!- Minimalwert = Minimalwert : Keine Bereichsprüfung
!- Beispiel: Wertebereich -23,5 bis 50 mit max. 2 Nachkommastellen: "2;-23.5;50"

!- ab Version B0 optional: Wertumrechnung mit Geradengleichung
!- Formatierungsstring: <Anzahl Nachkommastellen>;<Minimalwert>;<Maximalwert>;*<Faktor>;+<Summand>
!- <Anzahl Nachkommastellen>;<Minimalwert>;<Maximalwert> müssen zwingend angeben werden
!- zusätzlich optionale Angabe:
!- 4. Formatierungswert: *<Faktor> Eingabewert wird nach Enter mit diesem Wert multipliziert
!- 5. Formatierungswert: +<Summand> wird nach Enter zum Ergebnis addiert
!- Die Zeichen  * und + müssen angeben werden. Die Stellen im String dürfen nicht vertauscht werden
!- Die Berechnung entspricht einer Geradengleichung mit y(x) = <Faktor> * x + <Summand>
!- Beispiel: Eingabe von Celsius nach Fahrenheit umrechnen (°F = °C * 1,8 + 32)
!- Bereich -50°C bis 100°C, eine Nachkommastelle
!- Formatierungsstring: "1;-50;100;*1.8;+32"

!- Wenn kein Formatierungsstring dann Integer ohne Bereich annehmen
if (key_format == "")
    {
	 key_format = "0;0;0";
	}

!- Anzahl Nachkommastellen
format_element = key_format.StrValueByIndex(";",0);
format_precision = format_element.ToInteger();
if (format_precision < 0)
	{
	 format_precision = 0;
	}
if (format_precision > 15)
	{
	 format_precision = 15;
	}

!- Minimalwert
format_element = key_format.StrValueByIndex(";",1);
format_min = format_element.ToFloat();

!- Maximalwert
format_element = key_format.StrValueByIndex(";",2);
format_max = format_element.ToFloat();

if (format_max <= format_min)
	{
	 format_max = 0;
	 format_min = 0;
	}

!- Faktor-Wert für Variablen-Konversion (ab B0)
format_element = key_format.StrValueByIndex(";",3);
if (format_element<>"")
	{
	 if (format_element.StartsWith("*"))
	     {
		  format_element = format_element.StrValueByIndex("*",1);
		  if (format_element <> "")
		     {
			  format_mul = format_element.ToFloat();
			  if (format_mul == 0)
			     {
				  dom.GetObject("Keypad_Buffer").State("Err:Format Faktor");
			      result_valid = false;
			      dom.GetObject("Keypad_Valid").State(result_valid);
			      quit;				  
				 }
			 }
		 }
	}

!- Summand-Wert für Variablen-Konversion (ab B0)
format_element = key_format.StrValueByIndex(";",4);
if (format_element<>"")
	{
	 if (format_element.StartsWith("+"))
	     {
		  format_element = format_element.StrValueByIndex("+",1);
		  if (format_element <> "")
		     {
			  format_add = format_element.ToFloat();			  
			 }
		 }
	}

!- aktuelle Anzahl Nachkommastellen ermitteln

integer current_precision = key_buffer.Find(",");
if (current_precision > -1)
    {
     current_precision = (key_buffer.Length() - current_precision) - 1;
	}


!- Fehlermeldung im Buffer? -> Löschen

if (key_buffer.StartsWith("Err"))
    {
	 key_buffer = "0";
	}


!-- Eingaben auswerten --
 
!- Taste Clear Entry 
if (key_in == "CE")
    {
	 key_buffer = "0";
	}

!- Zahlentasten 1..9 auswerten
if ((key_in >= "1") && (key_in <= "9") && (current_precision < format_precision))
    {
	 if (key_buffer == "0")
	     {
		  key_buffer = "";
		 }
	 if (key_buffer == "-0")
	     {
		  key_buffer = "-";
		 }
	 key_buffer = key_buffer + key_in;
	}

!- Zahlentaste 0 auswerten
!- dabei Nullfolgen vor dem Komma unterdrücken
if (key_in == "0")
    {
	 if ((key_buffer <> "0") && (key_buffer <> "-0"))
	     {
		  key_buffer = key_buffer + key_in;
		 }
	}

!- Vorzeichenwechsel auswerten
if (key_in == "SIGN")
    {
	 if (key_buffer.Substr(0,1) <> "-")
         {
		  if (format_min < 0)
			  {
		       key_buffer = "-" + key_buffer;
			  }
         }
     else
         {
		  key_buffer = key_buffer.Substr(1,(key_buffer.Length()-1));
         }		 
	}

!- Dezimalpunkt auswerten
!- nur ein Dezimalpunkt ist zulässig
!- nur wenn Kommastellen zugelassen
if ((key_in == "DEC") && (format_precision > 0))
    {
	 if (key_buffer.Find(",")== -1)
	 {
	  key_buffer = key_buffer + ",";
	 }
	}

!- eine Stelle löschen
!- Sonderfälle: 
!- Minuszeichen und Dezimalpunkt bleiben nicht alleine stehen
!- leeres Feld wird zur 0
if (key_in == "DEL")
    {
	 buffer_size = key_buffer.Length();
	 	 if (buffer_size > 0)
	        {
		     key_buffer = key_buffer.Substr(0,(buffer_size-1));
		    }
		if (key_buffer == "-")
		    {
			 key_buffer = "-0";
			}
		if (key_buffer == ",")
		    {
			 key_buffer = "0";
			}
		if (key_buffer == "")
		    {
			 key_buffer = "0";
			}
	}

!- Eingabetaste auswerten
if (key_in == "ENTER")
    {
	 key_buffer = key_buffer.Replace(",","."); 
	 real key_result = key_buffer.ToFloat();
	 
	 !-- Bereichsprüfung
	 result_valid = true;
	 if (format_min <> format_max)
	 {
	  if (key_result > format_max)
	      {
		   key_result = format_max;
		   result_valid = false;
		  }
	  if (key_result < format_min)
	      {
		   key_result = format_min;
		   result_valid = false;
		  }
	 }	  
	 !-- Ergebnis an Variable übergeben wenn gültig
	 if (result_valid)
	     {
		  string target_var = dom.GetObject("Keypad_Target").Value();   !- Name Zielvariable holen
		  if (target_var == "")
		      {			   
			   dom.GetObject("Keypad_Buffer").State("Err:Var.name leer");
			   result_valid = false;
			   dom.GetObject("Keypad_Valid").State(result_valid);
			   quit;
			  }
			  
		  object oVar= dom.GetObject (ID_SYSTEM_VARIABLES).Get (target_var);
		  if (!oVar)
		      {			   
			   dom.GetObject("Keypad_Buffer").State("Err:Var.nicht vorh.");
			   result_valid = false;
			   dom.GetObject("Keypad_Valid").State(result_valid);
			   quit;
			  }
		   
		   if (oVar.Value().VarType() <> 3)
		      {			   
			   dom.GetObject("Keypad_Buffer").State("Err:Var.typ falsch");
			   result_valid = false;
			   dom.GetObject("Keypad_Valid").State(result_valid);
			   quit;
			  }
		 			  
		   !-- Eingabewert in Ziel-Systemvariable schreiben	
		   !-- mit Wertumrechnung ab B0
		   dom.GetObject(target_var).State((key_result*format_mul)+format_add);		  
		 }
	    !- geprüften Ergebniswert aufbereiten für Ausgabe im Anzeigefeld	 
	    key_buffer = key_result.ToString();
	    key_buffer = key_buffer.Replace(".",",");
	    if (key_buffer.Find(",") > 0)
	        {
		     key_buffer = key_buffer.RTrim("0");
		     key_buffer = key_buffer.RTrim(",");
	    	}
	    
	}

!- wenn Ergebnis in Systemvariable geschrieben, den Buffer fürs nächste Mal löschen 
if (result_valid)
    {
	 key_buffer ="0";
	}

!- Buffer zum Anzeigefeld zurückschreiben
dom.GetObject("Keypad_Buffer").State(key_buffer);

!- Flag für Bearbeitungsstatus schreiben
!- Bei true Trigger zum Schließen des Keypad-PopUps
dom.GetObject("Keypad_Valid").State(result_valid);
(ist jetzt nicht so ultra getestet)

Viele Grüße

Martin

Chemieka
Beiträge: 649
Registriert: 03.01.2017, 17:39
Hat sich bedankt: 4 Mal
Danksagung erhalten: 9 Mal

Re: Universelle Zahlentastatur / virtuelles Keypad für AIO Remote

Beitrag von Chemieka » 02.10.2022, 16:53

Das schau ich mir doch glatt mal an. Denke doch damit lässt sich etwas umsetzen. Dankeschön.
PI3+ mit RaspberryMatic; PI4 mit IOBroker; Samsung Tab A mit Mediola Visualisierung; Harmony Hub; Philips Hue; Drei IP Cams; Zwei Leseköpfe an den Stromzählern; Reedkontakt (Arduino) am Wasserzähler; Drucksensor (Arduino); CUL433 für Intertechno und Somfy RTS; Nuki Bridge

Antworten

Zurück zu „mediola“