Und noch ein Rollladen Script (HC3- Version)

Hier ist nun die portierte HC3-Version. Da Fibaro noch massig Fehler in der jetzigen Firmware hat und noch viele Änderungen zu erwarten sind, habe ich mich bei der Portierung aufs nötigste beschränkt.
Die meisten Fragen und Antworten findet ihr in der HC2-LUA Rubrik.

--[[
-- Shutter_control.lua 
-- Section		: EG
-- Version      : 1.0.1
-- Release date : Jun. 2020
-- Copyright    : 12-2016 - 2020 {jwi}

-- Documentation: RollerShutterControl 1.3.5.pdf
--]]

--[[
Declaration type: se-start
--]]
--local function Debug( color, message )
-- fibaro.debug(string.format('<%s style="color:%s;">%s', "span", color, message, "span"))
--end

math.randomseed( os.time() ) 
local luxSensorID    = 51  --51 via QA --nil -- ID of brigthness sensor 
local TempSensorID   = 25 -- 427 -- ID of temperature sensor (ZWeather)
local doorSensorID   = 202 -- nil ID of a door sensor
local lamp1ID        = 166 -- lamp ID(s) for presence simulation 

local randomMinValue = 7   -- kleinster Zufallswert
local randomMaxValue = 20  -- größter Zufallswert
local minuteslater   = 8  -- Initialisierung Variable fuer spaeteres Oeffnen oder Schliessen

local notbeforeM     = '07:15' -- nicht vorher Morgens 
local notafterM      = '08:10' -- nicht nach 08:10 
local notbeforeE     = '22:29' --
local notafterE      = '21:00' -- 

local rollerIDsM     = {89,} -- IDs der Rolllaeden für morgens {n1, n2, nn}
local rollerIDsE     = {89,}    -- IDs der Rolllaeden für Abenddaemmerung {n1, n2, nn}
local rollerIDsN     = {89,}    -- IDs der Rolllaeden für Nachtanbruch bevor man schlafen geht 
local rollerIDsS     = {89,} -- IDs der Rolllaeden für Sonnenschutz Suedseite 
local rollerIDsNC    = {89,} -- IDs der Rolllaeden die nicht geschlossen werden
                                 -- solange eine Tür offen ist.
local posQuarter  = 25  -- viertel offen  
local posHalf     = 50  -- halb offen
local pos3Quarter = 70  -- 3/4 offen
local posOpen     = 99  -- ganz offen
local posClose    = 0   -- zu
local rollerStat  = nil -- gemeldeter Öffnungswert

local SUN_Protect   = false --true -- Soll der Sonnenschutz aktiviert werden (Sommerbetrieb = true)
local sunProLuxOn   = 30000 -- ab diesem Wert aktivieren
local sunProLuxOff  = 15000 -- ab diesem Wert deaktivieren
local sunProTempOn  = 24  -- Temperatur ab der der Sonnenschutz aktiviert wird
local sunProTempOff = 23  -- Temperatur ab der der Sonnenschutz deaktiviert wird
local sunProChkOff  = "19:30" -- (+) Ab dieser Zeit wird nicht mehr auf Sonnenschutz geprüft 
local sunProTimeOff = "19:29" -- (+) Zeit um der der Sonnenschutz auf alle Fälle beendet Wird.  
local sunProPos     = 15   -- Rollläden nicht ganz schließen, Schlitze verhindern 
                           -- Hitzestau und Schäden an den Lamellen.
local sunProtectActiv      -- = false                      
local debug   = true       -- debug ausgaben ja | nein
---------------End user defined variables ---------------------
local checkTime   = "03:15" -- Uhrzeit zur Feststellug des Sonnenauf- und untergangs für den nächsten Tag
local checkDay    = false   -- Die Variable stellt sich um 'checktime' auf true
local version     = "1.3.6"
temperatur = tonumber(string.format("%.2f",fibaro.getValue(TempSensorID, "value")));

if (sunProChkOff <= sunProTimeOff) then
   SUN_Protect  = false
   fibaro.warning("SCENE"..sceneId,'<font color="orange">SunProChkoff muss groesser als sunProTimeOff sein.</font>')  
   fibaro.warning("SCENE"..sceneId,'<font color="orange">Sonnenschutz wurde deaktiviert!</font>')
end  

if luxSensorID ~= nil then
   brightness = tonumber(fibaro.getValue(luxSensorID, 'value')); --Wert des Luxsensors
elseif (fibaro.getGlobalVariable('brightness') ~= nil) then 
   brightness = tonumber(fibaro.getGlobalVariable("brightness")); -- LuxWert aus globaler Variable
end

-- Korrektur des Sonnenauf und -untergangs über die Monate
-- Morning - negativer Wert - Morgens gehen die Rollläden früher auf
-- Evening - positver Wert - Abends gehen die Rollläden  später zu
local function offSetM() -- offset morning 
  local month = tonumber(os.date('%m'))
  local tabm = { [1] = "-20", [2] = "-15", [3] ="-5", [4] = "15", [5] = "20", [6] = "25",
         [7] = "35", [8] = "20", [9] ="10", [10] = "-10", [11] = "-5", [12] = "-20" }
  return tonumber(tabm[month])
end  

local function offSetE() -- offset evening
  local month = tonumber(os.date('%m'))
  local tabm = { [1] = "8", [2] = "12", [3] ="15", [4] = "10", [5] = "15", [6] = "10",
         [7] = "10", [8] = "10", [9] ="20", [10] = "10", [11] = "5", [12] = "5" }
  return tonumber(tabm[month])
end

local function randomValue(randomMinValue, randomMaxValue)
   local random  = math.floor(math.random(randomMinValue, randomMaxValue));
   local minutes = math.floor((random*60)/60);
   return minutes;
end
-- Neuen Sonnenaufgang berechnen
local function calcTime( timeString, random )
   -- Zeit nach Minuten umwandeln + Zufallszeit addieren   
   local HtimeString = string.sub(timeString,1,2)
   local MtimeString = string.sub(timeString,4,5)
   local timeStringMIN = tonumber(HtimeString * 60) + tonumber(MtimeString); 
   local timeStringMIN = timeStringMIN + random
   local laterCloseMIN = timeStringMIN + (minuteslater + random) --

   -- Neue SunRise Zeit wieder nach String hh:mm umwandeln
   local timeStringHnew = math.floor(timeStringMIN / 60)
   local timeStringMnew = timeStringMIN - (timeStringHnew * 60) 
  
   local laterCloseH = math.floor(laterCloseMIN /60)
   local latercloseM = laterCloseMIN - (laterCloseH *60)  
  
   local newtimeString  = string.format("%02d", timeStringHnew) .. ":" .. string.format("%02d", timeStringMnew)  
   local laterClose     = string.format("%02d", laterCloseH) .. ":" .. string.format("%02d", latercloseM)  
 
   return newtimeString, laterClose ;
end 

local function addrandom(str, random)
  local std, min = str:match("([^,]+):([^,]+)")
  local newtimeString = os.date("%H:%M", -3600 + std*60*60 +  (min*60 + random*60  ));
 
  return newtimeString
end  
-- ===================================================
-- Funktionen fuer den Sonnenschutz ein und auschalten
-- ===================================================
local function sunProtect(action)
   if action == "ON" then
     if sunProtectActiv == true then
        if debug then print('Temperatur: '.. temperatur) end  
        if debug then print('Helligkeit: '.. brightness) end
        print('Sonnenschutz wird aktiviert')
        tdev = {} 
        if (rollerIDsS[1] ~= nil) then
           -- Speichere Position der Rolllaeden
           for r=1, #rollerIDsS do
              if rollerIDsS[r] ~= nil then
                 rollerStat = fibaro.getValue(rollerIDsS[r], 'value')
                 table.insert(tdev, {rollerIDsS[r], rollerStat} )
                 fibaro.call(rollerIDsS[r], 'setValue', sunProPos) 
              end
           end --for
        end    
     end
  else -- Sonnenschutz wird zurückgenommen, alter Zustand wird wieder hergestellt
     print('Sonnenschutz wird deaktiviert')
     if debug then print('Temperatur: '.. temperatur) end 
     print('Helligkeit: '.. brightness) 
     if tdev ~= nil then 
         for r=1, #rollerIDsS do
             -- Pruefung ob Rollladen in der Zwischenzeit bewegt wurde
             if ( tonumber(fibaro.getValue(rollerIDsS[r], 'value')) == sunProPos ) then
                fibaro.call(tdev[r][1],'setValue', tdev[r][2] )
             end
         end --for
     end
  end  
end  

local function check4sunProtect()
  if (temperatur >= sunProTempOn and brightness >= sunProLuxOn ) and sunProtectActiv ~= true then
     sunProtectActiv = true
     sunProtect("ON")  
  elseif (temperatur <= sunProTempOff and brightness <= sunProLuxOff ) and sunProtectActiv == true 
     or (os.date("%H:%M") >= sunProTimeOff and sunProtectActiv == true  ) then
     print('Sonnenschutz aus.')
     sunProtectActiv = false
     sunProtect("OFF") 
  end    
end 
-- Funktion zum ueberpruefen welche IDs im Falle einer offenen Tuer
-- nicht geschlossen werden sollen.
local function check4NC(id) -- check the NotClose IDs if a door is open 
   for i=1,#rollerIDsNC do
      if rollerIDsNC[i] == id then 
         return true
      end
   end -- for
   return false
end --

--
-- ========================================
-- Funktionen zum Oeffnen und Schliessen --
-- ========================================
--
local function earlymorning() -- 1.te Szene des Tages
   print('Funktion earlymorning gestartet. ') 
   --fibaro.call(lamp1ID, "turnOn"); 
   if (rollerIDsM[1] ~= nil) then
      for r=1, #rollerIDsM do
         if rollerIDsM[r] ~= nil then
             rollerStat = tonumber(fibaro.getValue(rollerIDsM[r], 'value'))
             if debug then print('Rollerstat :'.. rollerStat) end
             if (rollerStat == 0) then 
                if debug then print(rollerIDsM[r]..' ist noch geschlossen') end
                fibaro.call(rollerIDsM[r],'setValue', posHalf )
             end
          end
         fibaro.sleep(math.random(4000,10000)) ; --4 bis 10 Sek. warten 
      end --for
   end  
   print('Rolllaeden ' ..posQuarter..'% geoeffnet - ' .. os.date("%c"));
   
end  -- function earlymorning

local function goodmorningSun()
   print('Funktion goodmorning gestartet.') 
   --fibaro.call(lamp1ID, "turnOff"); -- Lampe wieder ausschalten 
   print('Sonnenaufgang - ' .. os.date("%c")); 
   print('Temperatur: ' .. temperatur .. '° um ' .. os.date('%H:%M'));
      -- if (temperatur > 20) then   -- es ist sommerlich warm
      --    posOpen = 60     -- wir öffnen die Rolläden nicht ganz 
      --    print('Rolllaeden werden nur '..posOpen..'% geöffnet.')
      -- end
       if (rollerIDsM[1] ~= nil) then
          for r=1, #rollerIDsM do
             if rollerIDsM[r] ~= nil then
                fibaro.call(rollerIDsM[r],'setValue', posOpen )
                rollerStat=fibaro.getValue(rollerIDsM[r], 'value')
             end
             fibaro.sleep(math.random(3000,7000)); -- 3 bis 7 Sek. warten
          end
       end  
       print('Rolllaeden '..posOpen.. '% geöffnet' );
       posopen = 99;
end -- function goodmorningSun  

local function highNoon() 
   --Ersatzfunction falls man die Sonnenschutzfunktion nicht nutzt.  
   --Ausschlafen wird wieder deaktiviert  
   print( 'Funktion highNoon gestartet.') 
   print('yellow','Mittagshitze. Schließe Rollladen bis bis auf n% ' .. os.date("%c")); 
   -- es ist moerderisch heiss, wir 
   -- lassen nur einen kleinen Spalt offen
   local posOpen = 15
   if (rollerIDsM[1] ~= nil) then
      fibaro.debug('Rollläden nur einen Spalt öffnen.')
      for r=1, #rollerIDsE do
          if rollerIDsE[r] ~= nil then
             fibaro.call(rollerIDsE[r],'setValue', posOpen)
          end
          fibaro.sleep(math.random(4000,9000)); -- 4 bis 9 Sek. warten 
      end
   end  
    print('Rollladen minimal geöffnet');
    print('Lange ausschlafen ist abgeschaltet.');
end  -- function highnoon

local function goodEvening() --Abenddaemmerung/twilight
       print('Funktion goodevening gestartet.')
       -- fibaro.call(lamp1ID, "turnOn"); -- Licht an?
       if (rollerIDsE[1] ~= nil) then
          print('Rollläden werden zur Haelfte geschlossen.' .. os.date("%c"))
          for r=1, #rollerIDsE do
             if rollerIDsE[r] ~= nil then
                fibaro.call(rollerIDsE[r],'setValue', posHalf )
             end
             fibaro.sleep(math.random(5000,9000)) ;
          end 
       end  --
       print('Rolllaeden noch '..posHalf..'% offen');
      
end --end function goodEvening

local function goodNight()
      print('Funktion goodNight gestartet.') 
      print('Es ist ganz dunkel... schließe Rollladen');
      if (rollerIDsN[1] ~= nil) then
          print('Rolllaeden werden geschlossen.' .. os.date("%c"))
          for r=1, #rollerIDsN do
             if rollerIDsN[r] ~= nil then
                fibaro.call(rollerIDsN[r],'setValue', posClose )
             end
             fibaro.sleep(math.random(5000,10000)) ;
          end --for
       end  
       print('Rolllaeden '..posClose..'% offen.');
end -- function goodnight

--- Funktion goodnight mit Doorcheck
--- Es darf nur eine goodnight Funktion aktiviert werden!
local function goodNightWdoorCheck() 
  print('Funktion goodNNightWdoorCheck gestartet.') 
  doorvalue = tonumber(fibaro.getValue(doorSensorID, 'value'))
  print('green','Es ist ganz dunkel... schließe Rollladen');
  if (rollerIDsN[1] ~= nil) then
      print('Rolllaeden werden geschlossen.' .. os.date("%c"))
      for r=1, #rollerIDsN do
         if rollerIDsN[r] ~= nil then
            if check4NC(rollerIDsN[r]) and doorvalue == 1 then
               print(rollerIDsN[r] .. ' wird nicht geschlossen' )
            else   
               print(rollerIDsN[r] .. ' wird geschlossen' )
               fibaro.call(rollerIDsN[r],'setValue', posClose )
            end
         end
         fibaro.sleep(math.random(2000,4000)) ;
      end -- for
  end  
  print('Rolllaeden '..posClose..'% offen.');
  runNight = true
end -- function goodnightWdoorcheck

-- Die Funktion 'Close All Not Closed' ist im Prinzip eine Kopie der 
-- goodNight(), mit dem Unterschied das die Rolllaeden aus dem Array 
-- rollerIDsNC geschlossen werden.
local function closeAllNC()
   print('Funktion closeAllNC gestartet')
   print('Es ist dunkel, alle Türen sind zu... schliesse alle Rollladen');
   if (rollerIDsNC[1] ~= nil) then
       print('Rolllaeden werden geschlossen.' .. os.date("%c"))
       for r=1, #rollerIDsNC do
          if rollerIDsNC[r] ~= nil then
             fibaro.call(rollerIDsNC[r],'setValue', posClose )
          end
          fibaro.sleep(math.random(2000,4000)) ;
       end --for
   end  
       prin('Rolllaeden '..posClose..'% offen.');
       runCloseAll = true --bereits gelaufen
end  
---
---  Ende der Funktionen fuer Oeffnen oder Schliessen  ---
--- ================================================== ---

-- ######################################################
--                Initialize 
-- ######################################################
local sunriseHour = fibaro.getValue(1,"sunriseHour");
local sunsetHour  = fibaro.getValue(1,"sunsetHour");
local randminutes = randomValue(randomMinValue, randomMaxValue)
local newsunriseHour, laterOpen = calcTime(sunriseHour, tonumber(randminutes) + offSetM() )
local newsunsetHour, laterClose = calcTime(sunsetHour, tonumber(randminutes) + offSetE() )
local sleepin = tonumber(fibaro.getGlobalVariable("Ausschlafen")) or 0;
runEarly,runMorning,runEvening,runNight,runcloseAll = false,false,false,false,false 
--
--
function rollershutter()  -- Hauptprogramm
   math.randomseed( os.time() ) 
   temperatur = tonumber(string.format("%.2f",fibaro.getValue(TempSensorID, "value")));
   if luxSensorID ~= nil then  
      brightness = tonumber(fibaro.getValue(luxSensorID, 'value')); -- Wert des Luxsensors
   elseif (fibaro.getGlobalVariable('brightness') ~= nil) then               
      brightness = tonumber(fibaro.getGlobalVariable("brightness")) or 0; -- LuxWert aus globaler Variable
   end 
   
   local currentDate = os.date("*t");
   local actionTime  = (string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min));
   local randminutes  = randomValue(randomMinValue, randomMaxValue)
   local minuteslater = randomValue(randomMinValue, randomMaxValue)  -- Spaeteres Oeffnen oder Schliessen
   --local minuteslater = randomValue(4,8)  -- Spaeteres Oeffnen oder Schliessen
   local holiday      = tonumber(fibaro.getGlobalVariable("Feiertag_heute"));
   if (holiday == nil) then holiday = 0;  end
   if (holiday == 1) then einORkein = 'ein' else einORkein = 'kein' end
   if ( checkDay == false) then
      sunriseHour = fibaro.getValue(1,"sunriseHour"); 
      sunsetHour  = fibaro.getValue(1,"sunsetHour");  
      newsunriseHour, laterOpen = calcTime(sunriseHour, tonumber(randminutes) + offSetM() ) 
      newsunsetHour, laterClose = calcTime(sunsetHour, tonumber(randminutes) + offSetE() )  
      sleepin = tonumber(fibaro.getGlobalVariable("Ausschlafen")) or 0; -- wird über ein VD aktiviert
      randomMorning  = addrandom(notbeforeM,randomValue(4, 9)) -- morgens nicht vorher + Zufall
      temperatur = tonumber(string.format("%.2f",fibaro.getValue(TempSensorID, "value")));
      checkDay   = true
      runEarly,runMorning,runEvening,runNight,runcloseAll= false,false,false,false,false
      --
      local zeiten = "Zeiten für "..os.date("%d. %b %Y, ")
     
      fibaro.debug("SCENE"..sceneId, '<font color="yellow">=================================</font>')  
      fibaro.trace("SCENE"..sceneId, zeiten) 
      --
     
      print('Heute ist '..einORkein..' Feiertag oder Wochenende.')  
      print('RealSunrise: ' .. sunriseHour);
      print('New SunRise: ' .. newsunriseHour)
      print('Later Open: ' .. laterOpen)
      print('--')
      print('RealSunset: ' .. sunsetHour);        
      print('New SunSet: ' .. newsunsetHour)
      print('LaterClose ' .. laterClose)
      print('Temperatur: ' .. temperatur .. '° um ' .. os.date('%H:%M'));
      print('Helligkeit: ' ..brightness.. ' Lux')
      print('---------------------------------')
     
   end   
   
   -- Fuer Simulation die 2 folgenden Variablen mit zeitnaher Uhrzeit fuettern
   -- local newsunriseHour = "09:48"
   -- local newsunsetHour  = "22:39"

  ---------------------------------------------------------------
--- Ab hier koennen die verschiedenen Bedingungen zum Oeffnen 
--- und Schliessen  hinterlegt werden. Bitte beachten dass die Bedingungen
--- Funktionen nicht 2-fach aufrufen!  
---------------------------------------------------------------  
  if ((actionTime >= notbeforeM and actionTime <= notafterM) and runEarly == false 
     or (actionTime == newsunriseHour) and runEarly == false )     
     then --Morgenroete 
     earlymorning() --früh morgens, egal ob Werktag oder Feiertag 
     runEarly = true
    
  --elseif (actionTime >= notbeforeM and holiday == 1 
  --   and runEarly == false )  
  --   then --Morgenröte 
  --   earlymorning() -- es ist Feiertag, deshalb um notbeforM oeffnen  
  --   runEarly = true
    
  elseif (actionTime == laterOpen and sleepin == 0 
     and runMorning == false ) 
     then --es ist schon hell
     goodmorningSun()  
     runMorning = true
    
 -- elseif (actionTime == "12:00")  
    --  and temperatur >= 25) -- zusaetzlicher Check um die Mittgaszeit falls man 
   -- then                      -- keinen Sonnenschutz verwendet   
            
   -- highNoon() 
  
  elseif ((actionTime == newsunsetHour) )    
     then --Abenddaemmeung
     goodEvening()
     runEvening = true  

  elseif (actionTime == notbeforeE ) --laterClose
     then -- Es wird/ist dunkel.
     goodNightWdoorCheck() -- goodNight() oder goodNightWdoorCheck() 
     runNight = true
   
  --elseif (actionTime > laterClose   
  elseif (actionTime >= notbeforeE  
     and (tonumber(fibaro.getValue(doorSensorID, 'value')) == 0) 
     and runcloseAll == false  )
     then -- Tuer zu, dann auch Rollladen zu.
     -- Bitte diese Funktion mit Bedacht aktivieren. Nicht ohne Smartphone
     -- oder FB hinausgehen.
     closeAllNC()
     runcloseAll = true  

  elseif (actionTime == checkTime) then
     checkDay = false 
    
  end -- Ende der elseif Bedingungen
  
  if (actionTime > newsunriseHour and actionTime < sunProChkOff -- Zeit in der auf Sonnenschutzbedingung gepüft wird
     and SUN_Protect == true) then
     check4sunProtect()  -- Pruefen ob der Sonnenschutz aktiviert werden soll
  end
  fibaro.setTimeout(60*1000, rollershutter)
  end -- function rollershutter
-- Hauptprogramm starten  
rollershutter();

Und hier die Doku:RollerShutterControl1.3.4.pdf (64,1 KB)

1 Like

Hallo @jeep

Ist ja bedeutend umfangreicher und komplexer als meiner.
Da können die Leute sich eine Menge abschauen.

Ich hätte da eine Frage.
Du schreibst in der Declaration folgendes :

–[[
Declaration type: se-start
–]]

müsste das nicht so aussehen ?
{
conditions = {
{
type = „se-start“,
property = „start“,
operator = „==“,
value = true,
isTrigger = true
}
operator = „any“
}

Damit wird die Szene am Start des Gateways (HC3) einmal aufgerufen.
Dann schreibst du das die Szene 1 x pro Minute aufgerufen wird.
Musst du da nicht den Trigger erweitern um :

{
  isTrigger = true,
  operator = "match",
  property = "cron",
  type = "date",
  value = { "*", "*", "*", "*", "*", "*" }
}

Reicht dafür um beim Starten und 1 x Pro Minute deine Version aus ?
Wenn ja, dann mache ich da immer zu viel rein.
Habe ich da die Triggerbedingungen falsch verstanden und mache das zu Umständlich ?

Gruss Frank

Hallo @jeep
ich hatte mir die Szene aus der HC2-Version bereits auf mein HC3 geändert. Dennoch habe ich einige Änderungen in dieser portierten Szene gefunden, die ich umsetzen werden (z.B. farbige debug-Ausgaben). Deshalb vielen Dank fürs teilen

@Berges01
meine umgeschriebene Scene habe ich über einen CronJob getriggert. Dieser startet die Szene dann jede Minute. Läuft bisher super. Entsprechend steht bei mir in den DECLARATIONS nur „nil“.

Gruß
KaWi

Hallo @Berges01, natürlich muss man die Declaration komplett eintragen, Wollte nicht unnötigen Fibaro Code reinschreiben.

Nein, den Trigger muss man nicht erweitern, das macht die Szene am Ende selbst. mit fibaro.setTimeout().
Wenn man sie über den Trigger value = { „", "“, „", "“, „", "“ }, permanent startet, würde die Szene alle gesammelten Daten vergessen und der Sonnenschutz und andere Funktionen würden nicht mehr funktionieren.
Je nach Szene kann aber ein minütlicher Start sinnvoll sein.
Also die Szene funktioniert so ganz gut.

Ob das so gut ist wage ich zu bezweifeln. Beim Sonnenschutz wird die Position der Rollläden davor gespeichert… Und außerdem werden dann jedes mal alle Variablen neu initialisiert. Bedeutet auch mehr Last fürs HC3.

Genau das waren auch gerade meine Gedanken. Das erklärt auch, warum ich immer nur geschafft habe den Sonnenschutz zu aktivieren, er aber nie deaktiviert wurde.

Habe das bereits in den Declaration geändert.

Deshalb finde ich es so klasse, wenn hier so tolle Szenen geteilt werden. Ich selbst kann mir da unheimlich viel von abgucken und lerne immer ein wenig dazu :smiley:

Jup da hast du Recht, ich hatte das nicht bis zum Schluss gesehen.
Natürlich ist das dann so OK !
SORRY für den Einwand.
Gruss Frank

Genau so sehe ich das auch.
Ich habe nichts zu verbergen und verdiene auch kein Geld damit.
Ich wünschte ich hätte am Anfang auch so BeispielSzenen gehabt wo ich probieren und lernen konnte, als ich Angefangen habe mit dem HC3 gab es noch nichts da der erst 1 Woche auf dem Markt war.
Lernen ist immer Gut.
Gruss Frank

Ach komm, ist doch gar kein Problem. Meinst Du ich sehe immer alles? Ich bin auch nur Hobbyprogrammierer und lernte auch viel über die Foren.

1 Like