Coding

Festival Holledau App – 1.0

Jeder Programmierer träumt von seiner eigenen App im Appstore oder Playstore. Diesen Traum hab ich mir nun erfüllt.
Hab die Hotelnächte genutzt und mich mal an Xamarin gesetzt. Es war auch ein guter Zeitpunkt. Denn Xamarin ist meiner Meinung nach nun Erwachsen und für mich die Wahl für App Entwicklung. Toller Nebeneffekt, schnell und einfach eine CrossPlattform App entwicklen.

Bei der App handelt es sich um ein Festival bei mir in der Gegend. Das Festival Holledau hat lange Tradition und ist komplett von einem gemeinnützigen Verein organisiert. Es werden ALLE Einnahmen gespendet, was in der heutigen Zeit einem Einhorn gleicht.

Alle im Dorf helfen mit um ein Musik Open-Air zwischen Hopfengärten aufzubauen.
Ich habe die App dem Festival-Holledau gespendet um auch einen Teil zu dieser tollen Veranstaltung beizutragen.

Derzeit nur für iOS (iPhone & iPad) im Appstore. Android-Version folgt.

Habe vor hier auf Suplanus über Xamarin zu schreiben. Auch ein bisschen erzählen wo es Probleme gabe bzw. ich Probleme hatte :^)
Geplant ist auch die komplette App OpenSource auf Github bereitzustellen.

Hier mal ein Video der ersten Version:

Von |2019-12-05T09:07:32+01:002018-11-09|Coding, Festival Holledau App, Projekte, Xamarin|

Wie ein continue die CPU ärgert

Ich hatte durch Zufall gesehen, dass einer meiner Python Prozesse die CPU in die Höhe schießt.
Es handelt sich um meine HueRainbowClock

Tja, aber warum? Ich hab doch extra was eingebaut damit die CPU geschont wird:

while(True):	
	# Check time
	now = datetime.datetime.now()
	hour = int(now.strftime("%H"))

	# Check if already set
	if hour == hourBefore:
		continue # do nothing

	# Doit
	DingDong()
	
	# Sleep (gentle CPU)
	time.sleep(60)

Mein Blick fiel dann gleich auf das continue  … dann musste ich an “Weniger schlecht Programmieren” denken.
Die sleep()  Methode wurde nie erreicht…

Darum sollte man mit sowas immer vorsichtig sein, oder gar ganz vermeiden.

Von |2018-08-21T13:11:32+02:002018-08-22|Coding, Python|

Avada sticky Header Overlay-Logo

Ich hab das schon auf ein paar Seiten gesehen, dass das Logo über den Content “hängt”.
Das wollte ich auch so für den sticky Header (wenn man nach unten scrollt).

Mit diesem Custom-CSS könnt ihr das erreichen:

/* Header logo */
header.fusion-header-wrapper.fusion-is-sticky nav.fusion-main-menu li img.fusion-sticky-logo {
    position:  relative;
    top: 11px;
    max-height: 54px !important;
}

Von |2018-08-20T13:30:35+02:002018-08-20|Coding|

LedMatrix

Noch so ein Projekt was gefühlt schon ewig (zwei Jahre) zurückliegt, aber ich noch keine Zeit gefunden habe darüber zu schreiben. Eigentlich seit ich etwas mit Computer mache, wollte ich mir schon immer eine LED Matrix bauen.

 

Mir macht Löten keinen Spaß, darum hab ich das immer gescheut. Aber mit LED-Stripes ist das nun einfach und sogar relativ günstig. Man braucht eigentlich nur folgendes:

  • LED-Stripes: 16×16=256 (hab WS2812b genommen, sind nur 3-Leiter)
  • Netzteil: In meinem Fall 20A
  • Mikrocontroller: Muss schnell genug sein. Hab nen Tensy genommen
  • Optional Rapsberry Pi: Damit kann ich Ihn vom Netzwerk aus steuern
  • Optional USB-Umschalter: Damit kann ich zwischen Raspberry Pi und Standalone umschalten

Nun hab ich mir eine MDF-Platte hergeschnitten und Fächer aus Kunststoff erstellt. Hier wenn möglich was leichteres nehmen. Die LED-Matrix ist sehr schwer geworden. Hatte noch bisl Holz rumliegen. Das hab ich geflämmt. Milch-Plexiglas hab ich fertig bestellt.

Den Tensy kann man mit Arduino programmieren. In meinem Fall läuft ne Laufschrift durch bis ein Signal von Serial kommt. Hier nutze ich auf dem Pi Glediator. Über Screens kann ich vom iPad aus auch auf den Pi per VNC und das bequem bedienen (oder per Handy was auf einer Party praktisch ist).

#include <FastLED.h>
#include <LEDMatrix.h>
#include <LEDText.h>
#include <Font12x16.h>

#define LED_PIN            4

#define COLOR_ORDER         GRB
#define CHIPSET             WS2812B

// initial matrix layout (to get led strip index by x/y)
#define MATRIX_WIDTH   16
#define MATRIX_HEIGHT  16
#define MATRIX_TYPE    HORIZONTAL_ZIGZAG_MATRIX
#define MATRIX_SIZE    (MATRIX_WIDTH*MATRIX_HEIGHT)
#define NUMPIXELS      MATRIX_SIZE

#define WAITMAX      100000

// create our matrix based on matrix definition
cLEDMatrix<MATRIX_WIDTH, MATRIX_HEIGHT, MATRIX_TYPE> leds;
cLEDText ScrollingMsg;

int waitCount = 0;


const unsigned char TxtDemo[] = { EFFECT_SCROLL_LEFT " Hello World "};

void setup()
{
  Serial.write("Setup...\n");
  

  pinMode(13, OUTPUT);
  digitalWrite(13, HIGH);

  FastLED.addLeds<CHIPSET, LED_PIN, COLOR_ORDER>(leds[0], leds.Size());
  FastLED.setBrightness(255);
  FastLED.clear(true);
  FastLED.show();   
     
  FastLED.showColor(CRGB::Red);  
  delay(500);
  
  FastLED.showColor(CRGB::Green);  
  delay(500);
  
  FastLED.showColor(CRGB::Blue);
  delay(500);

  ScrollingMsg.SetFont(Font12x16Data);
  ScrollingMsg.Init(&leds, leds.Width(), ScrollingMsg.FontHeight(), 0, 0);
  ScrollingMsg.SetText((unsigned char *)TxtDemo, sizeof(TxtDemo) - 1);
  ScrollingMsg.SetTextColrOptions(COLR_RGB | COLR_SINGLE, 0xff, 0x00, 0xff);  
  
}

int serialReadBlocking() {
while (!Serial.available()) {}
    return Serial.read(); 
}

void loop()
{
  if (Serial.available())
  {
    waitCount = 0;
    while (serialReadBlocking() != 1) {} 
    digitalWrite(13, HIGH);
    for (long i=0; i < MATRIX_SIZE; i++) {
      leds(i).r = serialReadBlocking();
      leds(i).g = serialReadBlocking();
      leds(i).b = serialReadBlocking();
    }
    FastLED.show(); 
    digitalWrite(13, LOW);
  }
  else
  {    
    waitCount++;
    if(waitCount > WAITMAX)
    {
      waitCount = WAITMAX; // Fix no overflow
      if (ScrollingMsg.UpdateText() == -1)
      {
        digitalWrite(13, HIGH);      
        ScrollingMsg.SetText((unsigned char *)TxtDemo, sizeof(TxtDemo) - 1);          
      }
      else
      {      
        FastLED.show();      
        digitalWrite(13, LOW);
      }
      delay(50);
    }    
  }  
}

Für die Elektronik hab ich (verzeiht es mir) PE-Brücken genommen und dort immer die Spannungsversorgung der Stripes parallel drauf geschalten. Das Signal vom Tensy muss aber durchgeschleift werden.

Machte echt Spaß und sieht super aus!

Von |2018-07-26T06:00:07+02:002018-07-25|Projekte, Raspberry Pi|

OfficeSpace

Jetzt bin ich glaub ich mit der Büro Automatisierung durch :^)

Ich habe alle Verbraucher am Schreibtisch an einer FRITZ!DECT200, welche 10A ab kann. Diese habe ich dann per Zeitschaltuhr immer wochentags ab 6:30 eingeschalten.

Problem: Natürlich ging das an auch wenn ich nicht im Büro war, oder war aus wenn ich früher da war.

Darum habe ich mir ein weiteres Python Script geschrieben, damit beim Hochfahren des Rechners auch gleich diese Steckdose angeht. Die Steckdose hat eine Funktion welche automatisch abschaltet bei einer angegebenen Leistung & Zeit. Somit wenn der Rechner aus ist schaltet auch die Steckdose aus. Das merkt man sehr, da Geräte wie Monitor usw. in Standby gehen. Denn der Laptop lädt natürlich weiter und hängt nicht an der Dose.

Verwendet habe ich die Library PyDect200, schön einfach…

Zusätzlich zum Schreibtisch wird auch mein Aquarium im Büro eingeschaltet, ausschalten dann weiterhin über Zeitschaltuhr. Denn mal ehrlich, die Fische sollen auch arbeiten wenn ich im Büro bin :^)

#############################################################################
# OfficeSpace
#############################################################################

#!/usr/bin/env python
# -- coding: utf-8 --
from __future__ import (absolute_import, division,
                        print_function, unicode_literals)
import time


print("Init...")
try:
        from PyDect200 import PyDect200
except:
        print(u'PyDect200 is not installed!')
        print(u'run: pip install PyDect200')
        exit()
import getpass

try:
    PyDect200.__version__
except:
    PyDect200 = PyDect200.PyDect200

fritzbox_pw = "passwordOfFritzbox"
aquarium_id = "123"
buro_id = "456"

print("Devices:")
f = PyDect200(fritzbox_pw)
device_names = f.get_device_names()
print(device_names)

print("Switching on...")
f.switch_onoff(aquarium_id,1)
f.switch_onoff(buro_id,1)

print("Finished")
Von |2016-10-14T07:24:02+02:002016-10-17|Home Automation, Python|
Nach oben